前言
這部分內容主要講如何實現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. 其他
需要指出的是,
- 在使用mimic插件功能時,不需要特意配置
CMakeListstxt
及package.xml
.在我robotiq_2f_140_gripper_gazebo
下的這兩個文件未有任何改動,純原生。 - 默認robotiq二指手抓底座有慣性標籤,直接會有警告。可以在該杆件前添加一個空杆件
- 我的手指一直在輕微抖動,是重力+pid的綜合影響?可能調個好點的pid就好了?