在生成配置文件后,来写写文件包中主要文件的分析和理解,以便于精确调整参数
一、MoveIt架构理解
1.1 move_group节点
move_group是MoveIt的核心节点,是整个架构的枢纽,它有GUI用户接口,可以使用ROS参数服务器,获取和查找urdf与srdf文件
它接收用户的控制命令,接收3D视觉传感器的的深度图像或点云数据,处理生成的占据栅格地图(Occupancy Map),使用planning_pipeline中的规划器来计算出一条路径,最终发送给末端控制器
1.2 planning_pipeline
planning_pipeline是一系列规划器的集合,可以说是move_group的核心运算大脑,用户一般不会和这一层打交道,而是通过move_group作为中间者去控制
planning_pipeline集成了运动规划器(Motion Planner)与运动学求解器(Kinematics Solver),在接收move_group的指令后,根据碰撞检测(Collision Checking)返回的数据以及各规划器求解的交集,返回给move_group一个相对最优解
1.2.1运动规划器(Motion Planner)
moveit的运动规划器以插件的形式集成到系统中,并且默认使用OMPL(Open Motion Planning Library,开源运动规划库)。运动规划器可以根据运动规划请求,生成一条轨迹,让各个关节移动到目标位置
运动规划器还包括一个前处理与后处理,不详细列出了,理解就好:
前处理可以修复在起始状态或规划请求前的小范围关节超限或不符合指定的路径
后处理用于对规划器生成的路径添加速度加速度约束,即对OMPL具象可调化,或更改约束坐标系
1.2.2 运动学求解器(Kinematics Solver)
运动学求解包括正运动学(FK)与逆运动学(IK),MoveIt中运动学求解器主要指逆运动学(IK)求解器。IK可以得到机械臂目标位姿在关节空间里的关节角度,实现逆解
逆运动学求解算法以ROS插件形式集成到MoveIt中,默认使用KDL库
1.2.3 碰撞检测(Collision Checking)
MoveIt的碰撞检测通过FCL与PCD包实现
其中FCL包为刚体的的碰撞检测库,PCD为接收点云数据的碰撞检测库
碰撞检测非常消耗资源时间,所以对于永不可能发生碰撞的两个刚体无需检测,即碰撞免检矩阵(Allowed Collision Matrix,ACM),也就是之前生成配置包时遇到的设置
二、MoveIt配置功能包解析
2.1 SRDF文件
前面说过srdf在静态描述urdf文件的基础上添加了语义描述,保存了机器人的规划组、预定义位姿、虚拟关节、碰撞矩阵、末端执行器等参数,文件遵循xml格式,以下为文件解析:
- <group>标签
<group name="arm">
<chain base_link="base_link" tip_link="link6"/>
</group>
<group name="grip">
<link name="link6"/>
<joint name="joint6"/>
</group>
group标签描述了机器人的规划组信息,包括规划组名、组所包含的joint和link
上述代码定义了两个规划组arm与grip
arm组包括一个运动链,基座链接是base_link,末端链接是link6
grip组包括一个链接link6与关节joint6
- <group_state>标签
<group_state name="origin" group="arm">
<joint name="joint1" value="0.0174"/>
<joint name="joint2" value="-0.1915"/>
<joint name="joint3" value="-0.3076"/>
<joint name="joint4" value="-0.4353"/>
<joint name="joint5" value="-1.689"/>
<joint name="joint6" value="0.2264"/>
</group_state>
group_state标签描述了机器人的初始位姿信息,包括指定规划组内各关节位置信息,在生成配置文件时也可设置,value为弧度值,范围-pi~pi
- <end_effector>标签
<end_effector
name="hand" parent_link="link5" group="grip" parent_group="arm"/>
end_effector标签描述了末端执行器的内容,包括名字,父链接,所在规划组和父规划组
- <virtual_joint>标签
<virtual_joint name="virtual_joint" type="fixed"
parent_frame="world" child_link="base_link"/>
virtual_joint标签描述了虚拟关节的内容,包括名字,方式,父坐标系,相对于父坐标系的子链接(一般是基座)
- <disable_collisions>标签
<disable_collisions link1="link1" link2="link2" reason="Adjacent"/>
<disable_collisions link1="link1" link2="link3" reason="Never"/>
disable_collisions标签描述了两link间的碰撞关系,reason值中,Adjacent表示两link相邻,Never表示两link永不会发生碰撞,该项在之前配置self-collisions生成
2.2 kinematics.yaml文件
这个文件包含了运动学求解器也就是IK的设置,文件遵循yaml格式,以下是解析:
arm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.005
kinematics_solver_timeout: 0.005
goal_joint_tolerance: 0.0001
goal_position_tolerance: 0.0001
goal_orientation_tolerance: 0.001
- arm 为目标规划组名
- kinematics_solver 指运动学求解器插件器名字,这里默认用KDL插件
- kinematics_solver_search_resolution 指计算逆运动学时,在冗余度空间中(高自由度执行低自由度任务)的搜索分辨率,越高解决方案会越多,但资源耗费越多
- kinematics_solver_timeout 指每次迭代超时时间,单位为秒
2.3 joint_limits.yaml文件
这个文件用于加强urdf中joint的动力学属性,比如限位,速度,加速度。以下是解析:
arm_1_joint:
has_velocity_limits: true
max_velocity: 0.35
has_acceleration_limits: false
max_acceleration: 0
- arm_1_joint为关节名
- has_velocity_limits 速度限制开关
- has_acceleration_limits 加速度限制开关
- max_position 关节最大位置(弧度)
- mix_position 关节最小位置(弧度)
- max_velocity 关节最大速度
- max_acceleration 关节最大加速度
2.4 ompl_planning.yaml文件
这个文件保存着运动规划器的配置,OMPL运动规划库默认选择RRT算法
arm:
default_planner_config: RRT
2.5 fake_controllers.yaml文件
这个文件保存了虚拟控制器的参数设置,解析如下:
controller_list:
- name: fake_arm_controller
type: $(arg fake_execution_type)
joints:
- shoulder_pan_joint
- shoulder_pitch_joint
- elbow_roll_joint
- elbow_pitch_joint
- wrist_roll_joint
- wrist_pitch_joint
- gripper_roll_joint
- name: fake_gripper_controller
type: $(arg fake_execution_type)
joints:
- finger_joint1
- finger_joint2
- controller_list: 控制器列表
- - name: 控制器名字
- joints: 控制关节列表