经过上一节Rviz 和Gazebo联合仿真运动(一)的阅读,相信小伙伴们都能够成功导出xxx_moveit_config规划包了,但是估计还不能用,里面有一些参数需要设置,尤其是一些需要特别注意的坑,这一篇博客的目的是详细阐述如何使用导出的规划功能包。
题外话:这里讲一点题外话,就是关于上一节Rviz 和Gazebo联合仿真运动(一)中的一个虚拟关节grasping_frame到底用来干嘛的问题。详细如下:
首先,这个虚拟关节到底在哪里?看下图
这个grasping_frame虚拟关节就设置在两个夹爪之间,后面进行仿真抓取的时候使用的就是这个关节---相当重要。有的小伙伴们就会问了?你为啥不在导出URDF中就一同导出呢?问的好!我之前说过,grasping_frame它只是一个虚拟关节,不包含任何实体,故无法进行URDF的导出,只能在后面生成文件之后手动添加修改。
修改如下:
<link name="grasping_frame"/>
<joint name="grasping_frame_joint" type="fixed">
<parent link="link6"/>
<child link="grasping_frame"/>
<origin xyz="0 -0.04149 0.36965" rpy="0 -1.5708 -3.14"/>
</joint>
grasping_frame关节的父辈是link6,所以位置是相当于cordinate6的距离和旋转角度,这个距离就是y轴平移-0.04149,z轴0.36965,旋转则有说法了,就是内旋zyx的顺序,坐标轴cordinate6首先绕着自身z轴,眼睛顺着箭头方向逆时针一个π,然后绕着自身y轴逆时针一个π/2。验证的话看着上图自己试着想一下。
怎么用这个虚拟关节呢?看下图
是不是就突然明白这个虚拟关节的好处了?我将抓取点和抓取位姿设置在了这个目标物体的两柄的位置,将虚拟关节grasping_frame运动到这个位置就完成了一次抓取。所以说这个关节很重要。
不说废话了,咋们开始进入正题:
相信小伙伴们都能够成功导出如下的规划功能包了----xxx_moveit_config
这个功能包点进去长这个样子:
config包里面就是一些相关的参数,launch里面就是对应的运行文件,结构很简单,那我们如何修改呢?如下
修改步骤1:
首先修改通过moveit配置助手自动生成的urdf文件,我在上一节Rviz 和Gazebo联合仿真运动(一)的一个模块中提到如下内容:是不是叫大家点击simulation模块自动生成一个名字叫做robot2600_20_text.urdf的文件,并把内容粘贴进去?没错!先修改它
你仔细阅读一下里面的内容,配置助手为我们自动添加了两块重复的内容,所以我们要把我们自己添加的内容给删除,什么意思呢?看下图
自动添加的第一块内容是tranmission标签
上图内容是我们最开始修改为xacro文件的时候自己手动添加了,但是配置助手又为我们添加了这一块内容,所以重复了-------咋们把自己写的删除,使用助手自动添加的。----这里看仔细一点,配置助手添加的内容有的不是hardware_interface/PositionJointInterface,我们需要把它修改成这个类型。看仔细哈!
自动添加的第二块内容是
这一块我们也把自己添加的删除,使用助手自动生成的!为啥都是用自动生成的呢?因为系统比我们更严谨。
坑:提一提这里会遇到的坑
第一个坑:配置助手添加的tranmission标签有的不是hardware_interface/PositionJointInterface有的小伙伴看的不仔细,很快就忽略了,同时助手添加的又是拆散了,所以看的不仔细。
第二个坑:助手自动添加的第二块内容有一个标签是<robotNamespace>/</robotNamespace>,可以看到我只写了一个“/”反斜杠,大家不要往里面写自己机械臂的名字,只写一个反斜杠就行,为啥呢!有时候自己一疏忽就会把机械臂名字写错,导致对不上,后面运行就报错。
第三个坑:听说有的小伙伴自动生成的时候上图第二块内容不完整,既plugin标签不完整,听说有!反正我是完整的,大家检查一下!我上图就是完整的。
修改步骤2:
依次点开xxx_moveit_config功能包--launch文件夹--gazebo.launch文件,里面有一段这个路径内容,
这个就是urdf路径,把上面修改好的robot2600_20_text.urdf路径放进去,我的不叫这个名字,我的叫做robot2600_20_allin.urdf,所以大家修改一下这个路径,改成自己的!
这个时候可以自己单独运行这个gazebo.launch文件,是可以运行的!但是不能规划!(记得编译)
修改步骤3:(核心修改)
依次点开xxx_moveit_config功能包--config文件夹--ros_controllers.yaml文件,使用类型是: position_controllers/JointTrajectoryController的arm_position和gripper_position替换掉controller_list里面类型是FollowJointTrajectory的xxx_controller,如下图!
是不是难以理解?这么说吧!类型FollowJointTrajectory和类型position_controllers/JointTrajectoryController一个是发送规划消息,另一个是接受规划消息,所以他们两个名字要相同,要对应,否则无法接收!这个坑当初花费了好久好久好久才解决,网上根本搜索不到解决方法,报错得人都崩溃了!
大家可能要问,这一部分很眼熟哎!不是在规划助手中的其中一个模块有吗?没错,就是添加控制模块!这里是最狗血的,使用配置助手不能添加重名的,所以上一篇解释这个的时候可把人累死了。
贴出完整代码如下:
# Simulation settings for using moveit_sim_controllers
moveit_sim_hw_interface:
joint_model_group: robot2600_arm
joint_model_group_pose: home
# Settings for ros_control_boilerplate control loop
generic_hw_control_loop:
loop_hz: 300
cycle_time_error_threshold: 0.01
# Settings for ros_control hardware interface
hardware_interface:
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
- gripper_finger_joint_right
sim_control_mode: 1 # 0: position, 1: velocity
# Publish all joint states
# Creates the /joint_states topic necessary in ROS
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
controller_list:
- name: arm_position
action_ns: follow_joint_trajectory
default: True
type: FollowJointTrajectory
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
- name: gripper_position
action_ns: follow_joint_trajectory
default: True
type: FollowJointTrajectory
joints:
- gripper_finger_joint_right
arm_position:
type: position_controllers/JointTrajectoryController
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
gains:
joint1:
p: 100
d: 10
i: 0.01
i_clamp: 1
joint2:
p: 100
d: 10
i: 0.01
i_clamp: 1
joint3:
p: 100
d: 10
i: 0.01
i_clamp: 1
joint4:
p: 100
d: 10
i: 0.01
i_clamp: 1
joint5:
p: 100
d: 10
i: 0.01
i_clamp: 1
joint6:
p: 100
d: 10
i: 0.01
i_clamp: 1
gripper_position:
type: position_controllers/JointTrajectoryController
joints:
- gripper_finger_joint_right
gains:
gripper_finger_joint_right:
p: 100
d: 10
i: 0.01
i_clamp: 1
上面是最核心的修改:
这里有一个坑:
仔细观察所有的joints:每一个joint前面都有一个 “ - ” ,都有一个横线,这真的服了,自动生成的gripper_position里面的joint一开始没有这个横线,大家一定要仔细观察这个文件里面所有的joint,一定要添加这个横线,否则会出现joint不是一个array的错误!-------这里真的把我整无语了
最后修改:
依次点开xxx_moveit_config功能包--launch文件夹--demo_gazebo.launch文件。这个文件就是我们用来规划的主文件!
小伙伴们可能会问,这不是一个demo吗?对啊!配置助手自动给我们写了一个可用的demo,我们直接拿来用就行。可能还有人自己手写了一个类同的启动文件,比如说古月居就自己手写了一个,其实都是一样的,你打开这个demo_gazebo.launch会发现里面内容和古月居其实差不多。咋们就不用那么麻烦自己去写了,以后将damo_gazebo.launch文件当成古月居的手写启动文件就行。
修改这个文件很简单,首先修改一下urdf地址!可以和第二步一样作同样的修改。我这里还没有修改,要修改哈!
然后把里面的rviz加载节点注视掉:
这里我也是被整无语了?
如果你不注释掉,那么你就只修改到上一步,按道理其实已经完成所有的修改了,编译运行damo_gazebo.launch文件就已经能够进行运动规划了,但是你会惊奇得发现,gazebo时不时就进程死去,然后所有进程卡死!网上你绝对搜索不到解决方法,绝对!
那么正确的启动方法是什么呢?首先完成rviz注释后,那么所有修改就完成了,然后进行编译!
首先,打开终端分别运行killall gzserver和killall gzclient运行这两句什么意思呢?就是杀死上一个gazebo进程,每一次要运行gazebo的时候都要运行这个,防止gazebo进程死去的问题
其次:运行demo_gazebo.launch文件,会出现如下界面:
当出现you can start planning now那么恭喜你,可以进行规划了,这个时候还只有gazebo界面,
单独打开一个终端,输入rviz回车
Fixed Frame选择base_link,然后点集左下角的add,添加MotionPlanning模块
添加完MotionPlanning模块就会出现如下界面,你拖动规划球给机械臂一个位姿后,点击Plan & Execute规划并执行,会看到机械臂在rviz中规划轨迹了,你再转到Gazebo 中发现,Gazebo中的机械臂也跟着运动了
阅读到这里,那么恭喜你,联合运动规划的问题已经完全解决了。真是不容易啊!其中很多坑我应该已经给大家指出了,是完全经过大量大量查阅资料后总结出来的,绝对有效!
题外话:
联合运动规划方面差不多就只有这些内容了,后面因为博主是做3D点云以及机械臂碰撞规避方面的,不做运动规划算法。运动规划算法很多人做,也有很多优秀的博客。后面只会涉及到3D点云配准,碰撞规避、八叉树、生成障碍物、无碰撞抓取等方面的内容,不会有运动规划内容。不知道更新什么内容了!