ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

news2024/9/23 15:28:28

目录

  • 0 专栏介绍
  • 1 动态生成障碍应用场景
  • 2 基于Gazebo动态生成障碍
    • 2.1 spawn_model服务
    • 2.2 动态构造障碍物URDF
    • 2.3 请求服务与动态生成
  • 3 实测演示

0 专栏介绍

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

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


1 动态生成障碍应用场景

动态生成障碍物在机器人工程领域应用非常广泛,例如

  • 机器人导航与路径规划:动态生成障碍物可以用于评估导航算法在实时环境中的性能。通过在仿真环境中随机生成或基于真实环境数据生成障碍物,可以模拟真实世界中不断变化的环境条件,评估机器人导航算法的鲁棒性和适应性;
  • 碰撞检测与避障算法测试:动态生成障碍物可以用于测试机器人的碰撞检测和避障算法。通过在仿真环境中生成障碍物,并模拟它们的运动,可以评估机器人系统在动态环境下的避障能力,并优化算法以适应快速变化的障碍物;
  • 多机器人协作与冲突解决:动态生成障碍物可以用于研究多机器人系统的协作和冲突解决策略。通过在仿真环境中生成障碍物和多个机器人,并模拟它们的动态行为,可以评估多机器人系统在共享资源和避免冲突方面的效率和可行性;

动态生成障碍物技术的使用能够帮助开发人员和研究人员评估和改进机器人系统的感知、规划和控制算法,提高机器人在复杂和动态环境中的性能和鲁棒性。

在这里插入图片描述
本文就来探索如何基于ROS Gazebo动态生成障碍

2 基于Gazebo动态生成障碍

2.1 spawn_model服务

在Gazebo仿真环境中,gazebo/spawn_urdf_model服务用于在Gazebo中动态生成和加载URDF模型。对URDF格式不了解的同学请看ROS从入门到精通3-1:详解urdf语法并自定义机器人

具体来说,gazebo/spawn_urdf_model服务允许通过ROS的服务调用,将URDF模型加载到Gazebo仿真环境中,其参数含义是

  • model_name:要加载的模型的名称,必须是唯一的。
  • model_xml:包含URDF模型描述的XML字符串。
  • robot_namespace:机器人的命名空间,用于区分多个机器人模型。
  • initial_pose:机器人模型在仿真环境中的初始位置和姿态。

使用gazebo/spawn_urdf_model服务使得在仿真环境中可以动态地添加、移除或替换机器人模型或其他物体。这对于机器人开发和测试非常有用,因为可以在仿真环境中快速调试和验证新的机器人设计、传感器配置和控制算法。

2.2 动态构造障碍物URDF

URDF文件本质上是XML格式,所以我们可以很方便地用python的xml相关库创建URDF字符串,传入gazebo/spawn_urdf_model服务中,而不是使用真是存在的障碍物URDF文件,这对于动态配置障碍物属性非常重要。

动态构造障碍物URDF的核心代码如下,因为完整的URDF包含碰撞属性、可视属性等,所以代码篇幅较长,只截取了部分用于说明

def constructURDF(self, model_type: str, **kwargs) -> str:
     # parameters checking
     if model_type.upper() == "BOX":
         assert "m" in kwargs and \
             "w" in kwargs and \
             "d" in kwargs and \
             "h" in kwargs and \
             "c" in kwargs,    \
             "Parameters of {} are `m`, `w`, `d`, `h`, `c` which mean mass, \
                 width, depth, height and color, ".format(model_type)
         ixx = (kwargs["m"] / 12.0) * (pow(kwargs["d"], 2) + pow(kwargs["h"], 2))
         iyy = (kwargs["m"] / 12.0) * (pow(kwargs["w"], 2) + pow(kwargs["h"], 2))
         izz = (kwargs["m"] / 12.0) * (pow(kwargs["w"], 2) + pow(kwargs["d"], 2))
         geometry = ObstacleGenerator.createElement("geometry")
         geometry.append(ObstacleGenerator.createElement(model_type.lower(),
             props={"size": "{:f} {:f} {:f}".format(kwargs["w"], kwargs["d"], kwargs["h"])}))
     elif model_type.upper() == "CYLINDER":
         ...
     elif model_type.upper() == "SPHERE":
         ...
     else:
         raise NotImplementedError

     # URDF generation dynamically
     static_obs = ObstacleGenerator.createElement("robot", props={"name": model_type.lower()})
     link = ObstacleGenerator.createElement("link", props={"name": model_type.lower() + "_link"})

     ...

     return ET.tostring(static_obs).decode()

2.3 请求服务与动态生成

我们可以设置一个配置文件来配置动态障碍属性,脚本中读取这个配置

self.obs_cfg = ObstacleGenerator.yamlParser(self.root_path + "user_config/" + self.user_cfg["obstacles"])

接着按参数接口请求服务即可

pose = [float(i) for i in obs["pose"].split()]
x, y, z, r, p, yaw = pose
orient = tf.transformations.quaternion_from_euler(r, p, yaw)
orient = Quaternion(orient[0], orient[1], orient[2], orient[3])
params = obs["props"]
params["c"] = obs["color"]
urdf = self.constructURDF(obs["type"], **params)

if obs["type"] == "BOX":
    z = z if z else obs["props"]["h"] / 2
    pose = Pose(Point(x=x, y=y, z=z), orient)
    proxy(obs["type"] + str(len(self.box_obs)), urdf, "", pose, "world")
    self.box_obs.append(obs)

3 实测演示

假设用户配置文件为

# static obstacles
obstacles:
  - type: BOX
    pose: 5 2 0 0 0 0
    color: Grey
    props:
      m: 1.00
      w: 0.25
      d: 0.50
      h: 0.80
  - type: BOX
    pose: 6 2 0 0 0 0
    color: White
    props:
      m: 1.00
      w: 0.25
      d: 0.50
      h: 0.80
  - type: BOX
    pose: -7 3 0 0 0 0
    color: Grey
    props:
      m: 1.00
      w: 1.00
      d: 1.00
      h: 1.00

运行脚本文件后即可在Gazebo中动态生成障碍,如下图所示

在这里插入图片描述

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


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

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

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

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

相关文章

CSS | 解决html中img标签图片底部存在空白缝隙的问题

目录 问题描述 原因分析 解决方案 写在最后 问题描述 在学习CSS的过程中&#xff0c;我们经常会遇到图片底侧存在空白缝隙的问题。 代码示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" />&l…

SpringCloudAlibaba之Sentinel源码分析--protoc-3.17.3-win64

Sentinel源码分析 文章目录 Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.Contex…

【C++初阶】string类常见题目详解(一)—— 仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C初阶】…

【Python 基础篇】Python 集合及集合常用函数

文章目录 导言一、集合的创建和访问二、集合的常用函数len()add()remove()union()intersection()difference()issubset()issuperset()clear() 总结 导言 在Python中&#xff0c;集合&#xff08;Set&#xff09;是一种无序、不重复的数据类型&#xff0c;用于存储多个唯一的元…

HCIP网络笔记分享——广域网协议及BGP协议

第二部分 HCIA回顾一、广域网技术1、HDLC2、PPP3、PAP4、CHAP5、GRE6、运行路由协议 二、动态路由协议1、OSPF2、重发布3、路由策略3.1 抓流量3.2 具体过程 4、BGP 三、BGP边界网关协议1、BGP的数据包2、BGP的状态机3、BGP的工作过程4、BGP的路由黑洞问题5、BGP的防环问题6、BG…

Studio One6.1.1免费中文版电子音乐、摇滚乐制作软件

Studio One6是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One6.1的主要特点包括&#xff1a; 1. …

深入理解什么是端口(port)

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…

JavaEE的学习(Spring +Spring MVC + MyBatis)

一、Spring入门 Spring是一个轻量级的控制反转 (IoC-Inversion of Control)和面向切面 (AOP-Aspect Oriented Programming)的容器&#xff08;框架&#xff09;。它采用分层架构&#xff0c;由大约20个模块组成&#xff0c;这些模块分为Core Container、Data Access/Integrati…

什么是计算机蠕虫?

计算机蠕虫诞生的背景 计算机蠕虫的诞生与计算机网络的发展密切相关。20世纪60年代末和70年代初&#xff0c;互联网还处于早期阶段&#xff0c;存在着相对较少的计算机和网络连接。然而&#xff0c;随着计算机技术的进步和互联网的普及&#xff0c;计算机网络得以迅速扩张&…

TC8:SOMEIPSRV_FORMAT_09-10

SOMEIPSRV_FORMAT_09: Undefined bits in the Flag field 目的 Flag字段中的未定义位应静态设置为0 测试步骤 DUT CONFIGURE:启动具有下列信息的服务Service ID:SERVICE-ID-1Instance数量:1Tester:客户端-1监听在网卡上DUT:发送SOME/IP Notification消息Tester:验证接收…

Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改

文章目录 开发场景SystemChrome 介绍SystemChrome的使用导入 SystemChrome 包隐藏状态栏说明 改变状态栏的样式注意事项其他样式说明 锁定屏幕方向锁定屏幕方向实例注意事项 开发场景 开发APP时&#xff0c;我们经常要客制化状态栏、导航栏栏等的样式和风格&#xff0c;Flutte…

网络之网络基础入门

文章目录 前言一、局域网和广域网1.局域网LAN2.广域网WAN3.城域网和校园网4.如何区分广域网和局域网 二、协议1.概念2.理解3.协议分层4.数据传输的条件 三、OSI七层模型&#xff08;了解即可&#xff09;1.概念2.OSI七层模型 四、TCP/IP五层&#xff08;四层&#xff09;模型1.…

TC8:TCP_BASICS_11-17

TCP_BASICS_11: [finwait-2 -> time_wait] delay(2*MSL) -> [closed] 目的 TCP从FINWAIT-2状态到TIME-WAIT状态后,等待2MSL时间后,移动到CLOSED状态 关于为什么要等待2MSL时间,我的文章中讲过太多次了,这里就不提了 测试步骤 Tester:让DUT移动到FINWAIT-2状态Test…

使用Python批量进行数据分析

案例01 批量升序排序一个工作簿中的所有工作表——产品销售统计表.xlsx import xlwings as xw import pandas as pd app xw.App(visible False, add_book False) workbook app.books.open(产品销售统计表.xlsx) worksheet workbook.sheets # 列出工作簿中的所有工作表 fo…

SpringBoot 如何使用 ApplicationEventPublisher 发布事件

SpringBoot 如何使用 ApplicationEventPublisher 发布事件 在 SpringBoot 应用程序中&#xff0c;我们可以使用 ApplicationEventPublisher 接口来发布事件。事件可以是任何对象&#xff0c;当该对象被发布时&#xff0c;所有监听该事件的监听器都会收到通知。 下面是一个简单…

[Leetcode] 0733. 图像渲染

733. 图像渲染 点击上方&#xff0c;跳转至leetcode 题目描述 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。 为…

第八章 MobileNetv3网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

1.RocketMQ的安装与集群架构

RocketMQ快速入门 RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;在阿里内部&#xff0c;RocketMQ承接了例如“双11”等高并发场景的消息流转&#xff0c;能够处理万亿级别的消息。 2.1 准备工作 2.1.1 下载RocketMQ RocketMQ最新版本&#xff1a;…

Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码 目录 一、四种基础同步策略 1.1 同步策略 1.2 更新缓存还是删除缓存&#xff1f; 1.2.1 更新缓存的优缺点 1.2.2 …

【PCB专题】Allegro输出光绘文件的基本参数设置和光绘层建立

什么是Gerber PCB设计是一套流程体系,而PCB制造又是另一套流程体系。 PCB设计数据并不等同于PCB制造数据,也就是说PCB制造并不会直接使用我们的PCB设计数据。设计数据需要经过CAM(Computer-Aided Manufacturing 计算机辅助制造)转换成给机器使用的生产数据。 Gerber就是板厂…