该部分内容主要参考合工大机器人实验室的内容,但是由于版本问题,我们可能好多地方的内容有些不一样。

一、需要修改的内容
1.1 demo.launch文件中参数fake_execution的值改为false
位于机器人配置文件中的launch’文件中的demo.launch文件,好多博主,包括古月居的胡老师也说要修改,但是当我生成配置文件的时候,我发现这部分好像不需要修改。

  <!-- Run the main MoveIt! executable without trajectory execution (we do not have controllers configured by default) -->
  <include file="$(find LOBOT_moveit_config)/launch/move_group.launch">
    <arg name="allow_trajectory_execution" value="true"/>
    <arg name="fake_execution" value="false"/>//就是这个参数,只要保证后面是false文件就可以了
    <arg name="execution_type" value="$(arg execution_type)"/>
    <arg name="info" value="true"/>
    <arg name="debug" value="$(arg debug)"/>
    <arg name="pipeline" value="$(arg pipeline)"/>
    <arg name="load_robot_description" value="$(arg load_robot_description)"/>
  </include>

反正不管怎么样,只要保证 //就是这个参数,只要保证后面是false文件就可以了。
这句话的意义是:当后面的参数是true是,表示运行的rviz下面的虚拟 机械臂。放改成false时,就是控制真实的机械臂。

2.2、修改move_group.launch文件中的moveit_controller_manager参数。
因为我们的机械臂是LOBOT,配置文件名称是LOBOT,moveit_controller_manager在选择参数值时,“unless”前面那个velue值要修改,写一个自己机器人名称作为前缀

  <!-- Trajectory Execution Functionality -->
  <include ns="move_group" file="$(find LOBOT_moveit_config)/launch/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_manage_controllers" value="true" />
    <arg name="moveit_controller_manager" value="LOBOT" unless="$(arg fake_execution)"/>
    <arg name="moveit_controller_manager" value="fake" if="$(arg fake_execution)"/>
    <arg name="execution_type" value="$(arg execution_type)" />
  </include>

这个名字是根据你机械臂配置文件的名称来修改的。
这段代码要看懂,moveit_controller_manager的参数是有选择的,要么等于“LOBOT”(我使用的名称),要么等于“fake”,这要取决于后面的参数fake_execution,而这个参数我们上一步已经改为了false,即当前moveit_controller_manager应该等于“LOBOT”,接下来,这个参数会传递给trajectory_execution.launch.xml文件,该文件中有下面这句话

<include file="$(find aubo_i5_moveit_config)/launch/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml" />

按照原先的设置,本应该启动fake_moveit_controller_manager.launch.xml,你可以去moveit配置文件夹下去找,这个文件是存在的,而现在,一个叫做LOBOT_moveit_controller_manager.launch.xml将会被启动,而这个文件moveit也应该已经帮你创建好了,当你使用先前的moveit向导加载机器人模型时,机器人模型中写明的机器人名称(name属性),就会作为前缀写入这个文件的文件名,所以,“LOBOT”这个名称源自于你模型文件里写明的机器人名称,请前后保持统一,理解各个文件之间的调用关系。

2.3、修改LOBOT_moveit_controller_manager.launch.xml文件
这个也是我跟大家不一样的地方,他们都说这个文件时空的,但是我的文件是直接生成好的。

<launch>

  <!-- loads moveit_controller_manager on the parameter server which is taken as argument
    if no argument is passed, moveit_simple_controller_manager will be set -->
  <arg name="execution_type" default="interpolate" />
  <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager" />
  <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>

  <!-- loads ros_controllers to the param server -->
  <rosparam file="$(find LOBOT_moveit_config)/config/controllers.yaml"/>
</launch>

有一点不同的是,别人的配置文件中都没有arg name="execution_type"这个参数,因此我在上述代码中加入了arg name=“execution_type” default=“interpolate” /这句话。如果你在运行代码时遇到关于这个参数的报错,可以尝试在该位置添加参数。
在该部分,我们看到了controllers.yaml这个文件,这个文件时跟其他人一样的,因此我们需要在condig文件中修改该文件。

2.4 创建controllers.yaml配置文件

controller_list:
  - name: LOBOT
    action_ns: follow_joint_trajectory
    default: True
    type: FollowJointTrajectory
    joints:
      - joint1
      - joint2
      - joint3
      - joint4
      - joint5
      - joint6
initial:  # Define initial robot poses.
  - group: manipulator
    pose: home

这个文件简直提供了太多的信息了。
**name:**这里你可以写一个与你机器人相关的名称,方便你使用

action_ns:follow_joint_trajectory ,follow_joint_trajectory 是后续action的名称的一部分,有关action的内容在下一章里,将来你需要填一个action的名称,这个名称就在这个配置文件里确定了,就是name/action_ns所代表的对应字符串的组合。

type: FollowJointTrajectory ,这个类型是ros下的自带action类型,是一种控制机械臂运动轨迹的数据结构,请原样填写,将来你可能还想控制手抓之类的结构,所填写的类型都是不一样的。

**joints:**这里是你机器人(机械臂)的关节名称,这些名称源自你的机器人模型文件,我们的controllers.yaml文件复制于fake_controllers.yaml文件,这部分应该是自动生成的。

demo.launch文件红还有一个部分需要修改

  <!-- We do not have a robot connected, so publish fake joint states -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)">
    <!--rosparam param="source_list">[/move_group/LOBOT_controller_joint_states]</rosparam-->
    <rosparam param="/source_list">[/joint_states]</rosparam >//就是这里,
  </node>
  <!--node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)">
    <rosparam param="source_list">[move_group/LOBOT_controller_joint_states]</rosparam>
  </node-->

需要在move_group.launch文件中增加几个参数,来延长允许执行轨迹的时间。
找到node name=“move_group” 所对应的标签组,在其中加入以下参数

<param name="trajectory_execution/allowed_execution_duration_scaling" value="6"/>      //允许轨迹执行时间的一个放大倍数,可以根据实际情况自行修改
<param name="trajectory_execution/allowed_goal_duration_margin" value="0.5"/>            //超时的一个百分比范围

到此为止,moveit配置文件中所有应该修改的文件就修改完了,moveit已经准备好了将规划的轨迹以action的形式发送给真实机械臂,后面的内容将是如何利用好action这里的信息,实现真正的机械臂控制。
好多人都写这,但是事实上对于小强LOBOT机洗臂来讲,我们还需要做很多事情,因为小强机械臂只提供了一个24路开发板,但是对于moveit来讲,moveit可以看作是一个action的client端,因此,我们需要自己写一个action的serer端。
除此之外,我们还需要写一个驱动节点来驱动机械臂的个个关节,因此在这,我们放弃了LOBOT原始的24路舵机控制器,而是换成了一个arduino控制器。然后我们在arduino中添加了一个节点。
具体方法看下面的文章