激光显示
点呈现
射线呈现
rviz2
新旧版本并存的混乱
本教程旨在为在Ubuntu Jammy(最新支持Gazebo Classic包的Ubuntu版本)上运行Gazebo Classic(如Gazebo 11)的用户提供指导,这些用户计划将其代码迁移到新的Gazebo版本(如Fortress, Garden, 或Harmonic)。教程的目的是展示如何在同一台机器上同时安装Gazebo 11和新版本的Gazebo,以便用户可以并行运行旧项目并探索新版本的特性。
然而,需要注意的是,由于软件版本的快速迭代,本教程中详细介绍的Gazebo Classic版本(如Gazebo 11)可能不会在未来得到更新或支持。因此,推荐用户考虑将代码迁移到新的Gazebo版本作为长期解决方案。
关键步骤和注意事项包括:
-
确认Ubuntu版本:确保你的Ubuntu系统是Jammy(22.04)或兼容版本。
-
安装Gazebo 11:由于Gazebo 11可能不在Ubuntu Jammy的默认仓库中,你可能需要从旧版本的Ubuntu仓库、Gazebo的PPA或其他源安装。这通常涉及添加额外的软件源和依赖项。
-
安装新版本的Gazebo:通过ROS(如果你使用的是ROS)或直接从Ubuntu的apt仓库(如果可用)安装新版本的Gazebo。确保选择与你的ROS版本兼容的Gazebo版本。
-
管理版本冲突:同时安装两个版本的Gazebo可能会导致版本冲突,特别是当它们共享相同的依赖项时。你可能需要解决这些冲突,或者确保每个版本的Gazebo都使用其自己的依赖项集。
-
设置环境变量:为了能够在需要时轻松切换到不同版本的Gazebo,你可能需要设置环境变量来指定默认使用的Gazebo版本。
-
查阅文档和社区支持:由于Gazebo和ROS都是不断发展的项目,因此强烈建议查阅最新的官方文档和社区支持资源以获取帮助和更新信息。
最后,虽然本教程提供了同时安装Gazebo 11和新版本Gazebo的指导,但用户应该意识到迁移到新版本的Gazebo是长期维护和支持的更好选择。
如上可以看到各类Gazebo版本的不完全兼容与接口变化,详细可参考:
Gazebo与ROS1、ROS2接口变迁-2005-2024--CSDN博客
简洁的流程
在将使用Gazebo Classic的ROS 2项目迁移到使用新Gazebo(如Harmonic)时,有几个关键的概念性差异需要注意。这些差异主要体现在ROS 2项目与Gazebo交互的方式上。以前,Gazebo Classic通过gazebo_ros_pkgs
提供了一套插件,这些插件直接在Gazebo Classic中加载并作为仿真的一部分运行,以提供ROS和Gazebo Classic之间的接口。然而,在新的Gazebo版本中,这一机制已被ros_gz
取代,后者主要用作ROS和gz-transport
主题之间的桥梁。
本教程旨在指导用户将使用gazebo_ros_pkgs
的ROS 2包迁移到使用ros_gz
。我们以turtlebot3_simulations
包为例,展示迁移过程的步骤。在这个过程中,我们需要注意一些关键变化,并可能需要对项目的配置、启动文件等进行相应的调整。
在开始迁移之前,建议用户按照PC设置指南安装必要的先决条件,以便能够模拟Turtlebot3。这一步骤会安装一些额外的包,如Nav2和Cartographer,这些包在后续教程中可能会用到,因此不应跳过。
完成安装后,用户可以开始修改项目文件,将原来的gazebo_ros_pkgs
引用替换为ros_gz
,并更新启动文件和其他配置文件以适配新的Gazebo版本。此外,由于Gazebo版本之间可能存在API变更和功能差异,用户可能还需要对仿真场景、机器人模型或传感器配置等进行调整。
总的来说,迁移过程可能涉及多方面的更改,并且需要对Gazebo和ROS 2的新特性有一定的了解。然而,通过遵循本教程的指导,用户可以成功地将他们的ROS 2项目迁移到使用新Gazebo版本的平台,并继续利用Gazebo的强大功能进行机器人仿真和测试。
需要完整的humble-devel的turtlebot3功能包。
总结:
在将ROS 2项目从使用Gazebo Classic迁移到使用新Gazebo(如通过ros_gz
桥接)时,我们需要进行一系列关键的修改。这些修改涵盖了项目配置、启动文件、世界和模型文件以及ROS话题的桥接。以下是具体需要进行的更改概述:
- 修改
package.xml
和CMakeLists.txt
文件:- 需要将原来依赖于
gazebo
、gazebo_ros_pkgs
等包的引用替换为ros_gz
及其相关包。这包括在package.xml
中添加或更新依赖项,以及在CMakeLists.txt
中调整find_package和target_link_libraries等指令,以确保项目能够正确链接到新的库和包。
- 需要将原来依赖于
- 编辑启动Gazebo的启动文件(如
empty_world.launch.py
):- 需要更新这些文件以使用新Gazebo版本的启动命令和参数。这可能包括更改Gazebo服务器的URI、调整仿真参数或指定新的世界文件。
- 更新世界SDFormat文件:
- SDFormat(Simulation Description Format)是用于描述仿真环境的XML格式。需要确保世界文件与新Gazebo版本的兼容性,并可能需要根据新版本的特性进行更新。
- 编辑生成模型的启动文件:
- 这些文件负责在仿真环境中生成和放置机器人模型。需要更新它们以使用新Gazebo版本的API和参数,并确保模型能够正确加载和交互。
- 编辑模型SDFormat文件:
- 类似于世界文件,模型文件也需要根据新Gazebo版本的SDFormat规范进行更新。这可能包括调整模型属性、传感器配置或插件设置。
- 桥接ROS话题:
- 由于
ros_gz
主要作为ROS和gz-transport
之间的桥梁,因此可能需要设置额外的ROS节点或配置,以便在ROS和Gazebo之间桥接话题。这可以确保ROS节点能够接收来自Gazebo的传感器数据,并向Gazebo发送控制命令。
- 由于
通过这些步骤,我们可以确保ROS 2项目能够顺利迁移到使用新Gazebo版本的平台,并继续利用Gazebo的强大功能进行机器人仿真和测试。需要注意的是,具体的修改步骤可能会根据项目的具体情况和新Gazebo版本的特性而有所不同。因此,在进行迁移时,建议仔细阅读相关文档和迁移指南,并根据需要进行适当的调整。
很麻烦……
新版本
gz sim
#!/usr/bin/env python3
#
# Copyright 2019 ROBOTIS CO., LTD.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Authors: Joep Tool
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import AppendEnvironmentVariable
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
launch_file_dir = os.path.join(get_package_share_directory('turtlebot3_gazebo'), 'launch')
ros_gz_sim = get_package_share_directory('ros_gz_sim')
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
x_pose = LaunchConfiguration('x_pose', default='-2.0')
y_pose = LaunchConfiguration('y_pose', default='-0.5')
world = os.path.join(
get_package_share_directory('turtlebot3_gazebo'),
'worlds',
'turtlebot3_world.world'
)
set_env_vars_resources = AppendEnvironmentVariable(
'GZ_SIM_RESOURCE_PATH',
os.path.join(get_package_share_directory('turtlebot3_gazebo'),
'models'))
gzserver_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(ros_gz_sim, 'launch', 'gz_sim.launch.py')
),
launch_arguments={'gz_args': ['-r -s -v4 ', world]}.items()
)
gzclient_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(ros_gz_sim, 'launch', 'gz_sim.launch.py')
),
launch_arguments={'gz_args': '-g -v4 '}.items()
)
robot_state_publisher_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(launch_file_dir, 'robot_state_publisher.launch.py')
),
launch_arguments={'use_sim_time': use_sim_time}.items()
)
spawn_turtlebot_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(launch_file_dir, 'spawn_turtlebot3.launch.py')
),
launch_arguments={
'x_pose': x_pose,
'y_pose': y_pose
}.items()
)
ld = LaunchDescription()
# Add the commands to the launch description
ld.add_action(set_env_vars_resources)
ld.add_action(gzserver_cmd)
ld.add_action(gzclient_cmd)
ld.add_action(robot_state_publisher_cmd)
ld.add_action(spawn_turtlebot_cmd)
return ld
这个Python脚本是一个ROS 2的启动文件,用于在Gazebo模拟器中启动TurtleBot3的仿真环境。它使用了launch
模块来组织和配置不同的启动动作。下面是脚本的主要组成部分及其功能解析:
- 导入必要的模块:
os
:用于文件路径操作。ament_index_python.packages
:用于获取ROS 2包的共享目录。launch
相关的类和函数:用于创建和配置启动描述。
- 获取必要的文件路径:
- 使用
get_package_share_directory
函数获取turtlebot3_gazebo
和ros_gz_sim
(这里可能是自定义的或示例中的模拟包,实际ROS 2中可能没有ros_gz_sim
,通常会是如gazebo_ros
的某个版本)包的共享目录。 - 设置Gazebo世界的路径和模型资源的路径。
- 使用
- 配置启动参数:
use_sim_time
:一个可选的启动配置,用于指示是否使用仿真时间。x_pose
和y_pose
:TurtleBot3在仿真世界中的初始位置。
- 设置环境变量:
- 通过
AppendEnvironmentVariable
添加GZ_SIM_RESOURCE_PATH
环境变量,该变量指向TurtleBot3模型的目录,这样Gazebo就能找到并加载这些模型。
- 通过
- 构建Gazebo的启动命令:
gzserver_cmd
:启动Gazebo服务器的命令,它指定了世界文件和启动参数(如实时模式、服务器模式、详细输出)。gzclient_cmd
:启动Gazebo客户端的命令,它允许用户通过图形界面与Gazebo交互。
- 配置和添加其他ROS 2节点:
robot_state_publisher_cmd
:启动robot_state_publisher
节点,该节点发布机器人的状态信息,这对于许多ROS 2组件(如导航)是必需的。spawn_turtlebot_cmd
:启动一个用于在Gazebo中生成TurtleBot3的命令,该命令指定了机器人的初始位置。
- 创建并返回启动描述:
- 使用
LaunchDescription()
创建一个空的启动描述。 - 向该描述中添加之前定义的所有动作(设置环境变量、启动Gazebo服务器和客户端、启动其他ROS 2节点)。
- 返回该启动描述,以便可以通过ROS 2的
launch
工具运行它。
- 使用
注意:
- 脚本中提到的
ros_gz_sim
包可能是一个虚构的或特定于项目的包,用于封装Gazebo模拟的启动逻辑。在标准的ROS 2发行版中,你通常会使用gazebo_ros
包或其他相关的Gazebo ROS 2桥接包。 launch_arguments
中的字典被转换成了.items()
,这在ROS 2的launch
模块中是期望的格式,因为launch_arguments
期望一个字典的项(键值对)列表。- 该脚本假定了一些启动文件的存在(如
gz_sim.launch.py
、robot_state_publisher.launch.py
和spawn_turtlebot3.launch.py
),这些文件需要在相应的路径下被正确实现。
Gazebo,作为一个自2002年起就开始发展的机器人仿真平台,经过超过15年的持续开发,终于迎来了重大的升级和现代化改造。这一变革不仅提升了Gazebo的性能和功能,还将其从传统的单体架构转变为一系列松散耦合的库集合,形成了新的Gazebo架构。为了区分,我们将旧版本的Gazebo(如Gazebo 9和Gazebo 11)称为“Gazebo Classic”,而将新版本(原称为“Ignition”,现以字母名称如Harmonic发布)简称为“Gazebo”。
针对这一重大变更,以下是对迁移Gazebo Classic项目到新版Gazebo的一些关键指导和资源概述:
迁移ROS 2包中使用的Gazebo Classic
对于使用ROS 2并集成了Gazebo Classic的项目,迁移过程需要特别注意ROS 2与新版Gazebo之间的集成方式。这通常涉及更新ROS 2包中的依赖项,并确保所有接口和插件都兼容新版Gazebo。
安装Gazebo11与新Gazebo并行
为了顺利迁移,建议将Gazebo11(或您当前使用的Gazebo Classic版本)与新版本的Gazebo并行安装。这允许在迁移过程中保持对旧版本的访问,以便进行测试和比较。
迁移插件
插件是Gazebo中用于扩展功能的关键组件。从Gazebo Classic迁移到新版Gazebo时,可能需要对插件进行重写或修改,以确保它们兼容新架构。Gazebo提供了详细的迁移指南,涵盖了从Fortress到Harmonic版本的插件迁移。
迁移SDF文件
SDF(Simulation Description Format)是Gazebo用于描述仿真世界的XML格式。从Gazebo Classic迁移到新版Gazebo时,可能需要更新SDF文件以利用新版Gazebo的特性或修正潜在的兼容性问题。
案例研究:迁移ArduPilot ModelPlugin
通过具体的案例研究,如将ArduPilot的ModelPlugin从Gazebo Classic迁移到新版Gazebo,可以更直观地了解迁移过程中可能遇到的挑战和解决方案。
SDF世界的基本描述
了解SDF的基本结构和如何描述仿真世界对于成功迁移至关重要。新版Gazebo可能对SDF的某些方面进行了扩展或修改,因此了解这些变化是必要的。
与Gazebo Classic的功能比较
新版Gazebo在性能、可扩展性和易用性方面进行了诸多改进。了解这些改进以及它们如何与Gazebo Classic进行比较,有助于确定迁移的优先级和策略。
ros_gz文档
ros_gz
是ROS 2与Gazebo集成的关键部分。迁移过程中,确保熟悉ros_gz
的文档和更新,以便正确集成ROS 2和新版Gazebo。
插件系统列表
了解新版Gazebo中可用的插件系统列表及其功能,有助于在迁移过程中替换或升级现有插件。
总结:
迁移Gazebo Classic项目到新版Gazebo是一个复杂但必要的过程,它涉及更新依赖项、重写插件、修改SDF文件等多个方面。通过遵循迁移指南、利用案例研究和熟悉新版Gazebo的特性,可以顺利完成迁移并确保项目的持续运行和发展。