Rviz 和Gazebo联合仿真运动(二)

经过上一节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点云配准,碰撞规避、八叉树、生成障碍物、无碰撞抓取等方面的内容,不会有运动规划内容。不知道更新什么内容了!

猜你喜欢

转载自blog.csdn.net/shdhckcjc/article/details/130777716