Skip to content

Latest commit

 

History

History
533 lines (386 loc) · 16.8 KB

Gazebo.md

File metadata and controls

533 lines (386 loc) · 16.8 KB

Gazebo

Install

# Ubuntu 22.04(会与Garden冲突)
$ sudo apt install ros-humble-gazebo-ros-pkgs

# Test
# 加载模型
$ gazebo --verbose /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world
# 触发行进
$ ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear: {x: 1.0}}' -1

# 导入模型~/.gazebo/model
$ wget -c https://github.com/osrf/gazebo_models/archive/refs/heads/master.zip
  • 对应的版本:
ROS version Gazebo version
Ubuntu18.04 Melodic Gazebo 9.x
Ubuntu20.04 Noetic Gazebo 11.11.0
Foxy Gazebo 11.x
Ubuntu22.04 Rolling Gazebo 11.10.2
# >>> Install >>>
# 仅适用于Ubuntu20.04 和 Ubuntu22.04
$ sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install gz-garden

# >>> Uninstall >>>
$ sudo apt remove gz-garden && sudo apt autoremove

Environment Variable

🔧 用例 1: 相关的环境变量配置
# 插件的环境变量
$ export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:<插件位置>

# 可作为sdf中<uri>model://<...></uri>的相对路径
$ export GAZEBO_MODEL_PATH=<模型位置>

File

文件格式 编辑或可视化工具 备注
URDF rviz, vscode, foxyglove 用于表示单个模型
xacro rviz, foxyglove 用于表示模型,使用时需要转换为URDF格式
.stl Open3D STL 文件(只含单一颜色)
.dae Blender Collada 文件(含纹理,颜色)
.sdf / .world gazebo 用于描述多个模型(插件、传感器文件)+ 表示世界;不适用于 ROS
🔧 用例 1: 用 Gazebo 打开 .world 文件(即 sdf 格式的文件)(CLI) SDF(Simulation Description Format),专属于 Gazebo 的格式,相关标签信息可参考 [Here](http://sdformat.org/spec?ver=1.11&elem=link)
# 方案 1:
(ROS) $ gazebo <.world>
# 方案 2:
(ROS) $ rosrun gazebo_ros gazebo TD3.world

# 方案 3:
(ROS) $ gzserver # 无图形化界面
(ROS) $ gzclient # 追加图形化界面
# -u: 以暂停模式打开

# 方案 4:
(ROS1) $ roslaunch gazebo_ros empty_world.launch
🔧 用例 2: 验证当前的 URDF 文件是否合法,合法时输出对应的 sdf 文件

方案 1:

$ gz sdf -p <URDF 文件>

方案 2:(纯粹检查 URDF 的合法性)

# sudo apt install liburdfdom-tools
$ check_urdf calibration.urdf
🔧 用例 3: 将 Xacro 文件转换为 URDF 文件,含语法检查
# for Melodic
$ xacro --inorder model.xacro > model.urdf
# for Noetic+
$ xacro model.xacro > model.urdf

Model

🔧 用例 1: 修改 world 的物理量:界面背景色和自然光
🔧 用例 2: 在 Gazebo 中实现模型建模
🔧 用例 3: 设置模块不受重力影响

方案 1:设置所有模块不受影响

<gazebo>
    <static>true</static>
</gazebo>

方案 2:绑定到 world 坐标系

<link name="world"/>
<joint name="world_joint" type="fixed">
<origin xyz="2 0 1.5" rpy="0 0 0"/>
<parent link="world"/>
<child link="子link"/>
</joint>
🔧 用例 4: 指定 Gazebo 模型的颜色
<gazebo reference="link1">
    <material>Gazebo/Orange</material>
</gazebo>
🔧 用例 5: Gazebo 中的模型偏暗

去除 Shadow 属性

🔧 用例 6: 使用 Gazebo 搭建虚拟场景

Edit | Building Editor(或 CTRL+B)

🔧 用例 7: 搭建差速模型插件

TODO

🔧 用例 8: 构建基础模型

文件的配置具体参考 Here

🔧 用例 9: 使用 Orge Material Script 进行贴图

Visualization

🔧 用例 1: 可视化 Xacro 和 URDF 文件(Launch
<!-- for Xacro-->
<param name="robot_description" command="xacro 'xacro文件名'"/>
<!-- for URDF-->
<param name="robot_description" textfile="urdf文件名"/>
🔧 用例 2: 在 WEB 端查看 URDF 文件(Mymodelrobot
🔧 用例 3: 使用 Foxyglove 查看 URDF 文件

https://foxglove.dev/docs/studio/panels/3d#add-unified-robot-description-format-urdf

# >>> Install >>>
$ wget -c https://github.com/foxglove/studio/releases/download/v1.39.0/foxglove-studio-1.39.0-linux-amd64.deb
$ sudo dpkg -i foxglove-studio-1.39.0-linux-amd64.deb

🔧 用例 4: 使用 VSCode 查看 URDF 文件

🔧 用例 5: 使用 RViz 可视化 URDF 文件

[!note]

若是 XACRO 生成的文件,需要删除顶部的注释,否则会影响发布的主题 /robot_description 具体原因未知

rosrun

(ROS1) $ rosrun robot_state_publisher robot_state_publisher <URDF 文件>
(ROS2) $ ros2 run robot_state_publisher robot_state_publisher <URDF 文件名>

roslaunch

对于 ROS1 RVIZ launch(需 TF + Link + 时钟源正确才能显示)

<launch>

    <param name="/use_sim_time" value="false"/>

    <!-- Load the URDF into the ROS Parameter Server -->
    <param name="robot_description" command="$(find xacro)/xacro 'calibration.urdf'"/>

    <!-- 启动Gazebo -->
    <node name="gazebo" pkg="gazebo_ros" type="gazebo" respawn="false" output="screen"/>

    <!-- 导入相机模型 -->
    <node name="d435i_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model realsense_d435i -param robot_description"/>

    <!-- 发布TF -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>

</launch>

Plugins

具体参考 Here

插件 备注
model plugin 需要 robot 根标签和 gazebo 子标签
sensor plugin 需要提供 robot 标签,link,gazebo 子标签
🔧 用例 1: 使用 libgazebo_ros_camera 插件如何获取相机的内参?
(ROS1) $ rostopic echo camera_info
🔧 用例 2: 如何检查插件是否成功导入

启动 gazebo 时,追加 --verbose 选项

Shortcut

🔧 用例 1: 快捷鍵

具体参考 Here

快捷键 作用
CTRL+T topic selector
🔧 用例 2: 在 Docker 中启动 Gazebo

实测 VNC 下无效,使用 host 的 XServer 则有效

$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia gazebo

Others

🔧 用例 1: 常用命令行
# 追加模型,启动后含格式检测
# 启动含服务的gazebo
(ROS1) $ rosrun gazebo_ros gazebo
(ROS1) $ rosrun gazebo_ros spawn_model -file <文件名> -sdf -model <模型名> -y 1

# 启动含服务的gazebo
(ROS2) $ gazebo --verbose -s libgazebo_ros_factory.so
(ROS2) $ ros2 run gazebo_ros spawn_entity.py -file <文件名> -entity <模型名> -topic /robot_description
🔧 用例 2: ROS 主题和服务
服务名 服务类型 作用
/gazebo/pause_physics std_srvs/Empty 暂停物理引擎的更新(物理运动如物体移动)会暂停,仿真时间也会停止。特别适合需要在静止环境中进行观察。
/gazebo/unpause_physics std_srvs/Empty 恢复物理引擎的更新
/gazebo/reset_simulation std_srvs/Empty 重置模型的位置、状态、仿真时间)
/gazebo/reset_world std_srvs/Empty 重置模型的位置和状态,但不会重置仿真时间
/gazebo/set_model_state gazebo/SetModelState 重置模型的位置
主题名 主题类型 作用
/gazebo/set_model_state gazebo_msgs/ModelState 重置模型的位置
rospy.ServiceProxy("/gazebo/unpause_physics", Empty)
rospy.wait_for_service("/gazebo/unpause_physics")
try:
    rospy.ServiceProxy("/gazebo/unpause_physics", Empty)
except (rospy.ServiceException) as e:
    print("/gazebo/unpause_physics service call failed")
🔧 用例 3: 搭建虚拟展厅

🔧 用例 4: world to grid_map

通过基于栅格的判断该区域是否可行,来取代之前的 if else 判断,用于强化学习中判断某个区域是否可行

# 实测,可直接使用
# 安装相关依赖
$ apt install ros-${ROS_DISTRO}-move-base ros-${ROS_DISTRO}-map-server
$ git clone https://github.com/marinaKollmitz/gazebo_ros_2Dmap_plugin
$ catkin build
$ rosservice call /gazebo_2Dmap_plugin/generate_map
$ rosrun map_server map_saver -f <map_name> /map:=/map2d

相似的还有 Eric_Pxz 提供的插件,具体参考 Here

🔧 用例 5: grid_map to world
🔧 用例 6: gazebo to height map (for ROS2)
🔧 用例 7: pointcloud to world

FAQ

问题 1: 为什么有的物体在 Gazebo 中无法被激光雷达扫描?

该物体没有 collision 标签

问题 2: Gazebo 启动后黑屏,加载时间过长

检查 .world 文件是否有不存在的资源。其中,基础模型可以在 GitHub 下载如:

$ git clone https://github.com/osrf/gazebo_models.git --depth=1 ~/.gazebo/models
问题 3: origin 所表示的含义

joint 的 origin 是 joint 相对于父系的

Reference

摘要 ROS2 ROS1
官方文档 https://classic.gazebosim.org/tutorials?tut=ros2_overview https://classic.gazebosim.org/tutorials?tut=ros_overview#Tutorial:ROSintegrationoverview
官方 API https://github.com/gazebosim/gazebo-classic/blob/gazebo11/Migration.md
Ignition API https://osrf-distributions.s3.amazonaws.com/ign-math/api/1.0.0/namespaceignition.html
摘要 Gazebo Sim Gazebo-classic
官方文档 https://gazebosim.org/home https://classic.gazebosim.org/