ROS2从入门到精通2-3:机器人3D物理仿真Gazebo与案例分析

目录

  • 0 专栏介绍
  • 1 什么是Gazebo?
  • 2 Gazebo架构
    • 2.1 Gazebo前后端
    • 2.2 Gazebo文件格式
    • 2.3 Gazebo环境变量
  • 3 Gazebo安装与基本界面
  • 4 搭建自己的地图
    • 4.1 编辑地图
    • 4.2 保存地图
    • 4.3 加载地图
  • 5 常见问题

0 专栏介绍

本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。

🚀详情:《ROS2从入门到精通》


1 什么是Gazebo?

Gazebo是一款3D物理仿真器,支持机器人开发所需的机器人、传感器和环境模型,并通过其搭载的强大物理引擎产生高品质的图形画面,达到逼真的仿真结果。

在这里插入图片描述
Gazebo功能强大,主要有:

  • 构建机器人运动仿真模型

    Gazebo提供了最基础的球体、圆柱体与立方体,利用它们以及伸缩变换或者旋转变换,可以自主设计机器人三维仿真模型。除此之外,Gazebo提供了CADBlenderSolidWorks等各种2D、3D设计软件接口,可以导入图纸让Gazebo机器人模型更真实。Gazebo提供了 机器人的运动仿真,通过Model Editor下的plugin,添加需要验证的算法文件,就可以在Gazebo里对机器人的运动进行仿真

  • 构建现实世界各种场景的仿真模型

    Gazebo可以建立一个用来测试机器人的仿真场景,通过添加物体库来模仿现实世界,还可以通过添加2D房屋设计图,构建出3D的房屋

  • 构建传感器仿真模型

    Gazebo提供强大的传感器模型库,包括cameradepth cameralaserimu等机器人常用的传感器,并且可以直接使用。Gazebo也允许用户从零创建一个新的传感器,添加它的具体参数,甚至还可以添加传感器噪声模型,让传感器更加真实

  • 为机器人模型添加现实世界的物理性质

    Gazebo提供的物理引擎可以为机器人添加重力、阻力等,提供了在复杂的室内和室外环境中准确有效地模拟机器人群体的能力

2 Gazebo架构

2.1 Gazebo前后端

Gazebo区分

  • 客户端:gzclient,接受数据信息并显示,允许多个客户端存在
  • 服务端:gzserver,运行Gazebo运算分析功能

终端运行指令

gazebo

默认执行指令

gzserver
gzclient

当然也可以分开运行服务端和客户端指令。

2.2 Gazebo文件格式

  • 世界

    扩展名为.world,该文件包含了仿真的所有元素——机器人、环境、传感器等,通过gzserver读取所有信息并构建一个真实的3D场景

  • 模型

    扩展名为.sdf,即仿真描述文件(simulation description format, SDF),模型文件主要用于实现基本组件复用,例如——太阳、平面等,从而简化.world

    下面是一个.world文件,其中包含ground_planesun模型文件

    <?xml version="1.0" ?>
    <sdf version="1.5"><world name="default"><include><uri>model://ground_plane</uri></include><include><uri>model://sun</uri></include><model name="box"><pose>0 0 0.5 0 0 0</pose><link name="link"><collision name="collision"><geometry><box><size>1 1 1</size></box></geometry></collision></link></model>  </world>
    </sdf>
    

2.3 Gazebo环境变量

Gazebo环境变量表示了内置文件与库的存放位置,列举如下:

  • GAZEBO_MODEL_PATHGazebo所有模型的路径
  • GAZEBO_RESOURCE_PATHGazebo所有资源的路径,例如.world.sdf
  • GAZEBO_MASTER_URI:指定ip与端口,用于Gazebo客户端与服务器连接使用,通常使用服务器运行Gazebo时需要设置
  • GAZEBO_PLUGIN_PATHGazebo搜索插件库的路径
  • GAZEBO_MODEL_DATABASE_URIGazebo下载模型的路径

上述所有的变量查看位置/usr/share/gazebo/setup.sh

3 Gazebo安装与基本界面

Gazebo已经集成在桌面完整版的ROS系统当中
启动与测试

ros2 launch gazebo_ros spawn_entity_demo.launch.py

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8JqPBGP-1721265452675)(https://i-blog.csdnimg.cn/direct/173a148d437e4222aae25de427d0f56d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATXIuV2ludGVyYA==,size_120,color_FFFFFF,t_70,g_se,x_16#pic_center =650x)]

如上图所示,Gazebo-GUI主要包含以下部分:

  • 场景(Scene):模拟器的主要部分,是仿真模型显示的地方,用户可以在场景中操作仿真对象,使其与环境进行交互

  • 左侧面板

    • WORLD:该选项卡显示当前场景中的模型,并允许查看和修改模型参数
    • INSERT:该选项卡是向仿真场景中添加新对象、模型,可以添加常用模型所在的路径
    • LAYERS:该选项卡组织并显示仿真中可用的不同可视化组,一个图层可以包含一个或多个模型,打开或关闭图层将显示或隐藏该图层中的模型
  • 顶部工具栏:包含与模拟器交互时最常用的选项,如按钮:选择、移动、旋转和缩放;灯光;创建简单形状(例如立方体、球体、圆柱体);复制/粘贴;更改视图;捕捉对齐等。

  • 底部工具栏:显示有关仿真的数据,如仿真时间及其与真实时间。

    • 仿真时间:指当仿真运行时,时间在仿真环境中过得有多快。仿真可以比真实时间慢或快,具体取决于运行仿真所需的计算量
    • 真实时间:指在仿真环境中运行时实际经过的时间。仿真时间和真实时间的比率称为实时因子。
    • 步长:每次仿真迭代都会推进一个固定的秒数,默认情况下,步长为1ms,按“暂停”按钮暂停仿真,并使用“步长”按键一次执行多个步长。

4 搭建自己的地图

本文介绍如何用Gazebo搭建自己的地图,关于Gazebo搭建机器人请参考后面的文章。

4.1 编辑地图

启动Gazebo,依次点击Edit -> Building Editor打开地图编辑器,如下所示

在这里插入图片描述
该编辑器由以下3个区域组成:

  • 调色板:选择建筑特征和材料
  • 2D视图:设计或导入楼层平面图,编辑器会根据平面图自动在3D编辑器中插入墙壁、门窗和楼梯
  • 3D视图:预览平面设计的3D视图,在这里可以为建筑物的不同部分分配颜色和纹理

4.2 保存地图

在顶部菜单上,选择File,然后Save As可以保存模型文件.sdf.config。单击Exit Building Editor退出场景编辑器,注意退出后就不能够再次编辑场景了。

回到主界面再次选择File,然后Save World可以保存世界文件.world

4.3 加载地图

.world中包含模型文件的全部内容,但不利于模型文件.sdf.config复用以及.world文件的可读性,本节进行改进。假设模型文件名为scene1,则模块化加载模型的方式为

  • 存放位置为~/ros2_learning_tutorials/Lecture_2_2/src/gazebo_labmodels/models,则
    <!-- 自定义模型 -->
    <model name='scene1'><include><uri>///home/winter/ros2_learning_tutorials/Lecture_2_2/src/gazebo_lab/models/scene1</uri></include>
    </model>
    
  • 存放位置为~/.gazebo/models,则
    <!-- 自定义模型 -->
    <model name='scene1'><include><uri>model://scene1</uri></include>
    </model>
    

启动地图可以类比turtlebot3_world.launch的结构,将其中的地图改成自己的场景即可,如下所示

<launch><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find gazebo_lab)/worlds/scene1.world"/><!-- more default parameters can be changed here --><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="headless" value="false"/> <!-- Inert - see gazebo_ros_pkgs issue #491 --><arg name="recording" value="false"/><arg name="debug" value="false"/></include>
</launch>

5 常见问题

  1. Gazebo出现黑屏

    解决方案:更新Gazebo模型库

    cd ~/.gazebo/
    mkdir -p models
    cd ~/.gazebo/models/
    wget http://file.ncnynl.com/ros/gazebo_models.txt
    wget -i gazebo_models.txt
    ls model.tar.g* | xargs -n1 tar xzvf
    
  2. [gazebo-1] process has died [pid 20736, exit code 255, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -e ode worlds/empty.world __name:=gazebo __log:=/home/winter/.ros/log/2670202e-5ef6-11ec-847d-347df65d6a56/gazebo-1.log].

    解决方案:关闭已有的Gazebo进程

    killall gzserver
    killall gzclient
    

本文的完整工程代码请通过下方名片联系我获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

车载通信与DDS标准解读系列(5):DDS-Security

DDS-Security协议与DDS协议、DDSI-RTPS协议、DDS-XTypes协议共同作为DDS协议簇中的核心协议。本协议基于其它三份核心协议&#xff0c;对系统中各交互环节的认证加密等措施进行规范化&#xff0c;保障用户发现和数据传递的安全性。协议于2016年发布v1.0&#xff0c;目前最新版本…

香橙派AIpro-携手华为-为AI赋能

文章目录 香橙派AIpro-携手华为-为AI赋能开箱和功能介绍开箱功能介绍 环境搭建镜像烧录进入系统 测试项目YOLOv5部署YOLOv5识别单张图片实时识别视频使用Ascend测试yolov5 产品评价 香橙派AIpro-携手华为-为AI赋能 今天新入手了一款香橙派AIPro&#xff0c;让我们一起跟着文章…

【Linux】线程——线程池、线程池的实现、线程安全的线程池、单例模式的概念、饿汉和懒汉模式、互斥锁、条件变量、信号量、自旋锁、读写锁

文章目录 Linux线程7. 线程池7.1 线程池介绍7.2 线程池的实现7.3 线程安全的线程池7.3.1 单例模式的概念7.3.2 饿汉和懒汉模式 8. 常见锁使用汇总8.1 互斥锁&#xff08;Mutex&#xff09;8.2 条件变量&#xff08;Condition Variable&#xff09;8.3 信号量&#xff08;Semaph…

PostgreSQL的逻辑架构

一、PostgreSql的逻辑架构&#xff1a; 一个server可以有多个database&#xff1b;一个database有多个schema&#xff0c;默认的schema是public&#xff1b;schema下才是对象&#xff0c;其中对象包含&#xff1a;表、视图、触发器、索引等&#xff1b;与user之间的关系&#x…

【信号频率估计】MVDR算法及MATLAB仿真

目录 一、MVDR算法1.1 简介1.2 原理1.3 特点1.3.1 优点1.3.2 缺点 二、算法应用实例2.1 信号的频率估计2.2 MATLAB仿真代码 三、参考文献 一、MVDR算法 1.1 简介 最小方差无失真响应&#xff08;Mininum Variance Distortionless Response&#xff0c;MVDR&#xff09;算法最…

PWM再理解(1)

前言 昨天过于劳累&#xff0c;十点睡觉&#xff0c;本来想梳理一下PWM&#xff0c;今天补上。 PWM内涵 PWM全称&#xff1a;Pulse Width Modulation&#xff0c;也就是脉宽调制的意思&#xff0c;字面意思理解就是对脉冲的宽度进行改变。准确就是通过数字输出对模拟电路进行…

Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…

ChaosMeta for AI:混沌工程让AI稳定性更上一层楼

作者&#xff1a;刘凇杉 在今天的AI时代&#xff0c;AI系统的架构愈发复杂&#xff0c;其稳定性、资源利用率以及故障自愈能力也显得尤为重要。如果我们在实际运行中遇到问题再去修复&#xff0c;不仅成本高&#xff0c;还会对用户体验造成影响。混沌工程则是通过主动暴露和解…

「Vue组件化」封装i18n国际化

前言 在Vue应用中实现国际化(i18n),通常需要使用一些专门的库,比如vue-i18n。本文主要介绍自定义封装i18n,支持Vue、uniapp等版本。 设计思路 一、预期效果 二、核心代码 2.1 i18n.xlsx文件准备 2.2 脚本执行 根目录main.js根目录locali18n.xlsxnode main.jsmain.js 文件…

昇思25天学习打卡营第15天|两个分类实验

打卡 目录 打卡 实验1&#xff1a;K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2&#xff1a;基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置&#xff08;训练/验证/推理&#xff09; 数据预处理 MobileNetV2模型搭建 Mobile…

尚品汇-(二十一)

目录&#xff1a; &#xff08;1&#xff09;使用redis实现分布式锁 &#xff08;2&#xff09;优化之设置锁的过期时间 &#xff08;3.&#xff09;优化之UUID防误删 &#xff08;4&#xff09;优化之LUA脚本保证删除的原子性 &#xff08;1&#xff09;使用redis实现分布…

基于FPGA的多路选择器

目录 一、组合逻辑 二、多路选择器简介&#xff1a; 三、实战演练 摘要&#xff1a;本实验设计并实现了一个简单的多路选择器&#xff0c;文章后附工程代码 一、组合逻辑 组合逻辑是VerilogHDL设计中的一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输…

macpdf转图片 macpdf导出为图片 mac如何将pdf存为jpg

在数字化办公的今天&#xff0c;pdf文件因其良好的文档保存和分享特性&#xff0c;已成为工作生活中不可或缺的一部分。然而&#xff0c;在某些场景下&#xff0c;我们需要将pdf文件转换为图片格式&#xff0c;以便于分享或展示。本文将向您介绍多种pdf转图片的方法&#xff0c…

Net8 Spire最新版去水印,去页数限制,转word/pptx/ofd等

新建控制台程序&#xff0c;添加Spire.pdf&#xff0c;最新版本为2024年7月17日 try {Spire.Pdf.PdfDocument pdf new Spire.Pdf.PdfDocument();pdf.LoadFromFile("test.pdf");pdf.SaveToFile("newpdf.pdf");pdf.SaveToFile("newppx.pptx", Spi…

github上的工程如何下载子模块.gitmodules如何下载指定的模块download submodules开源项目子模块下载externals

github上的工程如何下载子模块.gitmodules如何下载指定的模块download submodules 说明(废话)解决方案无法执行下载子模块无法下载子项目 说明(废话) 今天在编译一个开源库时&#xff0c;该开源库依赖其他项目&#xff0c;并且项目还挺多的&#xff0c;所以有此解决方案 在编…

springboot 配置 spring data redis

1、在pom.xml引入父依赖spring-boot-starter-parent&#xff0c;其中2.7.18是最后一版支持java8的spring <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</…

cms wpscan使用方式--kali linux

WPScan是一个用于WordPress安全审计和漏洞扫描的工具&#xff0c;可以通过以下命令来使用WPScan&#xff1a; 扫描一个网站&#xff1a; wpscan --url http://example.com扫描一个网站并指定用户名和密码&#xff1a; wpscan --url http://example.com --useradmin --passwo…

【go】Excelize处理excel表 带合并单元格、自动换行与固定列宽的文件导出

文章目录 1 简介2 相关需求与实现2.1 导出带单元格合并的excel文件2.2 导出增加自动换行和固定列宽的excel文件 1 简介 之前整理过使用Excelize导出原始excel文件与增加数据校验的excel导出。【go】Excelize处理excel表 带数据校验的文件导出 本文整理使用Excelize导出带单元…

【微服务实战之Docker容器】第六章-复杂安装(Mysql主从Redis集群)

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录安装mysql主从复制1、新建主服务器容器实例33072、新建从服务器33083. 主从复制测试 Redis篇穿插Redis面试题哈希槽分区进行亿级数据存储Hash取余分区一致性Hash算法分区Hash槽分区&#xff0…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…