在ROS中配置使用Robotiq二指抓手(三)

前言

這部分內容主要講如何實現Robotiq二指抓手在Gazebo中的仿真。
由於在二指抓手中使用了mimic標籤,而Gazebo無法識別,導致直接讀取二指手抓模型會在Gazebo中離散。
在這裏插入圖片描述之前已經介紹過,可以使用mimic的插件實現(https://blog.csdn.net/weixin_42268975/article/details/106255685)。本文主要講,如何在gazebo中爲robotiq二指手抓配置該插件。

安裝插件

https://github.com/roboticsgroup/roboticsgroup_gazebo_plugins
下載該插件功能包並編譯安裝。然後,將該插件功能包添加到工作空間。
可以用echo $ROS_PACKAGE_PATH查看是否添加到工作空間。

需要注意:由於這是外部添加的插件,需要在使用時確認該插件功能包已經添加到工作空間,插件功能纔會生效。

配置Robotiq二指手抓相關文件

這裏使用robotiq的純原生功能包https://github.com/ros-industrial/robotiq.git

1. 修改URDF

主要修改robotiq_2f_140_gripper_visualization/urdf/robotiq_arg2f_transmission.xacro,添加三塊內容。需要注意,對於transmission標籤只需要給主動關節配置即可,不需要給被動關節(mimic)配置,不然可能會用ros_control來驅動。

另外,如果報錯:

Deprecated syntax, please prepend ‘hardware_interface/’ to ‘PositionJointInterface’ within the tag in joint ‘finger_joint’.

在robotiq_arg2f_transmission.xacro中更新標籤如下:

<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>

1.1 添加mimic插件宏

  <xacro:macro name="mimic_joint_plugin_gazebo" params="name_prefix parent_joint mimic_joint has_pid:=false multiplier:=1.0 offset:=0 sensitiveness:=0.0 max_effort:=1.0 robot_namespace:=''">
    <gazebo>
      <plugin name="${name_prefix}mimic_joint_plugin" filename="libroboticsgroup_gazebo_mimic_joint_plugin.so">
        <joint>${parent_joint}</joint>
        <mimicJoint>${mimic_joint}</mimicJoint>
        <xacro:if value="${has_pid}">                     <!-- if set to true, PID parameters from "/gazebo_ros_control/pid_gains/${mimic_joint}" are loaded -->
          <hasPID />
        </xacro:if>
        <multiplier>${multiplier}</multiplier>
        <offset>${offset}</offset>
        <sensitiveness>${sensitiveness}</sensitiveness>   <!-- if absolute difference between setpoint and process value is below this threshold, do nothing; 0.0 = disable [rad] -->
        <maxEffort>${max_effort}</maxEffort>              <!-- only taken into account if has_pid:=true [Nm] -->
        <xacro:unless value="${robot_namespace == ''}">
          <robotNamespace>($robot_namespace)</robotNamespace>
        </xacro:unless>
      </plugin>
    </gazebo>
  </xacro:macro>

1.2 被動關節配置

接着,對5個被動關節進行配置,注意parent joint 及multiplier,使其與相應joint的mimic標籤對應。注意到這裏has_pid="true",因此需要爲期配置PID參數,見2.1

  <xacro:mimic_joint_plugin_gazebo name_prefix="left_inner_knuckle_joint"
    parent_joint="finger_joint" mimic_joint="left_inner_knuckle_joint"
    has_pid="true" multiplier="-1.0" max_effort="10.0" />

  <xacro:mimic_joint_plugin_gazebo name_prefix="left_inner_finger_joint"
    parent_joint="finger_joint" mimic_joint="left_inner_finger_joint"
    has_pid="true" multiplier="1.0" max_effort="10.0" />

  <xacro:mimic_joint_plugin_gazebo name_prefix="right_outer_knuckle_joint"
    parent_joint="finger_joint" mimic_joint="right_outer_knuckle_joint"
    has_pid="true" multiplier="-1.0" max_effort="10.0" />

  <xacro:mimic_joint_plugin_gazebo name_prefix="right_inner_knuckle_joint"
    parent_joint="finger_joint" mimic_joint="right_inner_knuckle_joint"
    has_pid="true" multiplier="-1.0" max_effort="10.0" />

  <xacro:mimic_joint_plugin_gazebo name_prefix="right_inner_finger_joint"
    parent_joint="finger_joint" mimic_joint="right_inner_finger_joint"
    has_pid="true" multiplier="1.0" max_effort="10.0" />

1.3 添加ros_control插件。

爲主動關節配置gazebo_ros_control插件。

  <gazebo>
      <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
          <robotNamespace>/</robotNamespace>
          <legacyModeNS>true</legacyModeNS>
      </plugin>
  </gazebo>

2. 修改控制器文件

新建robotiq_2f_140_gripper_gazebo功能包,用來配置相關控制器文件。我把它建在robotiq元功能包的src目錄下。裏面內容與mimic教程相同,放置了config文件夾、launch文件夾,對控制器文件做了相關修改。

2.1 gazebo_controller.yaml

不論是主動關節,還是被動關節,都需要使用pid參數。
robotiq_2f_140_gripper_gazebo/config/gazebo下創建gazebo_controller.yaml,內容爲:

# Note: You MUST load these PID parameters for all joints that are using the
# PositionJointInterface, otherwise the arm + gripper will act like a giant
# parachute, counteracting gravity, and causing some of the wheels to lose
# contact with the ground, so the robot won't be able to properly navigate. See
# https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612
gazebo_ros_control:
  pid_gains:
    # these gains are used by the gazebo_ros_control plugin
    finger_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true
    # the following gains are used by the gazebo_mimic_joint plugin
    left_inner_knuckle_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true

    left_inner_finger_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true

    right_outer_knuckle_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true

    right_inner_knuckle_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true

    right_inner_finger_joint:
      p: 20.0
      i: 0.1
      d: 0.0
      i_clamp: 0.2
      antiwindup: false
      publish_state: true

2.2 joint_state_controller.yaml

robotiq_2f_140_gripper_gazebo/config/ros_control下創建joint_state_controller.yaml

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

2.3 joint_trajectory_controller.yaml

src/robotiq/robotiq_2f_140_gripper_gazebo/config/ros_control下創建joint_trajectory_controller.yaml,實現對主動關節的控制,注意joints修改爲了主動關節的名稱。

# Position Controllers ---------------------------------------
gripper_controller:
  type: position_controllers/JointTrajectoryController
  joints:
    - finger_joint
  constraints:
    goal_time: 0.6
    stopped_velocity_tolerance: 0.05
    gripper_finger_joint: {trajectory: 0.2, goal: 0.2}
  stop_trajectory_duration: 0.5
  state_publish_rate:  125
  action_monitor_rate: 10

3. launch文件

robotiq_2f_140_gripper_gazebo/launch下創建gazebo.launch,注意其中幾個文件的讀取路徑。

<?xml version="1.0" ?>

<launch>
  <param name="robot_description" command="$(find xacro)/xacro --inorder $(find robotiq_2f_140_gripper_visualization)/urdf/robotiq_arg2f_140_model.xacro" />

  <!-- Load gazebo controller configurations -->
  <!-- Note: You MUST load these PID parameters for all joints that are using
       the PositionJointInterface, otherwise the arm + gripper will act like a
       giant parachute, counteracting gravity, and causing some of the wheels
       to lose contact with the ground, so the robot won't be able to properly
       navigate. See
       https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612 -->
  <rosparam file="$(find robotiq_2f_140_gripper_gazebo)/config/gazebo/gazebo_controller.yaml" command="load" />

  <!-- Gazebo -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="paused" value="false" />
  </include>

  <!-- Spawn the robot into Gazebo -->
  <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model robotiq_2f_140_gripper_model" />

  <!-- Load ros_control controller configurations -->
  <rosparam file="$(find robotiq_2f_140_gripper_gazebo)/config/ros_control/joint_state_controller.yaml" command="load" />
  <rosparam file="$(find robotiq_2f_140_gripper_gazebo)/config/ros_control/joint_trajectory_controller.yaml" command="load" />

  <!-- Start the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" output="screen"
    args="joint_state_controller gripper_controller"/>

  <!-- Robot state publisher -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" />

  <!-- Load teleop -->
  <node name="rqt_joint_trajectory_controller" pkg="rqt_joint_trajectory_controller" type="rqt_joint_trajectory_controller" />
</launch>

在這裏插入圖片描述
如果有報錯:

ERROR: cannot launch node of type [rqt_joint_trajectory_controller/rqt_joint_trajectory_controller]: rqt_joint_trajectory_controller
ROS path [0]=/opt/ros/kinetic/share/ros
…………

解決方法查看:https://blog.csdn.net/weixin_42268975/article/details/106255685

4. 其他

需要指出的是

  1. 在使用mimic插件功能時,不需要特意配置CMakeListstxtpackage.xml.在我robotiq_2f_140_gripper_gazebo下的這兩個文件未有任何改動,純原生。
  2. 默認robotiq二指手抓底座有慣性標籤,直接會有警告。可以在該杆件前添加一個空杆件
  3. 我的手指一直在輕微抖動,是重力+pid的綜合影響?可能調個好點的pid就好了?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章