Moveit
Moveit相关笔记
Moveit开发环境配置
安装moveit
1
sudo apt install ros-noetic-moveit
安装ros控制器包
1
sudo apt-get install ros-noetic-ros-control ros-noetic-ros-controllers
安装运动学控制器
1
2
sudo apt-get install ros-noetic-trac-ik
sudo apt-get install ros-noetic-moveit-kinematics
生成urdf文件
激活moveit环境
1
2
mkdir -p catkin_ws/src
cd ~/catkin_ws
将从solidworks导出的文件放入工作空间中,然后
1
2
catkin_make
source ./devel/setup.zsh
启动MoveIt Setup Assistant
1
roslaunch moveit_setup_assistant setup_assistant.launch
开始菜单会有两个选项
- Create New MoveIt Configuration Package
- Edit Existing MoveIt Configuration Package
选择Create New MoveIt Configuration Package
点击Browse
按钮,定位到机器人的urdf文件(或者xacro文件)
生成自碰撞矩阵
默认的自碰撞矩阵生成器可以搜索不必要的碰撞检查。比如,如果两个link之间总是碰撞的、永远不会碰撞、在机器人默认位姿处会碰撞、处于相邻位置时,这两个link的碰撞检查都会被禁用,以节约计算资源。
采样密度(sampling density)的默认值为10000,是指采用多少个随机的位姿来检测自碰撞。更高的采样密度需要更长的计算时间,而过低的采样密度可能会忽略掉一些本应出现的碰撞。为了节约时间,碰撞检查的计算是并行的。
点击左侧的Self-Collisions
按钮,然后点击Generate Collision Matrix
按钮,等待自碰撞计算完成
添加虚拟关节
虚拟关节用于将机器人固定在世界环境中。定义一个虚拟关节,以连接link0和世界坐标系
- 点击左侧
Virtual Joints
面板按钮,选择Add Virtual Joint
- 定义虚拟关节名称为
virtual_joint
- 设置
child link
为base_link
,parent frame为world
。 - 设置关节类型为
fixed
- 点击
save
- Fixed: 固定基座
- Floating: 浮动基座
- Planar: 平面移动
添加规划组
规划组(Planning groups)用来指定机器人的不同部分。
- 点击左侧
Planning Groups
面板按钮 - 选择
Add Group
- 输入
Group Name
为arm
- 选择
kdl_kinematics_plugin/KDLKinematicsPlugin
作为运动学求解器。使用自定义IK求解器,详见Kinematics/IKFast - 保持其余选项不变
- 点击
Add Joints
按钮。在左侧,将会显示所有关节,选择手臂部分所属的关节,添加到右侧
- 点击
Save
存储规划组
运动学求解器
- KDL: 默认的运动学求解器,用于求解机器人的正逆运动学问题
- TRAC-IK: 基于数值解的运动学插件,专注于实时运动规划,提供快速求解速度和高稳定性
- IKFAST: 基于解析算法的运动学插件,生成高度优化的机器人特定运动学求解器
- Analytical Inverse Kinematics:通过代数公式直接求解逆运动学
添加预置机器人位姿
可以在配置文件中添加一些常用的位姿,使用时可以直接指定位姿的名称,而不用再指定具体的关节角度。
- 点击左侧
Robot Poses
面板按钮 - 点击
Add Pose
。将所有所有关节角设为0,定义此时的位姿为home
,点击保存。也可以为机器人添加更多的位姿,或者为其余的规划组(如hand)添加位姿。
标记末端执行器
已经为机械臂添加了手爪规划组。现在,将手爪规划组设置为特殊的组end effector
。这样,Moveit在执行某些操作时才能顺利地进行识别。
- 点击左侧
End Effectors
面板按钮 - 点击
Add End Effector
- 输入
hand
作为End Effector Name
- 选择
hand
组作为End Effector Group
- 选择手爪所属关节作为末端执行器的
Parent Link
Parent Group
不变
添加被动关节
被动关节(passive joints)是指机器人中可能存在的不需要驱动的关节,比如车辆的万向轮。被指定为被动关节后,规划器就不会对这个关节的运动进行规划和控制。不存在被动关节可以跳过此步骤。
Control
ROS Control是一系列十分常用的与机器人控制相关的功能包,详见ros_control
ROS Control功能可以生成用于驱动机器人的仿真控制器。这将有助于打通ROS和Moveit
- 点击
Add Controller
- 在
Controller Name
输入arm_position_controller
- 选择控制器类型为
position_controllers/JointPositionController
- 接下来添加需要控制的关节,既可以单独添加,也可以规划组成组添加。选择成组添加
Add Planning Group Joints
- 选择
arm
规划组,将其添加到右侧
Gazebo仿真
仿真功能可以在Gazebo中进行仿真。在此可以生成一个兼容Gazebo的新urdf文件
3D感知
3D感知功能可以在sensors_3d.yaml
文件中配置与3D传感器相关的参数。
例如:点云(point_cloud)参数
更多关于此参数的设置可以见tutorial
不需要进行3D感知,设置为None
添加作者信息
- 点击
Author Information
面板按钮 - 输入姓名和邮箱
生成配置文件
点击Configuration Files
选项,为Moveit功能包设置保存位置和名称,位置要精确到功能包目录。
例如:
1
~/catkin_ws/src/panda_moveit_config
点选需要创建的配置文件。点击Generate Package
按钮,等待功能包创建完成
后续处理
生成配置文件后,有地方需要手动修改
1、检查urdf模型文件的最后,是否缺少filename="libgazebo_ros_control.so"
缺少该内容会导致在调用gazebo时报以下错误
1
2
3
4
5
Error [parser.cc:488] parse as old deprecated model file failed.
Error Code 4 Msg: Required attribute[filename] in element[plugin] is not specified in SDF.
Error Code 8 Msg: Error reading element <plugin>
Error Code 8 Msg: Error reading element <model>
Error Code 8 Msg: Error reading element <sdf>
2、添加dummy link
在urdf模型文件开头,将
1
2
3
<link name="base_link">
...
</link>
改为
1
2
3
4
5
6
7
8
<link name="world"/>
<link name="base_link">
...
</link>
<joint name="world" type="fixed">
<parent link="world"/>
<child link="base_link"/>
</joint>
即在原先的虚拟关节前后添加一个link和一个joint
缺少该内容会导致在调用gazebo时报以下警告,并且rviz无法和gazebo联动
1
The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF
有关urdf文件的参数解释详看gazebo
写在最后
为了保证项目文件清晰,建议将导出的urdf文件包命名为<project_name>_description
,将生成的配置文件包命名为<project_name>_moveit_config
,将程序文件包命名为<project_name>_planning
正常来说,更改导出的urdf文件名后,其CMakeLists
、package.xml
、launch文件夹内所有文件
、urdf文件夹内的urdf文件
都需要同步修改
脚本下载后放置于urdf文件包中,需要修改的名称默认为脚本所在文件夹名称
Moveit配置包详解
- config文件
fake_controllers.yaml
: 虚拟控制器配置文件,方便在没有实体机器人或者模拟器的情况下运行moveitjoint_limits.yaml
: 记录机器人各个关节的位置速度加速度的极限kinematics.yaml
: 用于初始化运动学求解库<project_name>_description.srdf
: moveit配置文件ompl_planning.yaml
: OMPL各种算法的各种参数。
- launch文件
demo.launch
: 运行的总结点move_group.launch
: 配置器人的运动规划和执行planning_context.launch
: 定义所使用的urdf和srdf文件,以及运动学求解库setup_assistant.launch
: 更改配置
Moveit编程
moveit::core::MoveItErrorCode
错误码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 总体行为
`SUCCESS = 1`: 规划成功
`FAILURE = 99999`: 未指明的失败
`PLANNING_FAILED = -1`: 运动规划失败
`INVALID_MOTION_PLAN = -2`: 无效的运动计划
`MOTION_PLAN_INVALIDATED_BY_ENVIRONMENT_CHANGE = -3`: 由于环境变化,运动计划失效
`CONTROL_FAILED = -4`: 控制失败
`UNABLE_TO_AQUIRE_SENSOR_DATA = -5`: 无法获取传感器数据
`TIMED_OUT = -6`: 规划超时
`PREEMPTED = -7`: 规划被中断或抢占
# 计划& 运动学请求错误
`START_STATE_IN_COLLISION = -10`: 起始状态与其他对象发生碰撞。
`START_STATE_VIOLATES_PATH_CONSTRAINTS = -11`: 起始状态违反路径约束
`START_STATE_INVALID = -26`: 起始状态无效
`GOAL_IN_COLLISION = -12`: 目标状态与其他对象发生碰撞
`GOAL_VIOLATES_PATH_CONSTRAINTS = -13`: 目标状态违反路径约束
`GOAL_CONSTRAINTS_VIOLATED = -14`: 违反目标约束
`GOAL_STATE_INVALID = -27`: 目标状态无效
`UNRECOGNIZED_GOAL_TYPE = -28`: 无法识别的目标类型
`INVALID_GROUP_NAME = -15`: 无效的组名
`INVALID_GOAL_CONSTRAINTS = -16`: 无效的目标约束
`INVALID_ROBOT_STATE = -17`: 无效的机器人状态
`INVALID_LINK_NAME = -18`: 无效的连接名
`INVALID_OBJECT_NAME = -19`: 无效的对象名
# 系统错误
`FRAME_TRANSFORM_FAILURE = -21`: 坐标系转换失败
`COLLISION_CHECKING_UNAVAILABLE = -22`: 碰撞检测不可用
`ROBOT_STATE_STALE = -23`: 机器人状态过时
`SENSOR_INFO_STALE = -24`: 传感器信息过时
`COMMUNICATION_FAILURE = -25`: 通信失败
`CRASH = -29`: 程序崩溃
`ABORT = -30`: 规划被中止
# 运动学错误
`NO_IK_SOLUTION = -31`: 无逆运动学解