硬件:yahboom出的dofbot机械臂,六轴自由度机械臂
一.使用的运动规划库
当前我们使用的是OMPL运动规划库,他支持多种类型的机器人和规划问题,可以用于解决复杂的运动规划问题。简单说,规划出一条运动轨迹。给定一个具体的机械臂结构,给定一个目标,然后OMPL会规划一条合理的不与环境中任何障碍发生碰撞的轨迹。
二.开始控制真实世界机械臂
1.demo.launch中的参数fake_excution值设置为false
在默认生成的moveit配置文件中,参数基本上是针对虚拟机械臂而言的,因此我们可以在rviz中观察到模型的运动,但是,这种控制虚拟机械臂的方法不会将真正的控制信号发送出来,所以我们要想在真实世界中控制机械臂时得到控制moveit输出的控制信号,所需要的action是FollowJointTrajectoryAction,它是moveit中专门控制真实机械臂的。
<arg name="fake_execution" value="false"/>
将fake_execution设置为false,意思是启动真实机械臂执行
同时,注释以下代码,时期不在发布虚拟的joint_states,因为驱动真实机械臂时,我们要同步的是真实机械臂的joint_states,拿到真实机械臂的关节状态然后通过joint_states发布出来。
<!-- We do not have a real robot connected, so publish fake joint states via a joint_state_publisher
MoveIt's fake controller's joint states are considered via the 'source_list' parameter -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)">
<rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
</node>
<!-- If desired, a GUI version is available allowing to move the simulated robot around manually
This corresponds to moving around the real robot without the use of MoveIt. -->
<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/fake_controller_joint_states]</rosparam>
</node>
2.修改moveit_controller_manager参数值为自己机械臂名称
进入move_group.launch文件中,在moveit_controller_manager这一行,在选择参数值的时候,由于此行没有unless参数(保留疑问),按照网上教程,unless的value值要修改成自己的机械臂名称作为前缀。 在研究的过程中,我发现虚拟机上面文件与实体机上文件有出入,虚拟机上面没有关于控制实体机的选项,意思是不能控制实体机。比如说此处没有unless代码,意味着不能发布真实信号控制机械臂。
这个是虚拟机上的代码
<!-- Trajectory Execution Functionality -->
<include ns="move_group" file="$(dirname)/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
<arg name="moveit_manage_controllers" value="true" />
<arg name="moveit_controller_manager" value="$(arg moveit_controller_manager)" />
<arg name="fake_execution_type" value="$(arg fake_execution_type)" />
</include>
下面是参考文章的代码
<!-- Trajectory Execution Functionality -->
<include ns="move_group" file="$(find xmate7_moveit_config_new)/launch/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
<arg name="moveit_manage_controllers" value="true" />
<arg name="moveit_controller_manager" value="xmate7_description" unless="$(arg fake_execution)"/>
<arg name="moveit_controller_manager" value="fake" if="$(arg fake_execution)"/>
</include>
moveit_controller_manager的参数是有选择的,要么等于“机械臂名称”,要么等于“fake”(倒数第二行),取决于后面的参数fake_execution,而这个参数我们上一步已经改为了false,所以moveit_controller_manager应该等于“机械臂名称”,下面,此参数会传递给trajectory_excution.launch.xml文件。
-
<arg name="moveit_controller_manager" value=机械臂的名称>
:这部分定义了一个名为moveit_controller_manager
的参数,并将其值设置为机械臂名称
。这意味着默认情况下,系统会使用名为机械臂名称
的控制器管理器来管理机器人的运动控制器。 -
unless="$(arg fake_execution)"
:这是一个条件判断语句,用于决定是否应用前面定义的value="机械臂名称"
。具体来说,它检查是否存在一个名为fake_execution
的参数,并且该参数的值被设置为true。
3.查看trajectory_execution.launch.xml文件
<!-- We use pass_all_args=true here to pass fake_execution_type, which is required by fake controllers, but not by real-robot controllers.
As real-robot controller_manager.launch files shouldn't be required to define this argument, we use the trick of passing all args. -->
<include file="$(dirname)/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml" pass_all_args="true" />
通过设置pass_all_args="true"
,可以确保fake_execution_type
这个参数(以及其他任何可能定义的参数)都被传递给这个启动文件,无论它是否需要它们。这样,你就可以在需要时无缝地在模拟和真实机器人之间切换,而无需修改启动文件。
4.进入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="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 自己的文件)/config/ros_controllers.yaml"/>
</launch>
使用<rosparam>
标签加载一个YAML文件(ros_controllers.yaml
),这个YAML文件包含了ROS控制器的配置信息,如控制器的类型、关节名称、PID参数等。这些信息对于ROS控制器的正确初始化和运行至关重要。
5.创建ros_controllers.yaml文件
上一步代码最后一句指向了ros_controllers.yaml配置文件,他决定了所使用moveit控制器的参数,该文件配置如下:
controller_list:
- name: 名字
action_ns: follow_joint_trajectory
default: True
type: FollowJointTrajectory
joints:
- arm_joint1
- arm_joint2
- arm_joint3
- arm_joint4
- arm_joint5
- grip_joint
- rlink_joint2
- rlink_joint3
- llink_joint1
- llink_joint2
- llink_joint3
name
:自定义名称
action_ns
指的是这个控制器所遵循的动作命名空间(action namespace)。follow_joint_trajectory
是一个标准的ROS(Robot Operating System)动作服务器接口,用于控制机械臂沿指定的关节轨迹运动。这意味着该控制器将监听并响应follow_joint_trajectory
动作请求,以控制机械臂的关节运动。
5.真实机械臂与joint_states_publisher消息冲突的问题解决方案
当控制真实机械臂时,demo.launch文件中关于joint_states_publisher的一段代码需要注释掉。
因为该程序也是在发布机械臂关节状态,而且是一个模拟的状态,与真实机械臂状态不一样,因此需要注释掉(可能会导致move_group不知道当前机器人的关节信息无法进行规划,创建了一个发布joint_state的节点后就可以解决了)。
<!-- 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">
<param name="/use_gui" value="$(arg use_gui)"/>
<!--rosparam param="/source_list">[/move_group/fake_controller_joint_states]</rosparam -->
<rosparam param="/source_list">[/joint_states]</rosparam >
</node>
6.解决真实机械臂轨迹执行时间超时的问题(未尝试)
需要再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"/> //超时的一个百分比范围
或者加入下面的参数,直接关掉监视轨迹执行状况的一个monitoring
<param name="trajectory_execution/execution_duration_monitoring" value="false"/>
现在,moveit端文件配置完毕,moveit已经真备好将规划的轨迹以action形式发送出来,后面我们需要解决接收端问题,来完成moveit和真实机械臂之间的联系。