跳转至

gazebo仿真简介

1. gazebo基本介绍

gazebo是一款免费的机器人仿真软件,其提供高保真度的物理模拟,一整套传感器模型,以及对用户和程序非常友好的交互方式。能够在复杂的室内和室外环境中准确高效地模拟机器人工作的功能,通常与ROS联合使用,为开发者提供了优异的仿真环境。

gazebo支持urdf/sdf格式文件,后文会提及两者的区别,它们均用于描述仿真环境,官方也提供了一些集成好的常用的模型模块,可以直接导入使用。

基本应用

  1. 测试机器人算法
  2. 设计机器人
  3. 用显示场景进行回归测试

基本特点

  1. 包含多个物理引擎(ode,bullet,simbody和dart。默认的物理引擎是ode)
  2. 包含丰富的机器人模型和环境库
  3. 包含多样的传感器
  4. 程序设计便捷,图形界面UI合理

2. 性能要求及安装

性能要求

  • 操作系统要求:ubuntu或其他linux发行版
  • 其余要求
GPU:Nvidia显卡配置,当然在场景简单时,可以只使用CPU;
CPU:至少是intel I5及以上的产品;
内存:至少500MB的磁盘空间,这里建议尽量大,8G+即可;

gazebo11安装

如果安装过旧版的gazebo,先卸载

# 首先查看gazebo的版本,确定是旧版本
dpkg -l | grep gazebo

# 卸载gazebo旧版本及其相关插件
sudo apt remove gazebo9 gazebo9-common gazebo9-plugin-base libgazebo9:amd64 libgazebo9-dev:amd64 ros-melodic-gazebo-*

# 清理缓存及安装包
sudo apt autoremove
sudo apt autoclean

安装gazebo11

# 设置镜像
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'

# 设置Key
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

# 安装gazebo,不含gazebo_ros_pkgs
sudo apt update
sudo apt install gazebo11
sudo apt install libgazebo11-dev

3. URDF和SDF

URDF

URDF文件:统一机器人描述格式(urdf)是ROS用于描述机器人的所有元素的XML文件格式

<?xml version="1.0"?>
<robot name="mybox">
    <material name="red">
        <color rgba="1.0 0 0 1.0"/>
    </material>
    <material name="green">
        <color rgba="0 1.0 0 1.0"/>
    </material>

    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.1 0.2 1"/>
            </geometry>
            <material name="red"/>
        </visual>
    </link>
    <link name="link1">
        <visual>
            <geometry>
                <box size="0.1 0.2 1"/>
            </geometry>
            <material name="green"/>
        </visual>
    </link>

    <joint name="joint0" type="prismatic">
        <origin xyz="0 0 1" rpy="0 0 0"/>
        <axis xyz="1 1 0" />
        <parent link="base_link"/>
        <child link="link1"/>
        <limit effort="30" velocity="1.0" lower="-1" upper="1" />
    </joint>
</robot>

SDF

SDF文件:仿真描述格式(sdf),是从世界级到机器人级的所有内容的完整描述,能够描述机器人、静态和动态物体、照明、地形甚至物理学的各方面的信息。

SDF优点:

  1. 可以精确描述机器人的各类性质,除了传统的运动学特性之外,还可以为机器人定义传感器、表面属性、纹理、关节摩擦等;
  2. 提供了定义各种环境的方法。包括环境光照、地形等;
  3. 使用XML格式进行描述,能够更好的描述真实的模拟条件;

gazebo相关的包

gazebo_ros_pkgs包含了gazebo_ros、gazebo_plugins、 gazebo_msgs三个子包:

gazebo_ros:提供ROS插件,包括消息和服务发布者,以通过ROS与Gazebo进行接口 gazebo_plugins:与机器人无关的Gazebo插件,用于传感器,电机和动态可重配置组件 gazebo_msgs:消息和服务数据结构,用于ROS与Gazebo通信

4. 传感器数据获取

摄像头

<sensor name="camera" type="camera">
      <always_on>true</always_on>
      <update_rate>30</update_rate>
      <camera>
        <horizontal_fov>3.183</horizontal_fov>
        <image>
          <width>320</width>
          <height>240</height>
        </image>
        <clip>
          <near>0.1</near>
          <far>100</far>
        </clip>
        <lens>
          <type>custom</type>
          <custom_function>
            <c1>1.05</c1>
            <c2>4</c2>
            <f>1.0</f>
            <fun>tan</fun>
          </custom_function>
          <scale_to_hfov>true</scale_to_hfov>
          <cutoff_angle>3.1415</cutoff_angle>
          <env_texture_size>512</env_texture_size>
        </lens>
      </camera>

      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>30.0</updateRate>
        <cameraName>camera</cameraName>
        <frameName>camera_link</frameName>
        <imageTopicName>image</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <hackBaseline>0.07</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor>

订阅/camera/image话题获取画面

订阅/camera/camera_info获取相机详情

激光雷达

<sensor type="ray" name="lds_lfcd_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>$(arg laser_visual)</visualize>
      <update_rate>5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>0.0</min_angle>
            <max_angle>6.28319</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120</min>
          <max>3.5</max>
          <resolution>0.015</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_lds_lfcd_controller" filename="libgazebo_ros_laser.so">
        <topicName>scan</topicName>
        <frameName>base_scan</frameName>
      </plugin>
    </sensor>

订阅/scan获取激光雷达信息

IMU

<sensor type="imu" name="imu">
    <always_on>true</always_on>
    <visualize>$(arg imu_visual)</visualize>
</sensor>

5. 车辆控制

<gazebo>
    <plugin name="turtlebot3_burger_controller" filename="libgazebo_ros_diff_drive.so">
      <commandTopic>cmd_vel</commandTopic>
      <odometryTopic>odom</odometryTopic>
      <odometryFrame>odom</odometryFrame>
      <odometrySource>world</odometrySource>
      <publishOdomTF>true</publishOdomTF>
      <robotBaseFrame>base_footprint</robotBaseFrame>
      <publishWheelTF>false</publishWheelTF>
      <publishTf>true</publishTf>
      <publishWheelJointState>true</publishWheelJointState>
      <legacyMode>false</legacyMode>
      <updateRate>30</updateRate>
      <leftJoint>wheel_left_joint</leftJoint>
      <rightJoint>wheel_right_joint</rightJoint>
      <wheelSeparation>0.160</wheelSeparation>
      <wheelDiameter>0.066</wheelDiameter>
      <wheelAcceleration>1</wheelAcceleration>
      <wheelTorque>10</wheelTorque>
      <rosDebugLevel>na</rosDebugLevel>
    </plugin>
  </gazebo>

发送/cmd_vel话题控制车辆运行