3. MoveIt配置助手(Setup Assistant)

好,咱们进入正题。配置助手,说白了就是MoveIt的“初始化向导”。你想想看,一个机器人模型导进来,关节在哪、哪些能动、末端夹爪怎么定义,总得有个工具帮你把这些信息告诉MoveIt吧?配置助手就是干这个的。

我个人习惯是,拿到一个新机器人URDF,第一件事就是跑一遍配置助手。哪怕后面要手动调参数,也得先让它生成一份“标准答案”出来,再在这个基础上改。这比自己从头写配置要靠谱得多。

核心流程速览

启动助手 → 加载URDF → 添加碰撞矩阵 → 定义规划组 → 设置预定义位姿 → 配置末端执行器 → 生成配置文件包

启动助手 加载URDF 碰撞矩阵 规划组定义 位姿/末端 生成配置 配置助手工作流程(从左到右,最后生成配置包)

3.1 启动配置助手

启动方式很简单,终端里敲一行命令就行:

roslaunch moveit_setup_assistant setup_assistant.launch

嗯,这里要注意。如果你用的是ROS Noetic或者Melodic,这条命令基本都能跑起来。但如果你是自己编译的MoveIt,记得先source一下工作空间。我曾经遇到过一上午都在报错,最后发现是忘了source——这种低级错误,说出来都是泪。

启动后你会看到一个图形界面。左边是功能列表,右边是操作区。第一次用的话,选“Create New MoveIt Configuration Package”。

3.2 加载机器人模型

这一步要提供你的URDF文件。点击“Browse”找到你的机器人描述文件。我个人建议,URDF里最好把所有的link和joint都定义清楚,别偷懒。因为后面碰撞矩阵和规划组都要基于这些信息。

加载成功后,界面会显示机器人的树状结构。你可以展开看看每个link和joint。如果这里显示不全,那说明URDF本身有问题,先回去改URDF,别急着往下走。

小技巧:URDF文件路径不要包含中文或空格。我见过有人把文件放在“桌面/新建文件夹”里,结果死活加载不出来。ROS对中文路径的支持……嗯,你懂的。

3.3 添加碰撞矩阵

碰撞矩阵,说白了就是告诉MoveIt:“哪些零件之间不用检查碰撞”。

为什么要有这个?你想想看,一个机器人几十个link,如果每两个link之间都要做碰撞检测,那计算量就太大了。实际上,很多link之间永远不会碰到,比如左臂和右腿——除非你的机器人会打结。

配置助手会自动生成一个默认的碰撞矩阵。它会检查每对link,如果它们之间距离足够远,就标记为“never colliding”。我个人习惯是,先接受默认设置,然后手动检查几对关键的link。

比如,我曾经做一个六轴机械臂项目,默认碰撞矩阵把相邻的两个关节link标记成了“default”。结果运动规划时老是报错,说路径上有碰撞。后来发现,这两个link在特定姿态下确实会干涉——默认矩阵没考虑到这种情况。所以,关键部位的碰撞对,建议手动确认一遍。

3.4 规划组(Planning Groups)定义

规划组,是MoveIt里最核心的概念之一。它定义了一组joint和link,告诉MoveIt:“这些零件组成一个整体,你可以控制它们一起运动”。

举个例子,一个六轴机械臂,从基座到末端,有6个关节。你可以把这6个关节定义成一个规划组,叫“arm_group”。这样,当你给MoveIt下达“移动到位置A”的指令时,它会自动计算这6个关节的角度。

配置助手里,点击“Add Group”来创建规划组。你需要填写:

参数 说明 我的建议
Group Name 规划组名称 用英文,别用拼音。比如“left_arm”而不是“zuobi”
Kinematic Solver 运动学求解器 新手选KDL,稳定。高级用户可以用TRAC-IK
Group Type 规划组类型 机械臂选“Kinematic Chain”,夹爪选“End Effector”
Joints 包含的关节 按顺序选,从基座到末端

定义好规划组后,配置助手会自动生成运动学链。你可以点击“Preview”看看效果。如果机械臂的末端能自由运动,说明定义对了。

避坑指南:我曾经在定义规划组时,把关节顺序搞反了。结果运动学求解出来的姿态完全不对,机械臂像抽风一样乱动。检查了半天才发现,joint的顺序应该是从基座到末端,而不是从末端到基座。这个顺序问题,新手特别容易犯。

3.5 预定义位姿(Poses)

预定义位姿,就是给机器人存几个“常用姿势”。比如“home”位姿(机械臂竖直向上)、“fold”位姿(折叠收纳)、“pick”位姿(抓取姿态)。

配置助手里,选中一个规划组,然后拖动关节滑块到目标位置,点击“Save Pose as...”命名保存。我个人习惯是,至少保存三个位姿:

  • home:机器人启动时的安全姿态
  • vertical:机械臂竖直向上,方便测量
  • ready:工作前的准备姿态

为什么要存这些?因为在实际控制中,你经常需要让机器人回到某个固定姿态。比如每次启动时先回到home位姿,再开始工作。如果没有预定义位姿,你就得手动输入6个关节角度——又麻烦又容易出错。

3.6 配置末端执行器(End Effector)

末端执行器,就是机器人手臂末端装的那个东西。可能是夹爪、吸盘、焊枪,或者摄像头。配置助手需要你告诉它:末端执行器挂在哪个link上,属于哪个规划组。

操作步骤:

  1. 点击“End Effectors”标签
  2. 点击“Add End Effector”
  3. 填写名称,比如“gripper”
  4. 选择父组(Parent Group),比如“arm_group”
  5. 选择父link(Parent Link),就是末端执行器安装的那个link

这里有个细节:末端执行器本身也可以是一个规划组。比如夹爪有两个手指,每个手指有一个关节,那你可以把夹爪定义成一个独立的规划组,类型选“End Effector”。这样MoveIt就知道,夹爪的关节和手臂的关节是分开控制的。

经验之谈:如果你用的是标准夹爪,配置助手里可以勾选“Attached as a separate group”。这样生成的配置会更清晰。我早期做项目时没勾这个,结果夹爪和手臂混在一起,调试起来特别麻烦。

3.7 生成配置文件

所有配置都完成后,点击“Generate Package”按钮。配置助手会问你保存路径和包名。我建议包名用“机器人名_moveit_config”这种格式,比如“panda_moveit_config”。这样一看就知道是哪个机器人的配置。

生成成功后,你会得到一个完整的ROS功能包,里面包含:

  • config/:各种配置文件,如joint_limits.yaml、kinematics.yaml
  • launch/:启动文件,如demo.launch、planning_context.launch
  • srdf/:语义描述文件,记录了碰撞矩阵、规划组等信息

嗯,到这里,配置助手的工作就完成了。你可以用roslaunch your_robot_moveit_config demo.launch来测试一下。如果一切正常,你会看到Rviz里出现了你的机器人模型,并且可以拖动交互标记来规划运动。

我记得第一次成功跑通demo.launch时,看到机械臂在Rviz里跟着我的鼠标动,那种成就感……嗯,你到时候也会有的。