Post

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

Alt text
选择Create New MoveIt Configuration Package 点击Browse按钮,定位到机器人的urdf文件(或者xacro文件)
Alt text

生成自碰撞矩阵

默认的自碰撞矩阵生成器可以搜索不必要的碰撞检查。比如,如果两个link之间总是碰撞的、永远不会碰撞、在机器人默认位姿处会碰撞、处于相邻位置时,这两个link的碰撞检查都会被禁用,以节约计算资源。
采样密度(sampling density)的默认值为10000,是指采用多少个随机的位姿来检测自碰撞。更高的采样密度需要更长的计算时间,而过低的采样密度可能会忽略掉一些本应出现的碰撞。为了节约时间,碰撞检查的计算是并行的。
点击左侧的Self-Collisions按钮,然后点击Generate Collision Matrix按钮,等待自碰撞计算完成
Alt text
Alt text

添加虚拟关节

虚拟关节用于将机器人固定在世界环境中。定义一个虚拟关节,以连接link0和世界坐标系

  • 点击左侧Virtual Joints面板按钮,选择Add Virtual Joint
  • 定义虚拟关节名称为virtual_joint
  • 设置child linkbase_link,parent frame为world
  • 设置关节类型为fixed
  • 点击save

Alt text
type类型

  • Fixed: 固定基座
  • Floating: 浮动基座
  • Planar: 平面移动

添加规划组

规划组(Planning groups)用来指定机器人的不同部分。

  • 点击左侧Planning Groups面板按钮
  • 选择Add Group

Alt text

  • 输入Group Namearm
  • 选择kdl_kinematics_plugin/KDLKinematicsPlugin 作为运动学求解器。使用自定义IK求解器,详见Kinematics/IKFast
  • 保持其余选项不变
  • 点击Add Joints按钮。在左侧,将会显示所有关节,选择手臂部分所属的关节,添加到右侧

Alt text

  • 点击Save存储规划组

Alt text
手爪同理

运动学求解器

  • 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不变

Alt text

添加被动关节

被动关节(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规划组,将其添加到右侧

Alt text
手爪同理

Gazebo仿真

仿真功能可以在Gazebo中进行仿真。在此可以生成一个兼容Gazebo的新urdf文件
Alt text

3D感知

3D感知功能可以在sensors_3d.yaml文件中配置与3D传感器相关的参数。
例如:点云(point_cloud)参数
Alt text

更多关于此参数的设置可以见tutorial

不需要进行3D感知,设置为None

添加作者信息

  • 点击Author Information面板按钮
  • 输入姓名和邮箱

生成配置文件

点击Configuration Files选项,为Moveit功能包设置保存位置和名称,位置要精确到功能包目录。
例如:

1
~/catkin_ws/src/panda_moveit_config

点选需要创建的配置文件。点击Generate Package按钮,等待功能包创建完成

后续处理

生成配置文件后,有地方需要手动修改
1、检查urdf模型文件的最后,是否缺少filename="libgazebo_ros_control.so" Alt text
缺少该内容会导致在调用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文件名后,其CMakeListspackage.xmllaunch文件夹内所有文件urdf文件夹内的urdf文件都需要同步修改

一键改名脚本

脚本下载后放置于urdf文件包中,需要修改的名称默认为脚本所在文件夹名称

Moveit配置包详解

  • config文件
    • fake_controllers.yaml: 虚拟控制器配置文件,方便在没有实体机器人或者模拟器的情况下运行moveit
    • joint_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`: 无逆运动学解
This post is licensed under CC BY 4.0 by the author.