moveit控制真实机械臂(一)配置action client端

硬件: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和真实机械臂之间的联系。

### 使用 MoveIt! 控制真实机械 为了成功使用 MoveIt! 控制实际的机械,需先确保机械具备基本的功能性底层驱动[^2]。这意味着该机械能够通过 C++ 或其他编程语言执行基础动作指令,例如移动至特定关节角度或使末效应器到达指定的位置和方向。 旦确认了硬件层面的操作能力,在 ROS 中集成并利用 MoveIt! 进行更高级别的规划与控制成为可能。具体来说: - **设置环境**:安装必要的软件包,包括但不限于 `ros-melodic-moveit` 及其依赖项。 - **配置模型文件**:准备 URDF/XACRO 文件描述机械结构;SRDF 文件定义工作空间约束条件以及附加组件信息等。 - **启动 MoveIt! 配置向导**:借助 moveit_setup_assistant 工具创建适用于所选设备的具体参数设定。 - **编写自定义节点和服务接口**:开发用于接收来自 MoveIt! 的命令并向物理装置发送相应信号的应用逻辑。这部分涉及构建 action 客户/服务器机制以处理轨迹跟随任务或其他交互形式。 下面是个简单的 Python 示例代码片段展示如何连接到已知名称的动作服务来进行路径跟踪请求: ```python import rospy from control_msgs.msg import FollowJointTrajectoryAction, FollowJointTrajectoryGoal from trajectory_msgs.msg import JointTrajectoryPoint def send_trajectory(): client = actionlib.SimpleActionClient('arm_controller/follow_joint_trajectory', FollowJointTrajectoryAction) goal = FollowJointTrajectoryGoal() point = JointTrajectoryPoint() # 填充point数据... goal.trajectory.points.append(point) client.send_goal(goal) client.wait_for_result() if __name__ == "__main__": try: rospy.init_node('send_traj') send_trajectory() except Exception as e: print(e) ``` 此脚本展示了怎样建立个简易客户去调用名为 'arm_controller/follow_joint_trajectory' 的 Action 服务,并提交条由多个时间戳点构成的目标轨迹给它处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值