gazebo仿真简介
1. gazebo基本介绍¶
gazebo是一款免费的机器人仿真软件,其提供高保真度的物理模拟,一整套传感器模型,以及对用户和程序非常友好的交互方式。能够在复杂的室内和室外环境中准确高效地模拟机器人工作的功能,通常与ROS联合使用,为开发者提供了优异的仿真环境。
gazebo支持urdf/sdf格式文件,后文会提及两者的区别,它们均用于描述仿真环境,官方也提供了一些集成好的常用的模型模块,可以直接导入使用。
基本应用¶
- 测试机器人算法
- 设计机器人
- 用显示场景进行回归测试
基本特点¶
- 包含多个物理引擎(ode,bullet,simbody和dart。默认的物理引擎是ode)
- 包含丰富的机器人模型和环境库
- 包含多样的传感器
- 程序设计便捷,图形界面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优点:
- 可以精确描述机器人的各类性质,除了传统的运动学特性之外,还可以为机器人定义传感器、表面属性、纹理、关节摩擦等;
- 提供了定义各种环境的方法。包括环境光照、地形等;
- 使用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
话题控制车辆运行