首页 > 技术文章 > ROS机械臂搭建仿真环境

jimlee123 2020-12-22 22:47 原文

一、.ROS中的控制器插件

1.ros_control是什么?

  1)为开发者提供的机器人控制中间件;

  2)包含一系列控制器接口、传动装置接口、硬件接口、控制器工具等;

  3)可以帮助机器人应用功能包快速落地。

 

  控制器管理:提供一种通用的借口来管理不同的控制器

  控制器:读取硬件状态,发布控制指令,完成每个joint的控制

  硬件资源:为上下两层提供硬件资源的接口

  机器人硬件抽象:机器人硬件抽象和硬件资源直接打交道,通过write和reaf方法完成硬件操作

  真实机器人:执行接收到的命令

2.控制器(Controllers):

  joint_state_controller:监控机器人状态

  joint_effort_controller

  joint_position_controller:最常用!

  joint_velocity_controller

 

二、完善机器人模型

1)为Link添加惯性参数和碰撞属性(注意物理参数,这里将质量设置的很小,惯性设置的较大,让我们仿真稳定)

2)为joint添加传动装置

3)添加gazebo控制器插件

启动:可能会出现PID增益不存在的报错,需要修改参数配置的形式

roslaunch probot_gazebo probot_anno_gazebo_world.launch

三、构建MoveIt!+Gazebo仿真

划重点!!!

 

Joint Trajectory Controller :

  接收action发来的trajecotry轨迹,并完成每个轴的插补运算,让每个轴动起来

  1)参数配置,配置控制器arm_joint_conotroller的类型、关节、增益等参数

probot_anno:
  arm_joint_controller:
    type: "position_controllers/JointTrajectoryController"
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6

    gains:
      joint_1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

  2)控制器启动,probot_anno_trajectory_controller.launch,启动了一个arm_joint_controller控制器

<launch>

    <rosparam file="$(find probot_gazebo)/config/probot_anno_trajectory_control.yaml" command="load"/>

    <node name="arm_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/probot_anno" args="arm_joint_controller"/>

</launch>

  插补运算提供了三种算法(默认使用五次样条):

    1)线性样条:位置连续、速度、加速度不连续

    2)三次样条:位置和速度连续,加速度不连续

    3)五次样条:位置、速度、加速度都连续

Joint State Controller:

  监控关节实时状态

  1)参数配置,设置发布频率50hz,即20ms一次

probot_anno:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  
  

  2)控制器启动,probot_anno_gazebo_states.launch,与上面的类似

<launch>
    <!-- 将关节控制器的配置参数加载到参数服务器中 -->
    <rosparam file="$(find probot_gazebo)/config/probot_anno_gazebo_joint_states.yaml" command="load"/>

    <node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/probot_anno" args="joint_state_controller" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
        respawn="false" output="screen">
        <remap from="/joint_states" to="/probot_anno/joint_states" />
    </node>

</launch>

  注意区分joint_state_publisher和robot_state_publisher

Follow Joint Trajectory

  封装trajectory成action,并发出去

  1)参数配置,注意这个文件是在MoveIt!中的probot_annp_moveit_config功能包中,这个文件将会被probot_anno_moveit_controller_manager.launch加载,启动时会自动启动这个controller

 

controller_manager_ns: controller_manager
controller_list:
  - name: probot_anno/arm_joint_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6

 

  2)控制器启动,probot_anno_moveit_controller_manager.launch,注意这个launch文件也在probot_annp_moveit_config功能包中,后缀.xml没有用!

 

<launch>
    <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
    <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>

    <!-- gazebo Controller -->
    <rosparam file="$(find probot_anno_moveit_config)/config/controllers_gazebo.yaml"/>

</launch>

 

最终的launch文件:

<launch>
  
    <!-- Launch Gazebo  -->
    <include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_gazebo_world.launch" />

    <!-- ros_control arm launch file -->
    <include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_gazebo_states.launch" />   

    <!-- ros_control trajectory control dof arm launch file -->
    <include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_trajectory_controller.launch" />

    <!-- moveit launch file -->
    <include file="$(find probot_anno_moveit_config)/launch/moveit_planning_execution.launch" />

</launch>

  这边最后调用的moveit_planning_execution.launch包含了很多文件的,需要仔细分析

实际运行:

roslaunch probot_gazebo probot_anno_bringup_moveit.launch

 

   观察trajectory数据:

rostopic echo /probot_anno/arm_joint_controller/follow_joint_trajectory/goal

  数据格式为:关节空间的轨迹,可以进行细插补

 

  观察每个关节位置的曲线

rosrun rqt_plot rqt_plot
订阅/probot_anno/joint_states/position[5]

 

   最后,尴尬的是仿真了40几分钟的时候,gazebo中的机械臂翻了,应该是重力的影响,可以尝试把底座固定在地面上,添加一个固定关节。

 学习资料链接:

  Gazebo Tutorial:http://www.gazebosim.org/tutorials

  gazebo和rviz有具体的区别吗?那个更好用?(因为公众号迁移,链接有点长)https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247485881&idx=1&sn=8a450bf099e5a865da0e4950aedab970&source=41#wechat_redirect

  ROS技术点滴----ros_control:https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247485887&idx=1&sn=83d036542f242f8831bf1a43df70d89a&source=41#wechat_redirect

  ROS探索哦总结(二十四)---使用gazebo中的插件:https://www.guyuehome.com/388

推荐阅读