公司动态

机械臂如何避障绕障?mujoco-learning中OMPL RRT路径规划完全指南

📅 2026/8/25 9:29:49
机械臂如何避障绕障?mujoco-learning中OMPL RRT路径规划完全指南
机械臂如何避障绕障mujoco-learning中OMPL RRT路径规划完全指南【免费下载链接】mujoco-learning项目地址: https://gitcode.com/gh_mirrors/mu/mujoco-learning 机械臂避障为什么需要路径规划mujoco-learning是一个基于 MuJoCo 的机器人学习开源项目其中用OMPL RRTRRTConnect算法实现了机械臂关节空间的避障、绕障路径规划并提供可交互的可视化仿真。直接让机械臂从 A 位姿插值到 B 位姿中间关节很容易撞上桌子、障碍物甚至自己的躯干。路径规划要回答的问题是在关节空间中找出一条全程不碰撞的关节角序列让末端执行器安全地从起点绕到终点。MuJoCo 中的机器人仿真场景机械臂需要在充满障碍物的工作空间中安全运动 本指南聚焦两个核心脚本rrt_obstacle.py完整流程——IK 求起点/终点 → RRTConnect 避障规划 → 逐步执行path_plan_ompl_rrtconnect.py最小示例——给定两个关节角直接 RRTConnect 规划 RRT 与 RRTConnect绕障原理 3 分钟讲清RRTRapidly-exploring Random Tree快速扩展随机树的核心思想非常直观从起点出发在关节空间内不断随机采样新点找到离它最近的已有节点朝它扩展一小步新点如果无碰撞通过 MuJoCo 碰撞检测判定就保留否则丢弃树不断生长直到碰到终点。RRTConnect是它的加速版从起点和终点同时生长两棵树相遇即成路径。对从当前位姿绕障去目标这类双向任务收敛速度比单向 RRT 快得多所以项目中选用了它。 快速开始环境安装步骤项目已用uv管理好依赖安装只需两步git clone https://gitcode.com/gh_mirrors/mu/mujoco-learning cd mujoco-learning uv syncuv sync会自动安装 pyproject.toml 中的 mujoco、ompl、numpy 等全部依赖。 若 rrt_obstacle.py 使用 IK 求解器还需按 README 中的可选步骤编译带 CasADi 的 Pinocchiobash scripts/install_pinocchio.sh。 代码拆解rrt_obstacle.py 的完整避障流程打开 rrt_obstacle.py整个流程由 4 步组成正好对应求位姿 → 建空间 → 避障规划 → 执行。第 1 步IK 求解起点与终点关节角getBipolarJointsrunBefore中设定了末端目标位置示例中为0.4, 0.3, 0.4脚本调用 src/pinocchio_kinematic.py 中的Kinematics.ik()做逆运动学把末端想去哪里翻译成每个关节应该转到多少得到start_dof和goal_dof。第 2 步建立带关节限位的状态空间pathPlaningstate_space ob.RealVectorStateSpace(self.model.nq) bounds ob.RealVectorBounds(self.model.nq) for i in range(min(self.model.nq, self.model.jnt_range.shape[0])): bounds.setLow(i, self.model.jnt_range[i, 0]) bounds.setHigh(i, self.model.jnt_range[i, 1]) state_space.setBounds(bounds)这一段把 MuJoCo 模型中每个关节的物理限位jnt_range交给 OMPL 的RealVectorStateSpace——采样永远发生在合法关节范围内这是绕障的第一道保险。第 3 步碰撞检测器——避障的灵魂def is_state_valid(state): self.data.qpos[:7] [state[i] for i in range(7)] mujoco.mj_step(self.model, self.data) return self.data.ncon 0这是整个项目最关键的一段把候选关节角写进 MuJoCo前向仿真一步然后检查data.ncon当前接触对数量是否为 0。✅ 没有碰撞 → 状态合法节点保留 ❌ 碰到障碍物/地面/自身 → 状态非法节点丢弃RRT 的绕障能力本质上就是这个验证器在成千上万次采样中反复筛选的结果。第 4 步RRTConnect 求解与路径执行planner og.RRTConnect(si) planner.setRange(0.01) # 每次扩展步长 planner.setIntermediateStates(True) # 输出中间密集路径点 planner.setProblemDefinition(pdef) solved planner.solve(3.0) # 最多 3 秒求解成功后runFunc每帧把路径点写回qpos机械臂就沿这条绕开障碍物的轨迹运动按下↓键还能随机生成新任务重新规划。⚙️ 3 个关键参数调优setRange / setIntermediateStates / timeout参数作用调优建议planner.setRange(x)每次向随机点扩展的最大步长越小路径越平滑、越安全但规划越慢示例用0.01planner.setIntermediateStates(True)输出树节点之间的中间路径点执行时更顺滑推荐开启planner.solve(timeout)规划超时时间复杂场景可调大实时场景调小并配合重试另外rrt_obstacle.py 在createTask中做了10 次重试RRT 是基于随机采样的算法单次失败不代表无解重试是标准做法。 障碍物从哪来动态添加障碍物rrt_obstacle.py 启动时会调用addObstacles()向模型动态注入一个半径 0.06 的球形障碍位于机械臂运动路径上self.obstacles_type.append(sphere) self.obstacles_size.append([0.06]) self.obstacles_pos.append([0.3, 0.2, 0.5])它的实现在 src/mujoco_viewer.py 的addObstacles方法中直接解析场景 XML 的worldbody插入带contype1 conaffinity1 mass0.0的geom节点——质量设为 0 保证障碍是静态的contype/conaffinity 设为 1 保证参与碰撞计算这两点缺一不可。如果想要更多、更随机的障碍项目还提供了 add_random_obstacles.py在工作空间内随机生成 N 个球体障碍。生成的场景 XML如 model/franka_emika_panda/scene_with_obstacles.xml可直接作为规划场景使用。⚖️ 两个脚本怎么选对比项path_plan_ompl_rrtconnect.pyrrt_obstacle.py起终点直接写死关节角先 IK 从末端位置解出关节角障碍物依赖场景 XML 自带运行时动态添加球形障碍路径优化目标无启用PathLengthOptimizationObjective路径长度优化适合场景入门理解 RRT完整的避障绕障工程流程项目里还有进阶方案path_plan_pyroboplan_rrt.py 用 PyRoboPlan 库做 RRT 轨迹优化适合追求平滑轨迹的场景可作下一步学习。 避障常见失败排查清单No solution found.起点或终点本身就是碰撞状态超时太短。→ 先单独验证起终点ncon 0再调大 timeout 并多重试几次。规划成功但手臂仍撞障碍多半是障碍物geom少了contype1 conaffinity1碰撞根本没开。路径抖/不平滑setRange太大或没开setIntermediateStates。→ 调小 range如 0.01、开启中间状态。规划极慢setRange太小导致扩展太碎。→ 适当放大或缩小工作空间限位范围。IK 解不合理导致绕大圈IK 是多解问题。→ 换随机初值重试或结合关节限位筛选解。 总结mujoco-learning 用不到 200 行代码展示了一条机械臂避障路径规划的完整链路末端目标 → Pinocchio IK 解出关节角 → OMPL RRTConnect 在关节空间随机采样 → MuJoCo 碰撞检测筛选无碰撞节点 → 得到避障路径 → 逐点执行核心结论只有三条状态空间用关节限位约束、合法性用 MuJoCo 的ncon判定、参数用 range 超时 重试组合调。读懂 rrt_obstacle.py你就能把这套避障框架迁移到任意 MuJoCo 机器人模型上。【免费下载链接】mujoco-learning项目地址: https://gitcode.com/gh_mirrors/mu/mujoco-learning创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考