Gazebo仿真学习——2.为Gazebo中的机器人添加实用插件

2023-05-16

Gazebo plugins in ROS

  • 1. 要了解
  • 2. 插件类型
  • 3. 添加一个ModelPlugin
  • 4. 添加一个SensorPlugin
  • 5. gazebo_plugins中的所有可用插件
    • 5.1 Camera
    • 5.2 GPU Laser(激光测距传感器)
    • 5.3 Laser
    • 5.4 其他

1. 要了解

Gazebo插件为URDF模型提供了更大的功能,并且可以将ROS消息和服务调用捆绑在一起以用于传感器输出和电动机输入。

2. 插件类型

凉亭支持几种插件类型,它们都可以连接到ROS,但是只能通过URDF文件引用几种类型:

  • ModelPlugins,提供对Physical :: Model API的访问
  • SensorPlugins,用于提供对传感器的访问:: Sensor API
  • VisualPlugins,提供对render :: Visual API的访问

3. 添加一个ModelPlugin

把ModelPlugin插入< robot >元素内的URDF中,它包含有< gazebo >标签,以指示传递给Gazebo的信息。

<robot>
  ... robot description ...
  <gazebo>
    <plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">
      ... plugin parameters ...
    </plugin>
  </gazebo>
  ... robot description ...
</robot>

在凉亭内加载机器人模型后,将为diffdrive_plugin代码提供对模型本身的引用,以允许其进行操作。

4. 添加一个SensorPlugin

指定传感器插件的时候,Gazebo中的传感器应该连接到link上,所以描述该传感器的< gazebo >必须被赋予对该link的引用。

<robot>
  ... robot description ...
  <link name="sensor_link">
    ... link description ...
  </link>

  <gazebo reference="sensor_link">
    <sensor type="camera" name="camera1">
      ... sensor parameters ...
      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
        ... plugin parameters ..
      </plugin>
    </sensor>
  </gazebo>

</robot>

如果在凉亭内加载机器人模型,camera_controller代码将被赋予对传感器的引用,从而可以访问其API。

5. gazebo_plugins中的所有可用插件

每个部分的名称都是从插件类名称派生的。例如,“ Block Laser”来自GazeboRosBlockLaser类,可以在文件gazebo_plugins / src / gazebo_ros_block_laser.cpp中找到。

5.1 Camera

描述:提供了ROS接口,用于通过发布sensor_msgs中所述的CameraInfo和Image ROS消息来模拟wge100_camera之类的摄像机。

示例:在RRBot摆臂末端安装了RGB相机,link3上边的红色框表示相机。
在这里插入图片描述

  <joint name="camera_joint" type="fixed">
    <axis xyz="0 1 0" />
    <origin xyz="${camera_link} 0 ${height3 - axel_offset*2}" rpy="0 0 0"/>
    <parent link="link3"/>
    <child link="camera_link"/>
  </joint>

  <!-- Camera -->
  <link name="camera_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
	<box size="${camera_link} ${camera_link} ${camera_link}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
	<box size="${camera_link} ${camera_link} ${camera_link}"/>
      </geometry>
      <material name="red"/>
    </visual>

    <inertial>
      <mass value="1e-5" />
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
    </inertial>
  </link>

Gazebo插件提供了摄像头功能,把图像发布到ROS消息中,在rrbot.gazebo中:

  <!-- camera -->
  <gazebo reference="camera_link">
    <sensor type="camera" name="camera1">
      <update_rate>30.0</update_rate>
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>800</width>
          <height>800</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <!-- Noise is sampled independently per pixel on each frame.
               That pixel's noise value is added to each of its color
               channels, which at that point lie in the range [0,1]. -->
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>rrbot/camera1</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera_link_optical</frameName>
        <!-- setting hackBaseline to anything but 0.0 will cause a misalignment
            between the gazebo sensor image and the frame it is supposed to
            be attached to -->
        <hackBaseline>0.0</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
        <CxPrime>0</CxPrime>
        <Cx>0.0</Cx>
        <Cy>0.0</Cy>
        <focalLength>0.0</focalLength>
      </plugin>
    </sensor>
  </gazebo>

Gazebo内每秒拍摄一次新相机图像的次数:

<update_rate>30.0</update_rate>

假定像素为正方形,填写这些值以匹配物理相机的规格,近片段和远片段是特定于仿真的参数,为摄像机在仿真中可以看到对象的距离提供了上限和下限。:

        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>800</width>
          <height>800</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>

实际的gazebo_ros / gazebo_ros_camera.cpp文件在此处链接为共享对象:

      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">

这里为图像主题和相机信息主题定义了相机将发布到的rostopic:

        <cameraName>rrbot/camera1</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>

它们分别为:

/rrbot/camera1/image_raw
/rrbot/camera1/camera_info

图像在tf树中发布的坐标框架:

        <frameName>camera_link_optical</frameName>

测试一下

roslaunch rrbot_gazebo rrbot_world.launch
roslaunch rrbot_description rrbot_rviz.launch

在Gazebo中添加一座房子,Camera传回图像:
在这里插入图片描述在这里插入图片描述

5.2 GPU Laser(激光测距传感器)

通过广播LaserScan消息来模拟激光测距传感器,在RRBot中:

  <joint name="hokuyo_joint" type="fixed">
    <axis xyz="0 1 0" />
    <origin xyz="0 0 ${height3 - axel_offset/2}" rpy="0 0 0"/>
    <parent link="link3"/>
    <child link="hokuyo_link"/>
  </joint>

  <!-- Hokuyo Laser -->
  <link name="hokuyo_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
	<box size="0.1 0.1 0.1"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://rrbot_description/meshes/hokuyo.dae"/>
      </geometry>
    </visual>

    <inertial>
      <mass value="1e-5" />
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
    </inertial>
  </link>

从代码看出:这次使用的是网格物体,而不是仅使用可视模型的矩形:

        <mesh filename="package://rrbot_description/meshes/hokuyo.dae"/>

同理,将其信息添加到rrbot.gazebo中:

  <!-- hokuyo -->
  <gazebo reference="hokuyo_link">
    <sensor type="gpu_ray" name="head_hokuyo_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>false</visualize>
      <update_rate>40</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>720</samples>
            <resolution>1</resolution>
            <min_angle>-1.570796</min_angle>
            <max_angle>1.570796</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <!-- Noise parameters based on published spec for Hokuyo laser
               achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
               stddev of 0.01m will put 99.7% of samples within 0.03m of the true
               reading. -->
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
        <topicName>/rrbot/laser/scan</topicName>
        <frameName>hokuyo_link</frameName>
      </plugin>
    </sensor>
  </gazebo>

这里如果为true,则在gpu激光的扫描区域内可以看到半透明的激光射线:

      <visualize>false</visualize>

将这些设置为将激光扫描发布到的ROS主题名称,以及TF使用的转换框架:

        <topicName>/rrbot/laser/scan</topicName>
        <frameName>hokuyo_link</frameName>

测试一下

roslaunch rrbot_gazebo rrbot.launch
roslaunch rrbot_description rrbot_rviz.launch

5.3 Laser

非GPU版本的GPU Laser,但本质上使用相同的代码,将:

    <sensor type="gpu_ray" name="head_hokuyo_sensor">

替换为:

    <sensor type="ray" name="head_hokuyo_sensor">

将:

      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">

替换为:

      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">

5.4 其他

  • Multicamera
  • Depth Camera
  • Openni Kinect
  • Block Laser
  • IMU (GazeboRosImu)
  • IMU sensor (GazeboRosImuSensor)
  • Joint Pose Trajectory
  • P3D (3D Position Interface for Ground Truth)
  • Projector
  • Prosilica Camera
  • Bumper
  • Differential Drive
  • Skid Steering Drive
  • Video Plugin
  • Planar Move Plugin
  • Template
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gazebo仿真学习——2.为Gazebo中的机器人添加实用插件 的相关文章

随机推荐

  • HTTP Digest authentication

    什么是摘要认证 摘要认证 xff08 Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为HTTP协议开发的 xff0c 因而也常叫做HTTP摘要 xff0c 在RFC2617中描述 其身份验证
  • 简单的netfilter hook函数注册以及内核链表的使用

    include lt linux netfilter h gt include lt linux init h gt include lt linux module h gt include lt linux netfilter ipv4
  • 详述GPS原理及RTK技术应用

    完整的PPT文档在这里 xff1a 详述GPS原理及RTK技术应用 1 GPS概述 1 1定义 全球定位系统GPS xff08 Global Position System xff09 xff0c 全称为NAVSTAR GPS xff08
  • PHP HTTP Digest校验

    PHP作为客户端进行HTTP Digest校验 span class token comment 请求方法 span span class token variable username span span class token oper
  • Http Digest认证协议

    其认证的基本框架为挑战认证的结构 xff0c 如下图所示 xff1a xfeff xfeff 1 客户端希望取到服务器上的某个资源 xff0c 向服务器发送Get请求 2 服务器收到客户端的请求后 xff0c 发现这个资源需要认证信息 xf
  • Postman 安装

    Postman 的下载安装 Postman是一个用于构建和使用API的API平台 xff08 接口的调试工具 xff09 选择对应的系统和版本进行下载 https github com hlmd Postman cn 这里我的电脑是wind
  • 【安卓自定义控件系列】自绘控件打造界面超炫功能超强的圆形进度条

    在前面我们讲过了安卓自定义控件三种方式中的组合控件 xff0c 现在我们来讲解一下通过自绘的方式来实现自定义控件 xff0c 本博客将以自定义圆形进度条为例向大家讲解自定义控件的知识 xff0c 首先来看一下效果图吧 xff0c 这个是本人
  • Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员 Linux网络编程 哔哩哔哩 bilibili https www bilibili com video BV1iJ411S7UA p 61 37 目录 一 高并发服务器 1 1 图示 1 2 分类 二 多进程并发服务
  • http请求头和响应头

    文章目录 参考HTTP通用标头Cache ControlConnectionDatePragmaTrailerTransfer EncodingUpgradeViaWarning 请求头AcceptAccept RangesAccept E
  • C++如何使用libcurl发送post请求的三种content-type的封装

    作者 xff1a 虚坏叔叔 博客 xff1a https xuhss com 早餐店不会开到晚上 xff0c 想吃的人早就来了 xff01 x1f604 C 43 43 如何使用libcurl发送post请求的三种content type的
  • 开源四轴飞行器CC3D的稳定模式和PID算法简介

    本文主要介绍一下CC3D的两大飞行模式的原理 xff1a 1 Rate 2 Attitude 以及PID的基本原理 至于AxisLock模式及Manual xff0c 日后续说 笔者是CC3D开源飞控入门玩家 xff0c 遇到过不少磕磕碰碰
  • 了解git分支和版本管理

    0 Git分支和标签的命名规范 1 分支 dev test pre pro 即master 2 标签 Tag格式 xff1a 主版本号 次版本号 修订号 类型标签 xff0c 其中类型标签可为 xff1a alpha beta rc r T
  • ubuntu下解决高并发socket最大连接数限制,tcp默认1024个连接

    nux系统默认ulimit为1024个访问 用户最多可开启的程序数目 一般一个端口 xff08 即一个进程 xff09 的最高连接为2的16次方65536 通过这个命令 ulimit n 可以看到默认值为1024 查看全局文件句柄数限制 系
  • Linux下实现Post方式

    首先了解HTTP协议各字段的含义 xff0c 以下是部分较好的归纳 xff1a HTTP一个HTTP请求报文由请求行 xff08 request line xff09 请求头部 xff08 header xff09 空行和请求数据4个部分组
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • yolo_v3安装试运行小记

    github源代码 xff1a https github com qqwweee keras yolo3 Cuda下载地址 xff1a https developer nvidia com cuda toolkit archive Cudn
  • pytorch安装使用

    pytorch官网 xff1a https pytorch org get started locally conda添加清华源 xff1a conda config add channels https mirrors tuna tsin
  • ORB_SLAM3初试

    源码地址 xff1a orb salm3 github 论文地址 orb slam3 paper ORB SLAM3提供了单目 xff0c 双目 xff0c rgbd 以及各自结合IMU的数据分析实现 demo运行效果展示 xff1a 在不
  • vins-fusion代码解读[五] imu在vins里的理解

    SLAM新手 xff0c 欢迎讨论 IMU作用 vins中 xff0c IMU只读取IMU六轴的信息 xff0c 3轴线加速度 xff08 加速度计 xff09 和3轴角速度 xff08 陀螺仪 xff09 通过对陀螺仪的一次积分 xff0
  • Gazebo仿真学习——2.为Gazebo中的机器人添加实用插件

    Gazebo plugins in ROS 1 要了解2 插件类型3 添加一个ModelPlugin4 添加一个SensorPlugin5 gazebo plugins中的所有可用插件5 1 Camera5 2 GPU Laser xff0