gazebo入门_【ROS-Gazebo】仿真插件编写教程(1)——概述

2023-05-16

前言

本系列教程的主要是对 Gazebo的官网教程 的翻译与理解。之前查找国内的中文资料,发现并没有关于如何编写Gazebo插件的教程。据我猜测,大概是因为这个技能属于“两不管”地带:刚入门的爱好者直接调用Gazebo自带的控制和传感器插件即可,不需要自己编写插件;而等到要用到自定义插件的时候,已经不屑于写这种基础的教程了。

因此,本系列教程的定位是:你已经有了一定的Gazebo仿真经验,使用过部分自带的插件,但你的研究工作需要你对已有插件进行修改或编写新的插件,并且略微有些C++基础。

对于刚入门的新手,还是建议先学习调用自带插件,自带插件能够满足大部分基本功能需求。教程推荐古月居的 ROS探索总结(二十四)——使用gazebo中的插件 。

Gazebo插件概述

Gazebo插件实际上是一个共享的代码库。在仿真时,插件可以通过标准的C++类来实现Gazebo的相关功能。旧版本的Gazebo使用控制器(controllers)来完成类似的工作。区别在于控制器是静态编译的,而插件更灵活,允许用户选择自己需要的那部分功能。

插件的优点包括:

  • 让开发人员能够从各个层面对Gazebo进行控制
  • 自带例程,且易于共享
  • 可以在运行的系统中插入或删除

插件的适用情况如下:

  • 你想通过编程来控制仿真,如移动模型、响应事件、在给定情况下插入新模型
  • 你想要一个快速的Gazebo接口,没有传输层的开销,如消息的序列化和反序列化
  • 你有一些代码想要分享给他人

插件类型

目前有6种类型的插件

  1. World
  2. Model
  3. Sensor
  4. System
  5. Visual
  6. GUI

应根据所需的功能选择插件类型。例如,使用World插件来控制世界属性,例如物理引擎、环境光等;使用Model插件来控制关节和模型的状态;使用Sensor插件获取传感器信息并控制传感器属性等。

下面以一个例子说明如何编写插件。

Hello World! 插件的编写

插件代码的结构十分简单,基本的world插件只包含一个C++类以及一些成员函数。

首先,如果你是从debians安装的Gazebo,请确保你已经安装了Gazebo开发文件。如果你是从源安装的Gazebo,则可以忽略此步骤。如果你有gazebo9以外的版本,请将9替换为您拥有的版本号。

sudo apt-get install libgazebo9-dev

接下来,在某目录下(如~/Documents/)中新创建一个目录和.cc文件:

$ cd ~/Documents/
$ mkdir gazebo_plugin_tutorial
$ cd gazebo_plugin_tutorial/
$ gedit hello_world.cc

将以下内容复制到http://hello_world.cc中:

#include 

代码解释

#include 

gazebo/gazebo.hh 文件包含了一些gazebo的基础函数,但有时可能还会需要包含 gazebo/physics/physics.hh 、 gazebo/rendering/rendering.hh、gazebo/sensors/sensors.hh 等。所有的插件都必须位于 gazebo 命名空间中。

class 

每个插件都需要继承一个插件类,在这里我们继承了 WorldPlugin 类。

public

另一个不可缺少的函数是Load(),它用于接收SDF文件中指定的元素和属性。

GZ_REGISTER_WORLD_PLUGIN

最后,必须使用 GZ_REGISTER_WORLD_PLUGIN 宏在模拟器中注册插件,用插件类的名称 WorldPluginTutorial 作为参数。每类插件都有与之匹配宏,例如:GZ_REGISTER_MODEL_PLUGIN、 GZ_REGISTER_SENSOR_PLUGIN、 GZ_REGISTER_GUI_PLUGIN、 GZ_REGISTER_SYSTEM_PLUGIN、GZ_REGISTER_VISUAL_PLUGIN。

接下来对插件进行编译。

编译插件

首先在同一目录下创建 CMakeLists.txt :

$ gedit ~/Documents/gazebo_plugin_tutorial/CMakeLists.txt

在文件中填写以下内容:

cmake_minimum_required(VERSION 

创建build目录:

$ mkdir ~/Documents/gazebo_plugin_tutorial/build
$ cd ~/Documents/gazebo_plugin_tutorial/build

编译代码:

$ cmake ../
$ make

编译完成后,将会在 build 目录下生成一个共享库 libhello_world.so。为了能够在Gazebo中插入该库,我们需要将库的路径添加到环境变量 GAZEBO_PLUGIN_PATH 中。我们打开 ~/.bashrc 文件,将下面一行添加到文件中并保存:

gedit ~/.bashrc

在文件末尾添加以下代码

export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/Documents/gazebo_plugin_tutorial/build/

使用插件

重新打开终端使环境变量加载生效,在终端中输入以下命令以创建一个世界文件,也可以在已有的世界文件中直接进行加载。

$ gedit ~/Documents/gazebo_plugin_tutorial/hello.world

在世界文件中添加以下代码并保存:

<?xml version="1.0"?>

接下来利用 gzserver 测试插件:

$ gzserver ~/Documents/gazebo_plugin_tutorial/hello.world --verbose

结果如下,成功返回我们在插件中定义的"Hello World!"语句

刚开始琢磨gazebo的自定义插件,很多地方还不是很明白。先大致翻译,以后深入理解了再回来补充。

参考资料

[1] 官网教程: Tutorial : Plugins 101

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gazebo入门_【ROS-Gazebo】仿真插件编写教程(1)——概述 的相关文章

  • gazebo通过sdf搭建仿真环境和机器人Husky

    具体格式要求可参考 http sdformat org spec ver 1 6 elem sdf
  • ros+arduino学习(六):重构ros_lib库文件

    前言 ros lib是arduino程序和ros连接的库文件 通过使用这些库文件和相关函数 可以在arduino上通过编程使得arduino硬件开ros节点程序 这样arduino硬件就可以与上位机通过话题进行通讯 从而把arduino从传
  • Moveit简单使用,在rviz中实现手动拖动-记录

    GAZEBO下载 一 首先需要准备模型文件 可以是自己的solidworks用URDF工具导出的 也可以是在网上下载的URDF文件包 1 我用的是solidworks手动导出的模型 b站博主导出SOLIDWORKS模型至URDF这个教程比较
  • Hypervisor介绍及在智能驾驶的应用

    转自Hypervisor 智能座舱和智能驾驶融合的关键技术 腾讯新闻
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • catkin_make后找不到ROS包

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • 在 ROS - Python 中使用来自多个主题的数据

    我能够显示来自两个主题的数据 但无法在 ROS 中实时使用和计算这两个主题的数据 用 Python 代码编写 您有想法存储这些数据并实时计算吗 谢谢 usr bin env python import rospy import string
  • gazebo(fortress) set the path of sdf file

    This method only satisfied with gazebo fortress not harmenic
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 无法在 Ubuntu 20.04 上安装 ROS Melodic

    我正在尝试使用这些命令在 Ubuntu 20 04 上安装 ROS Melodic sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类

随机推荐