MuJoCo 机械臂关节路径规划+轨迹优化+末端轨迹可视化(附代码)

视频讲解:

MuJoCo 机械臂关节路径规划+轨迹优化+末端轨迹可视化(附代码)

今天的实验测试目标就是随机给定两个关节空间位置,使用pyroboplan进行路径规划和轨迹优化,

完整代码仓库:https://github.com/LitchiCheng/mujoco-learning

参考示例:https://github.com/sea-bass/pyroboplan/blob/main/examples/optimize_rrt_path.py

生成start和goal的随机关节空间位置

复制代码
q_start = self.random_valid_state() 
q_goal = self.random_valid_state()

使用RRT规划器进行路径规划

复制代码
planner = RRTPlanner(model, collision_model, options=options)

使用三次多项式轨迹优化器进行优化

复制代码
optimizer = CubicTrajectoryOptimization(model, collision_model, options)

末端轨迹可以用matplotlib画一下

复制代码
# 提取位置信息
positions = []
for tform in tforms:
    position = tform.translation
    positions.append(position)

positions = np.array(positions)

# 创建 3D 图形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 绘制位置轨迹
ax.plot(positions[:, 0], positions[:, 1], positions[:, 2], marker='o')

# 绘制姿态
for i, tform in enumerate(tforms):
    position = tform.translation
    rotation_matrix = tform.rotation
    # 提取坐标轴方向的向量
    x_axis = rotation_matrix[:, 0]
    y_axis = rotation_matrix[:, 1]
    z_axis = rotation_matrix[:, 2]
    # 绘制坐标轴向量
    ax.quiver(position[0], position[1], position[2],
              x_axis[0], x_axis[1], x_axis[2], color='r', length=0.1)
    ax.quiver(position[0], position[1], position[2],
              y_axis[0], y_axis[1], y_axis[2], color='g', length=0.1)
    ax.quiver(position[0], position[1], position[2],
              z_axis[0], z_axis[1], z_axis[2], color='b', length=0.1)

# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 显示图形
plt.show(block=False)
plt.pause(0.001)

使用mujoco viewer进行仿真的完整代码

复制代码
import mujoco_viewer
import mujoco,time,threading
import numpy as np
import pinocchio
import matplotlib
# matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from pyroboplan.core.utils import (
    get_random_collision_free_state,
    extract_cartesian_poses,
)
from pyroboplan.models.panda import (
    load_models,
    add_self_collisions,
    add_object_collisions,
)
from pyroboplan.planning.rrt import RRTPlanner, RRTPlannerOptions
from pyroboplan.trajectory.trajectory_optimization import (
    CubicTrajectoryOptimization,
    CubicTrajectoryOptimizationOptions,
)

class Test(mujoco_viewer.CustomViewer):
    def __init__(self, path):
        super().__init__(path, 3, azimuth=180, elevation=-30)
        self.path = path
    
    def runBefore(self):
        # Create models and data
        self.model_roboplan, self.collision_model, visual_model = load_models(use_sphere_collisions=True)
        add_self_collisions(self.model_roboplan, self.collision_model)
        add_object_collisions(self.model_roboplan, self.collision_model, visual_model, inflation_radius=0.1)

        data = self.model_roboplan.createData()
        collision_data = self.collision_model.createData()

        self.target_frame = "panda_hand"
        ignore_joint_indices = [
            self.model_roboplan.getJointId("panda_finger_joint1") - 1,
            self.model_roboplan.getJointId("panda_finger_joint2") - 1,
        ]
        np.set_printoptions(precision=3)
        self.distance_padding = 0.001

        self.init_state = self.data.qpos.copy()

        while True:            
            q_start = self.random_valid_state()
            q_goal = self.random_valid_state()

            # Search for a path
            options = RRTPlannerOptions(
                max_step_size=0.05,
                max_connection_dist=5.0,
                rrt_connect=False,
                bidirectional_rrt=True,
                rrt_star=True,
                max_rewire_dist=5.0,
                max_planning_time=20.0,
                fast_return=True,
                goal_biasing_probability=0.15,
                collision_distance_padding=0.01,
            )
            print("")
            print(f"Planning a path...")
            planner = RRTPlanner(self.model_roboplan, self.collision_model, options=options)
            q_path = planner.plan(q_start, q_goal)
            if len(q_path) > 0:
                print(f"Got a path with {len(q_path)} waypoints")
            else:
                print("Failed to plan.")

            # Perform trajectory optimization.
            dt = 0.025
            options = CubicTrajectoryOptimizationOptions(
                num_waypoints=len(q_path),
                samples_per_segment=7,
                min_segment_time=0.5,
                max_segment_time=10.0,
                min_vel=-1.5,
                max_vel=1.5,
                min_accel=-0.75,
                max_accel=0.75,
                min_jerk=-1.0,
                max_jerk=1.0,
                max_planning_time=30.0,
                check_collisions=True,
                min_collision_dist=self.distance_padding,
                collision_influence_dist=0.05,
                collision_avoidance_cost_weight=0.0,
                collision_link_list=[
                    "obstacle_box_1",
                    "obstacle_box_2",
                    "obstacle_sphere_1",
                    "obstacle_sphere_2",
                    "ground_plane",
                    "panda_hand",
                ],
            )
            print("Optimizing the path...")
            optimizer = CubicTrajectoryOptimization(self.model_roboplan, self.collision_model, options)
            traj = optimizer.plan([q_path[0], q_path[-1]], init_path=q_path)

            if traj is None:
                print("Retrying with all the RRT waypoints...")
                traj = optimizer.plan(q_path, init_path=q_path)

            if traj is not None:
                print("Trajectory optimization successful")
                traj_gen = traj.generate(dt)
                self.q_vec = traj_gen[1]
                print(f"path has {self.q_vec.shape[1]} points")
                tforms = extract_cartesian_poses(self.model_roboplan, "panda_hand", self.q_vec.T)
                # 提取位置信息
                positions = []
                for tform in tforms:
                    position = tform.translation
                    positions.append(position)

                positions = np.array(positions)

                # 创建 3D 图形
                fig = plt.figure()
                ax = fig.add_subplot(111, projection='3d')

                # 绘制位置轨迹
                ax.plot(positions[:, 0], positions[:, 1], positions[:, 2], marker='o')

                # 绘制姿态
                for i, tform in enumerate(tforms):
                    position = tform.translation
                    rotation_matrix = tform.rotation
                    # 提取坐标轴方向的向量
                    x_axis = rotation_matrix[:, 0]
                    y_axis = rotation_matrix[:, 1]
                    z_axis = rotation_matrix[:, 2]
                    # 绘制坐标轴向量
                    ax.quiver(position[0], position[1], position[2],
                            x_axis[0], x_axis[1], x_axis[2], color='r', length=0.01)
                    ax.quiver(position[0], position[1], position[2],
                            y_axis[0], y_axis[1], y_axis[2], color='g', length=0.01)
                    ax.quiver(position[0], position[1], position[2],
                            z_axis[0], z_axis[1], z_axis[2], color='b', length=0.01)

                # 设置坐标轴标签
                ax.set_xlabel('X')
                ax.set_ylabel('Y')
                ax.set_zlabel('Z')

                # 显示图形
                plt.show(block=False)
                plt.pause(0.001)
                break
        
        self.index = 0
        

    def random_valid_state(self):
        return get_random_collision_free_state(
            self.model_roboplan, self.collision_model, distance_padding=0.01
        )

    def runFunc(self):
        self.data.qpos[:7] = self.q_vec[:7, self.index]
        self.index += 1
        if self.index >= self.q_vec.shape[1]:
            self.index = 0
        time.sleep(0.01)

if __name__ == "__main__":
    test = Test("/home/dar/MuJoCoBin/mujoco_menagerie/franka_emika_panda/scene.xml")
    test.run_loop()
相关推荐
牛客企业服务20 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
视觉语言导航1 小时前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
**梯度已爆炸**1 小时前
自然语言处理入门
人工智能·自然语言处理
ctrlworks1 小时前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
BFT白芙堂2 小时前
睿尔曼系列机器人——以创新驱动未来,重塑智能协作新生态(上)
人工智能·机器学习·机器人·协作机器人·复合机器人·睿尔曼机器人
aneasystone本尊2 小时前
使用 MCP 让 Claude Code 集成外部工具
人工智能
静心问道2 小时前
SEW:无监督预训练在语音识别中的性能-效率权衡
人工智能·语音识别
羊小猪~~2 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
xwz小王子2 小时前
从LLM到WM:大语言模型如何进化成具身世界模型?
人工智能·语言模型·自然语言处理
我爱一条柴ya2 小时前
【AI大模型】深入理解 Transformer 架构:自然语言处理的革命引擎
人工智能·ai·ai作画·ai编程·ai写作