在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
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
`tf::TransformListener` 类的 `waitForTransform` 函数可以用于等待两个坐标系之间的变换关系。它的函数原型如下: ```cpp bool waitForTransform(const std::string& target_frame, const std::string& source_frame, const ros::Time& time, const ros::Duration& timeout, const ros::Duration& polling_sleep_duration = ros::Duration(0.01)) const; ``` 其,函数参数的含义如下: - `target_frame`:目标坐标系的名称; - `source_frame`:源坐标系的名称; - `time`:所需变换的时间戳; - `timeout`:等待变换的最长时间,超时则返回 false; - `polling_sleep_duration`:每次等待的时间间隔,用于控制函数的轮询频率。 函数返回值为 true 表示变换已经可以被查询,false 表示等待超时。 下面是一个 waitForTransform 的示例代码: ```cpp #include <ros/ros.h> #include <tf/transform_listener.h> int main(int argc, char** argv){ ros::init(argc, argv, "example_tf_listener"); tf::TransformListener listener; ros::Rate rate(10.0); while (ros::ok()){ tf::StampedTransform transform; try{ // 等待 transform 可以被查询,超时时间为 1 秒 listener.waitForTransform("target_frame", "source_frame", ros::Time(0), ros::Duration(1.0)); // 获取变换 listener.lookupTransform("target_frame", "source_frame", ros::Time(0), transform); } catch (tf::TransformException ex){ ROS_ERROR("%s",ex.what()); } rate.sleep(); } return 0; } ``` 在上述示例代码,首先创建了一个 `tf::TransformListener` 对象 `listener`,然后在 while 循环使用 `waitForTransform` 等待坐标系之间的变换关系。如果在超时时间内变换关系还未建立,则输出错误信息。如果变换关系已经建立,则可以使用 `lookupTransform` 函数获取变换关系,该函数的使用方法可以参考其他教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值