2 如何给Gazebo中的仿真机械臂添加一个力传感器?

2023-05-16

1. 你得有一个仿真机械臂

        简单地说你首先的拥有一个能够在Gazebo当中使用的机械臂的URDF文件,必须要包含visual、collision和inertial三大标签。出于个人习惯,这里直接使用UR官方提供的UR5的URDF文件,具体怎么下载,请自行百度

        这里建议新建一个功能包用于存放UR5的相关文件,因为官方功能包ur_description里面除了UR5的URDF文件之外,还有其它机械臂的文件,显得特别混乱。

        你的功能包应该包含以下文件:

你的功能包:
    meshes:
        collision
        visual
    urdf:
        common.gazebo.xacro
        ur.gazebo.xacro
        ur.transmission.xacro
        ur5.urdf.xacro
        ur5_robot.urdf.xacro
    launch:
        ur5_upload.launch
        view_ur5.launch
    config:
        view_robot.rviz

        这些文件你都可以在对应的官方文档中找到,将其直接拷贝即可。其中meshes文件夹下的collision和visual两个文件夹都是储存UR5的三维模型文件的,你可以在官方功能包ur_description/meshes/ur5下找到这两个文件夹。

(1)common.gazebo.xacro && ur.gazebo.xacro && ur.transmission.xacro:

        通用文件,第一个导入Gazebo/roscontrol插件,后续给机械臂发送控制指令是通过roscontrol来完成。第二个配置了机械臂在Gazebo当中的一些仿真设置,设置了自碰撞为true。第三个配置了哪些关节需要传动,以及使用何种模拟的硬件接口,这里的模拟硬件接口就好比实际的机械臂是使用位置控制还是力矩控制,这个文件将硬件接口使用了参数${hw_interface}来表示,后续再传参进行设置。

(2)ur5.urdf.xacro:

        ur5本体模型文件。

(3)ur5_robot.urdf.xacro:

        将上述文件全部串起来的一个总文件,在该文件中设置了刚刚上述所说的${hw_interface}参数,如下代码:

<xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/>

  <xacro:ur5_robot prefix="" joint_limited="false"
    transmission_hw_interface="$(arg transmission_hw_interface)"
  />

        建议将default="hardware_interface/PositionJointInterface"修改为default="PositionJointInterface",原因不知,但我不修改它就报错。

(4)ur5_upload.launch:

        将ur5_robot.urdf.xacro模型文件作为参数robot_description上传至参数服务器,Gazebo和rviz都是通过参数服务器中的robot_description参数来识别机器人模型。注意把里面的hardware_interface/PositionJointInterface通通改成PositionJointInterface。

(5)view_ur5.launch:

        在rviz中显示ur5。每次打开Gazebo比较耗时,如果仅仅只是查看装配关系以及坐标轴方向的话推荐使用rviz,后面需要自己在ur5末端装配一个力传感器,所以需要频繁使用这个文件来查看传感器的装配是否正确。

(6)view_robot.rviz:

        rviz的设置文件,在view_ur5.launch中被导入。

2.你得有一个力传感器并把它装上去

        首先,你可以在你的功能下的urdf文件夹中新建一个名为ft_sensor.xacro的文件,用于建立你自己的力传感器模型,你可以在三维绘图软件中绘制并导出stl文件加入到urdf文件中,不过我为了偷懒直接建立了一个圆柱当成了力传感器,代码如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="ft_sensor">

    <link name="ft_sensor">
        <visual>
            <geometry>
                <cylinder radius="0.0375" length="0.01"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.0375" length="0.01"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
        </collision>
        <inertial>
            <mass value="0.01"/>
            <inertia ixx="7.1441E-05"
                     ixy="1.6499E-08"
                     ixz="-4.9269E-09"
                     iyy="7.146E-05"
                     iyz="-8.5336E-09"
                     izz="0.00013366"/>
        </inertial>
    </link>

    <joint name="ft_sensor_joint" type="fixed">
        <origin xyz="0.0 0.0873 0.0" rpy="0.0 0.0 0.0"/>
        <parent link="wrist_3_link"/>
        <child link="ft_sensor"/>
        <axis xyz="0.0 0.0 0.0"/>
        <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/>
    </joint>
    
</robot>

        <link>标签就是传感器本体,就是一个小圆柱,<joint>标签将这个传感器固连到了机械臂末端,就是wrist_3_link这个连杆之后。

        不过,这还没完,这里仅仅是添加了一个传感器的三为模型,还没有为其赋予传感器的功能,因此,在你的功能包的urdf下新建一个文件夹名为sensor,专门用于给传感器赋予功能的文件夹,在此之下新建一个ft_sensor_config.xacro文件,代码如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="ft_sensor_config">
    
    <!-- Enable the Joint Feedback -->
    <gazebo reference="ft_sensor_joint">
        <provideFeedback>true</provideFeedback>
        <disableFixedJointLumping>true</disableFixedJointLumping>
    </gazebo>

    <!-- The ft_sensor plugin -->
    <gazebo>
        <plugin name="ft_sensor" filename="libgazebo_ros_ft_sensor.so">
            <updateRate>100.0</updateRate>
            <topicName>ft_sensor_topic</topicName>
            <jointName>ft_sensor_joint</jointName>
        </plugin>
    </gazebo>

</robot>

        关键部分是以下这一段:

    <gazebo>
        <plugin name="ft_sensor" filename="libgazebo_ros_ft_sensor.so">
            <updateRate>100.0</updateRate>
            <topicName>ft_sensor_topic</topicName>
            <jointName>ft_sensor_joint</jointName>
        </plugin>
    </gazebo>

        首先要导入Gazebo力传感器的插件,可以理解为导入力传感器仿真实现的源码,<uprate>标签是反馈频率,<topicName>标签是发布的话题,即启动Gazebo后会在ft_sensor_topic话题下以1秒钟100次的频率发布传感器数据。<jointName>标签很关键,就是这个传感器设置在哪个关节上,注意个人认为这个Gazebo的一个bug,只能将力传感器放置在关节上,因此这个的关节我们就选择在传感器的模型文件中的ft_sensor_joint关节即可。

        完成以上,将上述新建的两个文件通过在ur5_robot.urdf.xacro加入以下代码和之前的所有urdf文件进行汇总。

<!-- ft_sensor -->
  <xacro:include filename="$(find Robot_ft_sensor_Description)/urdf/ft_sensor.xacro" />
  <xacro:include filename="$(find Robot_ft_sensor_Description)/urdf/sensor/ft_sensor_config.xacro"/>

        现在,你就可以启动view_ur5.launch文件看到你的传感器了,如图。

        红色的这个就是传感器,准确地讲,连接红色圆柱的关节才是传感器,绿色的是传感器的Y轴方向,蓝色是Z轴方向,红色是X轴方向,这个坐标轴方向很重要。

3.你可以启动Gazebo了

        新建一个新的功能包用于存放Gazebo相关文件,如下,和上述的功能包一样,你可以直接从官方文档拷贝。

你的功能包:
    controller:
        joint_state_controller.yaml
        robot_controller.yaml
    launch:
        controller_utils.launch
        ur5.launch

(1)joint_state_controller.yaml && robot_controller.yaml:

        roscontrol的配置文件,前者配置了一个反馈机械臂关节角度的控制器,后者则是控制机械臂六个关节的控制器,后者代码为以下:

robot_controller:
  type: position_controllers/JointGroupPositionController
  joints:
     - shoulder_pan_joint
     - shoulder_lift_joint
     - elbow_joint
     - wrist_1_joint
     - wrist_2_joint
     - wrist_3_joint

        这一个控制器就够使了,这个表示启动Gazebo后会有一个叫robot_controller/command的话题,直接王上面发送六个关节数据就可以控制机械臂运动了,注意这里使用的是position_controllers与上述的PositionJointInterface是对应的。

(2)controller_utils.launch:

        通过joint_state_controller.yaml文件的设置启动了机械臂关节角度反馈的控制器。

(3)ur5.launch:

        代码如下

<?xml version="1.0"?>
<launch>
  <arg name="limited" default="false"  doc="If true, limits joint range [-PI, PI] on all joints." />
  <arg name="paused" default="false" doc="Starts gazebo in paused mode" />
  <arg name="gui" default="true" doc="Starts gazebo gui" />
  
  <!-- startup simulated world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <!-- <arg name="world_name" default="$(find RobotGazebo)/worlds/robot.world"/> -->
  </include>

  <!-- send robot urdf to param server -->
  <include file="$(find Robot_ft_sensor_Description)/launch/ur5_upload.launch">
    <arg name="limited" value="$(arg limited)"/>
  </include>

  <!-- push robot_description to factory and spawn robot in gazebo -->
  <node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot -z 0.85" respawn="false" output="screen" />

  <include file="$(find Robot_ft_sensor_Gazebo)/launch/controller_utils.launch"/>

  <!-- start this controller -->
  <rosparam file="$(find Robot_ft_sensor_Gazebo)/controller/robot_controller.yaml" command="load"/>
  <node name="robot_controller_spawner" pkg="controller_manager" type="spawner" args="robot_controller" output="screen"/>


</launch>

关键部分:

  <!-- send robot urdf to param server -->
  <include file="$(find Robot_ft_sensor_Description)/launch/ur5_upload.launch">
    <arg name="limited" value="$(arg limited)"/>
  </include>



  <!-- push robot_description to factory and spawn robot in gazebo -->
  <node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot -z 0.85" respawn="false" output="screen" />



  <include file="$(find Robot_ft_sensor_Gazebo)/launch/controller_utils.launch"/>



  <!-- start this controller -->
  <rosparam file="$(find Robot_ft_sensor_Gazebo)/controller/robot_controller.yaml" command="load"/>
  <node name="robot_controller_spawner" pkg="controller_manager" type="spawner" args="robot_controller" output="screen"/>

第一段:引用之前的ur5_upload.launch文件,将模型文件作为参数robot_description上传至参数服务器。

第二段:告诉Gazebo从参数服务器的robot_description读取模型文件。

第三段:引入controller_utils.launch文件,启动机械臂关节角度反馈控制器。

第四段:读取robot_controller.yaml文件配置,启动我们自己设置的robot_controller控制器。

4.查看力传感器是否正常工作

        启动ur5.launch文件,使用rostopic list命令,如图

        发现ft_sensor_topic和robot_controller/command两个话题如期出现,查看一下ft_sensor_topic如下。

         以上就是力传感器数据,注意貌似Z方向上力不为零,这是由于根据上述的力传感器坐标轴方向,Z方向会承受传感器本身的重力。

        所有代码会在机械臂末端柔顺控制(Ros+Gazebo仿真实现)完成之后全部开源。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2 如何给Gazebo中的仿真机械臂添加一个力传感器? 的相关文章

  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont
  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在
  • u-boot的启动模式(面试常考)

    交互模式 uboot启动之后 xff0c 在倒计时减到0之前按任意键 xff0c uboot会进入到交互模式 xff0c 此时可以输入各种uboot命令 和uboot进行交互 自启动模式 uboot启动之后 xff0c 在倒计时减到0之前不
  • vins-fusion代码理解

    代码通读了一遍做些总结 xff0c 肯定有很多理解错了的地方 xff0c 清晰起见详细程序都放到引用链接里 从rosNodeTest cpp开始 main函数 ros span class token operator span span
  • vins博客的一部分1

    文章目录 imu callbackimg callback imu callback 从话题中读入各个数据的t x y z g y r xff0c 存放到acc和gry中 span class token comment 从话题读入 spa
  • vins博客的一部分2

    sync process 对两个imgBuf里的图像进行双目时间匹配 xff08 通过判断双目图像时间之差 lt 3ms xff09 xff0c 扔掉匹配不到的老帧 span class token keyword double span
  • vins博客的一部分3

    FeatureTracker trackImage 包含了 xff1a 帧间光流法 区域mask 检测特征点 左右目光流法匹配 计算像素速度 画图 跟踪上一帧的特征点 如果已经有特征点 xff0c 就直接进行LK追踪 xff0c 新的特征点
  • vins博客的一部分4

    processMeasurements 取出数据 将 featureBuf中 xff0c 最早帧的feature取出 xff1a feature 61 featureBuf front 节点的接收IMU的消息再imu callback中被放
  • vins博客的一部分5

    目录 initFirstIMUPose xff08 xff09 processIMU propagate initFirstIMUPose xff08 xff09 得到IUM的Z与重力对齐的旋转矩阵 xff1a IMU开始很大可能不是水平放
  • vins博客的一部分6

    processImage 输入是本帧的特征点 id cam id xyz uv vxvy 包含了检测关键帧 估计外部参数 初始化 状态估计 划窗等等 检测关键帧 选择margin帧 addFeatureCheckParallax 检测和上一
  • vins博客的一部分7

    目录 initFramePoseByPnP frame count Ps Rs tic ric triangulate frame count Ps Rs tic ric initFramePoseByPnP frame count Ps
  • vins博客的一部分8

    目录 optimization slideWindow optimization 优化先验残差 重投影残差 预积分残差 xff08 即要拟合的目标是 xff0c 之前边缘化后的先验值 xff0c 前后帧之间的IMU的预积分值 xff0c 每
  • 以下为WindowsNT下32位 C++程序,请计算sizeof的值

    转帖地址 xff1a http hi baidu com hikeba blog item 68ad9f10a7dd8003213f2ecf html char str 61 34 hello 34 char p1 61 str int n
  • vins博客的一部分9

    目录 IMUFactor xff08 imu约束 xff09 ProjectionTwoFrameOneCamFactor xff08 视觉约束 xff09 marginalize 边缘化约束 IMUFactor xff08 imu约束 x
  • fiesta论文翻译和代码

    论文 体素信息结构 VIS Namemean符号position体素坐标posoccupancy占用概率occESDF到最近障碍物的欧几里得距离disClosest Obstacle Coordinate最近障碍物的体素坐标cocobser
  • ROS中四元数、欧拉角、旋转矩阵等格式转换

    未完 ROS接收到odometry格式消息 xff1a nav msgs span class token operator span Odometry pos msg 具有 xff1a pos msg span class token p
  • lio-sam中雅克比推导

    lio sam做的是scan map xff0c 点变到世界系下 xff0c 优化本帧在是世界系下的位姿 xff0c 和loam有所不同 符号 xff1a 本帧特征点云 xff08 相对机体系 xff09 P s c a
  • Xavier瑞泰载板烧录系统与CUDA环境安装

    实验室瑞泰载板的Xavier刷机过程 xff0c 不可用nvidia官方刷机方法 xff0c 以下部分基本和瑞泰教程类似 xff1a 下载文件 下载前 xff0c 需要注意版本对应关系 xff0c 这里安装L4T 32 4 3 和 JetP
  • xavier nx 安装realsense

    1 安装realsense viewer git clone https github com jetsonhacks installRealSenseSDK cd installRealSenseSDK sudo installLibre
  • 【草稿】已有ubuntu,安装win10遇到的问题记录

    磁盘分区 xff1a 把 home拆分一块安装win10 xff0c 需要在临时系统中分区 xff0c 不然已经挂载的磁盘会带锁 xff0c 没法拆分卷 xff1a 使用ubuntu启动盘启动系统 xff0c try Ubuntu with

随机推荐

  • 欧拉角顺序与转换

    更多转换见 xff1a 基于eigen实现 基于python实现 这里就记录下顺序 xff1a 运算是左乘 xff0c 下面方式记作Z Y X顺序 xff0c 先绕x轴roll 再绕y轴pitch 最后绕z轴yaw xff0c 即为RPY
  • ubuntu20.04 python pycharm使用cv_bridge的问题

    1 终端python运行下面会报错 xff1a from cv bridge boost cv bridge boost import getCvType ImportError lib libgdal so 26 undefined sy
  • demo:图像处理 matlab实现迭代法全局阈值分割和局部自适应阈值分割

    全局阈值分割 迭代法阈值获取方法 xff1a 1 xff09 选取一个的初始估计值T xff08 128 xff1b 2 xff09 用T分割图像 这样便会生成两组像素集合 xff1a G1由所有灰度值大于T的像素组成 xff0c 而G2由
  • Ubuntu 实用内核更新实录

    1 更新软件及内核源码 xff1a sudo apt get install gcc make libncurses5 dev openssl libssl dev sudo apt get install build essential
  • matlab工具箱下载权限受限:您的管理员限制了您对此mathworks产品的下载权限

    我也不知道我为啥安装的时候audio toolbox没安 xff0c 可能有的同学安装matlab时也没有全选所有组件 xff0c 后来用的时候发现下载不了 xff1a 在附加功能管理器中 xff0c MathWorks 工具箱和产品这一部
  • demo:用matlab app designer做一个简易app

    GUI xff08 guide xff09 的教程挺多 xff0c 但app designer是matlab后续版本中才添加的 xff0c 界面更友好但度娘资源比较少 1 点击新建 APP设计工具 xff0c 或者直接在命令行输入appde
  • matlab 数值计算课 二阶微分方程-龙格库塔方法 & ODE45

    详见mathworks 龙格库塔方法 写成矩阵 xff08 状态方程 xff09 的形式更简洁一点 xff08 其实这两种方法结果是一样的 xff0c 如果C是 1 0 0 的话 xff0c 就很明显了 xff09 例如 xff1a 求系统
  • 第一篇simulink电路仿真

    连接一个最基本的二阶RLC震荡电阻 元器件的位置如图 xff1a RLC和电流表电压表在Simscape Foundation Library Electrical下可以找到 xff0c 如图 xff1a 单纯利用这些基本电路元件连接运行会
  • 阿里云Linux系统图形化界面

    https help aliyun com knowledge detail 41227 html
  • source devel/setup.bash bash: devel/setup.bash: No such file or directory解决方法

    看到网上一些解决方法是进入 bashrc把source opt ros kinetic setup bash这句话去掉之类的 xff0c 真是感到欲哭无泪 把这句话去掉只是让这个错误不再显示而已 xff0c 根本不能解决问题 根据报错信息很
  • 基于LQR的倒立摆控制——python代码——dlqr步骤推导

    推荐一个自动控制小车开源项目 xff1a 本文结合老王自动驾驶控制算法第五讲的离散LQR进行学习复盘 Inverted Pendulum Control PythonRobotics documentation dlqr原理 xff08 老
  • 【OpenMV小车——第1.2篇】OpenMV主控板的简介与入门使用

    前言 xff1a 视觉小车最重要的是视觉功能 xff0c 其实现方式主要有 xff1a Opencv 43 外置计算机摄像头 需要计算机作为上位机 Stm32 43 OV7670 较难 xff0c 大师级 OpenMV摄像头 较简单 xff
  • Windows 配置 C/C++ 开发环境

    文章目录 1 安装 MinGW w641 1 下载1 2 解压到合适的目录下1 3 添加到环境变量1 4 测试是否安装成功 2 安装 CMake2 1 下载2 2 解压到合适的目录下2 3 添加到环境变量2 4 测试是否安装成功 3 编译运
  • I.MX6ULL的SPI通信

    简述 SPI是串行外设接口 xff08 Serial Peripheral Interface xff09 的缩写 xff0c 相比于I2C最高400bps的传输速度 xff0c SPI每秒可以传输的数据可以高达几十M甚至上百Mbit 1
  • 信号量与互斥量的区别

    信号量 xff1a 那是多线程同步用的 xff0c 一个线程完成了某一个动作就通过信号告诉别的线程 xff0c 别的线程再进行某些动作 互斥量 xff1a 这是多线程互斥用的 xff0c 比如说 xff0c 一个线程占用了某一个资源 xff
  • C语言常用转义字符表

    C语言常用转义字符表 转义字符 xff1a 转义字符分为一般转义字符 八进制转义字符 十六进制转义字符 一般转义字符 xff1a 背诵 0 n 八进制转义字符 xff1a 141 是合法的 xff0c 前导的0是不能写的 十六进制转义字符
  • 2018年App测试流程及要点梳理

    先说说 xff0c 为什么要给大家梳理App测试流程和要点呢 xff1f 主要是缘于有太多同学咨询相关App测试的问题 xff0c 回答的次数多了 xff0c 就不想打字了 xff0c 还不如这样全部帮你们整理好 xff0c 希望各位看到的
  • 毕业设计--球上自平衡机器人

    目录 前言 一 机器人原理分析 二 控制器设计 三 程序部分 四 硬件清单 五 电路设计 六 结构设计 七 总结与展望 总结 展望 2021 8 18更新 xff1a 看到评论区很多人对这个机器人比较感兴趣 xff0c 把之前挖好的坑填一下
  • ROS入门之CmakeList.txt详讲

    本文为进来学习的总结 xff0c 记录了学习CmakeList txt文档的各个步骤 xff0c 适合从零开始理解CmakeList txt xff0c 可能存在错误之处 xff0c 望批评指正 0 Cmake的起源 为什么有CmakeLi
  • 2 如何给Gazebo中的仿真机械臂添加一个力传感器?

    1 你得有一个仿真机械臂 简单地说你首先的拥有一个能够在Gazebo当中使用的机械臂的URDF文件 xff0c 必须要包含visual collision和inertial三大标签 出于个人习惯 xff0c 这里直接使用UR官方提供的UR5