Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 注意事项

激光显示

点呈现

射线呈现 

 

rviz2


新旧版本并存的混乱

本教程旨在为在Ubuntu Jammy(最新支持Gazebo Classic包的Ubuntu版本)上运行Gazebo Classic(如Gazebo 11)的用户提供指导,这些用户计划将其代码迁移到新的Gazebo版本(如Fortress, Garden, 或Harmonic)。教程的目的是展示如何在同一台机器上同时安装Gazebo 11和新版本的Gazebo,以便用户可以并行运行旧项目并探索新版本的特性。

然而,需要注意的是,由于软件版本的快速迭代,本教程中详细介绍的Gazebo Classic版本(如Gazebo 11)可能不会在未来得到更新或支持。因此,推荐用户考虑将代码迁移到新的Gazebo版本作为长期解决方案。

关键步骤和注意事项包括

  1. 确认Ubuntu版本:确保你的Ubuntu系统是Jammy(22.04)或兼容版本。

  2. 安装Gazebo 11:由于Gazebo 11可能不在Ubuntu Jammy的默认仓库中,你可能需要从旧版本的Ubuntu仓库、Gazebo的PPA或其他源安装。这通常涉及添加额外的软件源和依赖项。

  3. 安装新版本的Gazebo:通过ROS(如果你使用的是ROS)或直接从Ubuntu的apt仓库(如果可用)安装新版本的Gazebo。确保选择与你的ROS版本兼容的Gazebo版本。

  4. 管理版本冲突:同时安装两个版本的Gazebo可能会导致版本冲突,特别是当它们共享相同的依赖项时。你可能需要解决这些冲突,或者确保每个版本的Gazebo都使用其自己的依赖项集。

  5. 设置环境变量:为了能够在需要时轻松切换到不同版本的Gazebo,你可能需要设置环境变量来指定默认使用的Gazebo版本。

  6. 查阅文档和社区支持:由于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话题的桥接。以下是具体需要进行的更改概述:

  1. 修改package.xmlCMakeLists.txt文件
    • 需要将原来依赖于gazebogazebo_ros_pkgs等包的引用替换为ros_gz及其相关包。这包括在package.xml中添加或更新依赖项,以及在CMakeLists.txt中调整find_package和target_link_libraries等指令,以确保项目能够正确链接到新的库和包。
  2. 编辑启动Gazebo的启动文件(如empty_world.launch.py):
    • 需要更新这些文件以使用新Gazebo版本的启动命令和参数。这可能包括更改Gazebo服务器的URI、调整仿真参数或指定新的世界文件。
  3. 更新世界SDFormat文件
    • SDFormat(Simulation Description Format)是用于描述仿真环境的XML格式。需要确保世界文件与新Gazebo版本的兼容性,并可能需要根据新版本的特性进行更新。
  4. 编辑生成模型的启动文件
    • 这些文件负责在仿真环境中生成和放置机器人模型。需要更新它们以使用新Gazebo版本的API和参数,并确保模型能够正确加载和交互。
  5. 编辑模型SDFormat文件
    • 类似于世界文件,模型文件也需要根据新Gazebo版本的SDFormat规范进行更新。这可能包括调整模型属性、传感器配置或插件设置。
  6. 桥接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 Toolimport osfrom 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 LaunchConfigurationdef 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 descriptionld.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模块来组织和配置不同的启动动作。下面是脚本的主要组成部分及其功能解析:

  1. 导入必要的模块
    • os:用于文件路径操作。
    • ament_index_python.packages:用于获取ROS 2包的共享目录。
    • launch相关的类和函数:用于创建和配置启动描述。
  2. 获取必要的文件路径
    • 使用get_package_share_directory函数获取turtlebot3_gazeboros_gz_sim(这里可能是自定义的或示例中的模拟包,实际ROS 2中可能没有ros_gz_sim,通常会是如gazebo_ros的某个版本)包的共享目录。
    • 设置Gazebo世界的路径和模型资源的路径。
  3. 配置启动参数
    • use_sim_time:一个可选的启动配置,用于指示是否使用仿真时间。
    • x_posey_pose:TurtleBot3在仿真世界中的初始位置。
  4. 设置环境变量
    • 通过AppendEnvironmentVariable添加GZ_SIM_RESOURCE_PATH环境变量,该变量指向TurtleBot3模型的目录,这样Gazebo就能找到并加载这些模型。
  5. 构建Gazebo的启动命令
    • gzserver_cmd:启动Gazebo服务器的命令,它指定了世界文件和启动参数(如实时模式、服务器模式、详细输出)。
    • gzclient_cmd:启动Gazebo客户端的命令,它允许用户通过图形界面与Gazebo交互。
  6. 配置和添加其他ROS 2节点
    • robot_state_publisher_cmd:启动robot_state_publisher节点,该节点发布机器人的状态信息,这对于许多ROS 2组件(如导航)是必需的。
    • spawn_turtlebot_cmd:启动一个用于在Gazebo中生成TurtleBot3的命令,该命令指定了机器人的初始位置。
  7. 创建并返回启动描述
    • 使用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.pyrobot_state_publisher.launch.pyspawn_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的特性,可以顺利完成迁移并确保项目的持续运行和发展。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两个实用的Python编程技巧

一、变量类型声明技巧 虽然在Python中可以不用声明变量的类型,但是为了加快程序的运算速度,减少不必要的bug,我们可以在定义变量之初就把它的类型确定,这样可以更好地传输变量值。如下面的例子。 我们定义了两个变量&#xff0c…

基于STM32开发的智能家居语音控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化语音识别处理设备控制与状态显示Wi-Fi通信与远程控制应用场景 家庭环境的语音控制办公室的智能化管理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人工智能技术的发展&…

Centos 添加双网卡 (生产环境配置记录)

1、在虚拟机中添加网卡2 [rootntpserver network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo …

医疗器械法规笔记

目录 前言医疗器械法规体系医疗器械监管注册与备案前言 之前的文章中介绍了与软件开发过程中相关的法规(网络安全),同时介绍了如何查找相关行业标准,这些都是平时工作中遇到的细节问题,没有系统性的呈现出医疗器械法规相关的框架,一直想对法规与标准有一个全面的认识和总…

44-java自动拆箱和自动装箱

java自动拆箱和自动装箱 自动装箱是Java中的一个概念&#xff0c;它允许将一个基本类型直接赋值给对应的包装类。例如&#xff0c;将一个int值赋给Integer对象。 自动拆箱是将包装类对象直接赋值给基本类型变量。例如&#xff0c;将一个Integer对象赋给一个int值。 以下是Ja…

系统分析师---UML图的七种图形

UML&#xff08;统一建模语言&#xff09;是一种用于软件设计和文档编写的标准图形化语言&#xff0c;它提供了多种图形来帮助开发人员和架构师在不同阶段理解和传达系统的结构和行为。以下是UML的七种主要图形及其含义&#xff0c;以及在需求分析、概念设计和详细设计中的使用…

Redis中的 大/热 key问题 ,如何解决(面试版)

big key 什么是 big key? big key&#xff1a;就是指一个内存空间占用比较大的键(Key) 造成的问题&#xff1a; 内存分布不均。在集群模式下&#xff0c;不同 slot分配到不同实例中&#xff0c;如果大 key 都映射到一个实例&#xff0c;则分布不均&#xff0c;查询效率也…

常见错误导引 不锈钢螺钉的正确选购和使用分析

紧固件或螺钉是用于固定物体的机械工具。它们用于各种场景&#xff0c;从建造房屋、用具、玩具等。紧固件由多种材料制成&#xff0c;所有这些材料都有特定用途紧固件和用途。一些用于制造螺丝的材料包括不锈钢、铁、铜、铝和塑料。它通常会进行某种表面处理以提高其防锈性和/或…

(亲测解决)Couldn‘t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9

1、报错 Extra Packages for Enterprise Linux 9 - x86_64 0.0 B/s | 0 B 00:00 Curl error (37): Couldnt read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9 [Couldnt open…

K8S持久化存储数据volumeMountsvolumes

环境&#xff1a; Ubuntu-1:192.168.114.110作为主 Ubuntu-2:192.168.114.120作为从1&#xff0c;node节点1 Ubuntu-3:192.168.114.130作为从2&#xff0c;node节点2 持久化volumeMounts pod里面&#xff1a;emptyDir和hostPath。存储在node&#xff0c;NFS...&#xff0c;Clo…

OD C卷 - 寻找最优的路测线路

寻找最优的路测线路&#xff08;200&#xff09; 给定一个m行、n列的数组&#xff08;路线网络&#xff09;&#xff0c;每个值代表当前位置的信号质量&#xff0c;越大信号越好&#xff1b;从 [0, 0] 到 [m-1, n-1]位置的路线中&#xff0c;最小值代表当前路线的评分&#xf…

高斯混合模型原理及Python实践

高斯混合模型&#xff08;Gaussian Mixture Model&#xff0c;简称GMM&#xff09;是一种统计学中的概率模型&#xff0c;用于表示由多个高斯分布&#xff08;正态分布&#xff09;混合组成的数据集合。其核心原理基于假设数据集中的每个数据点都是由多个潜在的高斯分布之一生成…

springboot项目使用本地依赖项,打包后出现NoClassDefFoundError的一种解决方法

可以把本地依赖项上传到本地仓库后再引用 建立 Maven 本地仓库并将依赖上传到本地仓库 要建立 Maven 本地仓库并将依赖上传到本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 配置 Maven 本地仓库路径 Maven 默认会在用户的主目录下的 .m2/repository 目录创…

基于Modbus的MFC智能控制

1. 系统概述 利用LabVIEW通过Modbus 485协议实现对七星&#xff08;Sevenstar&#xff09;品牌质量流量控制器&#xff08;MFC&#xff09;的智能化控制。该系统将自动控制多个MFC的流速&#xff0c;实时监控其状态&#xff0c;并根据需要进行调整。 2. 硬件配置 MFCs: 七星品…

JavaScript学习文档(7):Web API、获取DOM对象、操作元素内容、元素属性、定时器-间歇函数

目录 一、Web API 1、作用和分类 2、DOM是什么 3、DOM树 4、DOM对象 &#xff08;1&#xff09;DOM对象如何创建的? &#xff08;2&#xff09;DOM对象怎么创建的? 二、获取DOM对象 1、根据CSS选择器来获取DOM元素 &#xff08;1&#xff09;选择匹配的第一个元素 …

Spring(2)

目录 一、使用注解开发 1.1 主要注解 1.2 衍生注解 1.3 xml与注解 二、使用Java的方式配置Spring 三、代理模式 3.1 静态代理 3.1.1 角色分析 3.1.2 代码步骤 3.1.3 优点 3.1.4 缺点 3.2 动态代理 3.2.1 代码步骤 四、AOP 4.1 使用Spring的API接口 4.2 使用自定义…

8月15日

上午开会 rag继续 异构大模型 狂野飙车9之前的账号终于找回来了 下午 关于minicpm的代码 minicpm-v 大模型预训练论文&方法总结 - 知乎 (zhihu.com) 这里有讲解的代码 发现还是先推荐把llava的掌握好了之后再看minicpm 多模态大模型LLaVA模型讲解——transformers源…

YoloV8改进策略:卷积篇|ACConv2d模块在YoloV9中的创新应用与显著性能提升|简单易用_即插即用

摘要 在本文中&#xff0c;我们创新性地将ACConv2d模块引入到YoloV9目标检测模型中&#xff0c;通过对YoloV9中原有的Conv卷积层进行替换&#xff0c;实现了模型性能的大幅提升。ACConv2d模块基于不对称卷积块&#xff08;ACB&#xff09;的设计思想&#xff0c;利用1D非对称卷…

sql server导入mysql,使用工具SQLyog

概述 需要将sql server的数据导入到mysql中&#xff0c;由于2种数据库存在各种差异&#xff0c;比如表字段类型就有很多不同&#xff0c;因此需要工具来实现。 这里使用SQLyog来实现。 SQLyog安装 安装过程参考文档&#xff1a;https://blog.csdn.net/Sunshine_liang1/article/…

SQL Server事务日志文件过大的处理方法

正常情况下事务日志文件过大时可以右点数据库--任务--收缩--文件--选择日志进行收缩&#xff0c;从而达到减小事务日志文件的目的。 但在有些情况下没有达到执行收缩条件&#xff0c;无法执行收缩&#xff1a; 1、数据库恢复模式 为 完整恢复模式&#xff08;FULL&#xff09…