Gazebo Plugins教程

2023-05-16

  • Overview of Gazebo plugins

Gazebo插件通过标准C++类直接控制Gazebo模型, 其具有以下优点

可以控制gazebo中几乎各个方面;

容易共享;

能够在运行的系统中插入移除;

Gazebo插件共有六种:

1.World:控制世界特性,如物理引擎、环境光等

2.Model:用于控制关节和模型状态

3.Sensor:用于获取传感器数据和控制传感器

4.System

5.Visual

6.GUI

Plugin简单例程---Hello WorldPlugin!

安装Gazebo开发文件

sudo apt-get install libgazebo#-dev   //#为gazebo版本号,6、7 .etc

创建Plugin文件夹

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

输入如下代码:

#include <gazebo/gazebo.hh>  
/* 包含gazebo基本功能,
不包括gazebo/physics/physics.hh, gazebo/rendering/rendering.hh, 和 gazebo/sensors/sensors.hh */

namespace gazebo  //所有插件都需要在gazebo名空间中编写
{

/* 所有插件类的创建需要继承一种plugin类型,下面是继承WorldPlugin */
  class WorldPluginTutorial : public WorldPlugin  
  {
    public: WorldPluginTutorial() : WorldPlugin()//默认构造函数
            {
              printf("Hello World!\n");//只要创建该类类型就会打印
            }
/* 唯一另一个必须的函数是Load(),其中_sdf接收一个包含sdf文件中指定的参数和属性 */
    public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
            {
            }
  };
/* 使用GZ_REGISTER_WORLD_PLUGIN macro函数将插件注册,函数的需要的参数仅为插件类名
macro函数还包括GZ_REGISTER_MODEL_PLUGIN, GZ_REGISTER_SENSOR_PLUGIN, GZ_REGISTER_GUI_PLUGIN,
 GZ_REGISTER_SYSTEM_PLUGIN and GZ_REGISTER_VISUAL_PLUGIN*/
  GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)

}

编译plugin代码---创建CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")

add_library(hello_world SHARED hello_world.cc)
target_link_libraries(hello_world ${GAZEBO_LIBRARIES})

编译CMakeLists

mkdir ~/gazebo_plugin_tutorial/build
cd ~/gazebo_plugin_tutorial/build

cmake ../
make

编译后即可生成如下图所示共享库文件

将库路径添加到GAZEBO_PLUGIN_PATH

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

使用插件

只要作为共享库编译插件,就可以将其添加到SDF文件的world或model中。gazebo会分析sdf文件,定位插件,加载插件代码。为了让gazebo找到插件,可以填写插件绝对路径或将插件路径添加到GAZEBO_PLUGIN_PATH环境变量中。

创建world文件

gedit ~/gazebo_plugin_tutorial/hello.world

在world文件中添加plugin插件

<?xml version="1.0"?>
<sdf version="1.4">
  <world name="default">
    <plugin name="hello_world" filename="libhello_world.so"/>
  </world>
</sdf>

运行world文件

gzserver ~/gazebo_plugin_tutorial/hello.world --verbose

  • Model plugins

本插件会向当前模型施加一个线速度。记得测试之前先把上一个教程的代码删除,重新编写合适的CMakeLists进行编译

$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.cc

插件代码

#include <functional>   ///STL 定义运算函数(代替运算符)
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>
#include <gazebo/common/common.hh>
#include <ignition/math/Vector3.hh>

namespace gazebo
{
  class ModelPush : public ModelPlugin
  {
    /* typedef boost::shared_ptr<Model> ModelPtr Model类型的共享指针
        sdf::ElementPtr指向sdf,即将.world文件中的参数属性导入进来*/
    public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)
    {
      /* Store the pointer to the model
         让ModelPush中的model指向当前模型*/
      this->model = _parent;
 
      /* Listen to the update event. This event is broadcast every
         simulation iteration循环.
         typedef boost::shared_ptr<Connection> ConnectionPtr
         static ConnectionPtr ConnectWorldUpdateBegin(T _subscriber) */
      this->updateConnection = event::Events::ConnectWorldUpdateBegin(
          std::bind(&ModelPush::OnUpdate, this));//std::bind在functional中
    }
 
    // Called by the world update start event
    public: void OnUpdate()
    {
      // Apply a small linear velocity to the model.
      // void SetLinearVel(const math::Vector3 & _vel) 	
      //model是指向physics中的Model类的智能指针,因此要在API中model class中找SetLinearVel
      this->model->SetLinearVel(ignition::math::Vector3d(.3, 0, 0));
    }
 
    // Pointer to the model
    private: physics::ModelPtr model;
 
    /* Pointer to the update event connection
       typedef boost::shared_ptr<Connection> ConnectionPtr*/
    private: event::ConnectionPtr updateConnection;
  };
 
  // 注册插件
  GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}

编译插件,改写~/gazebo_plugin_tutorial/CMakeLists.txt后保存

add_library(model_push SHARED model_push.cc)
target_link_libraries(model_push ${GAZEBO_LIBRARIES})

编译

$ cd ~/gazebo_plugin_tutorial/build
$ cmake ../
$ make

 运行插件,在.world环境文件中添加插件

~/gazebo_plugin_tutorial/model_push.world

$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.world

 环境文件内容如下:

<?xml version="1.0"?> 
<sdf version="1.4">
  <world name="default">

    <!-- Ground Plane -->
    <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>

        <visual name="visual">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </visual>
      </link>

      <plugin name="model_push" filename="libmodel_push.so"/>
    </model>        
  </world>
</sdf>

 将库文件添加到环境变量中

$ export GAZEBO_PLUGIN_PATH=$HOME/gazebo_plugin_tutorial/build:$GAZEBO_PLUGIN_PATH

运行环境

$ cd ~/gazebo_plugin_tutorial/
$ gzserver -u model_push.world

打开图形界面并点击Play

$ gzclient

可以看到箱子会被一个力向前推

 

  • World plugins

 

 

 

 

  • Programmatic World Control

 

 

 

  • System Plugin

 

 

 

 

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

Gazebo Plugins教程 的相关文章

  • 围绕文本创建表格

    我有一个单词列表 每个单词都独占一行 这是表格的第一列 我想手动创建第二列 我现在想使用一些插件 它将在文本周围创建一个 ASCII 表 因此我有很好的格式 每列中的起始字母应该在一个 垂直线 中 或者我应该能够快速移动到通过一个快捷方式正
  • 将结构(或类)从 C++ dll 传递到 C# (Unity 3D)

    我正在编写一个包装器以从传感器获取一些数据 虽然我在传递 int float 和它们的数组方面没有问题 但我很难掌握如何传递结构 代码总结 C side 结构如下 struct HandInfo int id float x y z 在某一
  • 如何在 WooCommerce 中启用自定义产品类型的价格和库存

    我在 WooCommerce 应用程序中创建了自定义产品类型 function register variable bulk product type class WC Product Variable bulk extends WC Pr
  • 使用强命名程序集进行插件安全吗?

    我正在寻找一种方法来防止未知方将他们自己的包含恶意代码的插件附加到我的应用程序中 我偶然发现了这篇文章 NET 程序集插件安全性 https stackoverflow com q 932339 1462656 它建议对程序集进行强命名 并
  • 请推荐一个可处理可拖动元素碰撞检测的 JQuery 插件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们正在使用可拖动 http jqueryui com demos draggable JQuery UI 插件 需要禁止元素之间重叠 我
  • bluej接口的eclipse插件[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Sublime Text 中使用控制台

    我正在使用 Sublime Text 2 来编写程序 并希望在其中运行控制台来编译和运行它们 有没有办法在 Sublime Text 2 中嵌入控制台命令行 已经在那里了吗 我同时使用 Windows 和 Linux 我想你可以尝试创建一个
  • Vim 中可以显示缩进指南吗?

    我是 Vim 的长期用户 三四年 最近开始处理一些深度嵌套的代码 此代码使用空格缩进 而不是制表符 我想要一些干净且不分散注意力的缩进指示 以帮助在我查看多个层次的深度内容时跟踪我所在的代码块 set list 只显示制表符和结束行字符 我
  • 如何在 Scala 编译器插件中生成文本形式的新源代码?

    我刚刚完成了 Java 6 编译器插件的第一个版本 它根据注释自动生成包装器 代理 适配器 委托 您可以随意称呼它 由于我正在进行 Java Scala 混合项目 因此我希望能够在 Scala 代码中使用相同的注释 并获得相同的生成代码 当
  • 从插件 (.so) 加载 Qt UI(带图像)时遇到问题

    我有一个插件 可以加载并显示一个自定义小部件 该小部件显示从资源文件 resources qrc 加载的图像 作为 QLabel 的背景 我面临的问题是 加载插件后 它会正确显示小部件 但不显示图像 我尝试将 Q INIT RESOURCE
  • 将 PHP 变量传递到 jQuery 函数

    我正在尝试为我的网站实现 jQuery Flare 视频插件 有一个下拉菜单 用户必须从中选择年份 当单击提交按钮时 视频将显示在屏幕上 我有一个数据库 可以从数据库中获取视频的路径 即 row videoName 我的问题是如何在 jQu
  • 用于生成唯一链接的 Rails 插件?

    我的应用程序中有很多地方需要生成带有唯一标记的链接 foo com g6Ce7sDygw 或其他 每个链接可能与一些会话数据相关联 并将用户带到一些特定的控制器 操作 有谁知道有一个 gem 插件可以做到这一点 它很容易实现 但会更干净 无
  • 无法加载 python gstreamer 元素

    我正在跟随指南https mathieuduponchelle github io 2018 02 01 Python Elements html gi language undefined https mathieuduponchelle
  • 如何设计插件系统才能不浪费这么多资源?

    我正在尝试建立一个基本的插件系统 https stackoverflow com a 3356922 99923就像您在 WordPress 等 CMS 中常见的那种 您有一个插件文件夹 它们通过使用事件通知的方式与主系统的操作相关联Obs
  • 插件 AppDomains 解决方法

    在处理自己的子目录中的插件程序集时 存在一个众所周知的问题 一旦这些程序集尝试从其子目录加载各自的依赖项 它们将无法加载 解决方案是在 AppDomains 中加载插件PrivateBinPath设置在他们的AppDomainSetup初始
  • 为什么 JavaScript 文件在我的 Cake 插件中被解析为 PHP?

    我正在开发的 Cake 插件中包含的 JavaScript 之一出现问题 由于某种原因 JavaScript 文件被解析为 PHP 文件 因此加载该文件会抛出此错误 这是 PHP 解析错误 b Parse error b syntax er
  • 有关 Jquery/Masonry 的帮助,小调整

    对于我的一生 我无法弄清楚到底发生了什么 我缺乏 Jquery 知识可能与此有关 看看这个 http jsfiddle net ryanjay fgNMJ http jsfiddle net ryanjay fgNMJ 加载页面时 每张照片
  • 用于云服务“沙盒”的 SecurityManager

    All 我正在设计一个基于云的服务 该服务将提供执行客户提交的一些 插件 代码的选项 为了使这项工作正常进行 插件不能威胁系统完整性或有能力访问其他客户端的数据 这一点至关重要 理想情况下 我希望客户端能够提交一个简单的 jar 文件 包含
  • Vim NerdCommenter:在 vimrc 中添加新文件类型

    有没有办法在 vimrc 中为 NerdCommenter 定义新的文件类型注释 它已经可以工作了 但是如果我可以将其直接放入 vimrc 中 备份配置会更容易 Thanks NERDCommenter 能够解析commentstring选
  • 什么插件/工作台框架是 Eclipse RCP 的最佳 .NET 替代品?

    我正在寻找一个与 Eclipse 插件框架相当的基于插件的应用程序框架 在我看来 它包括 a core 插件管理框架 Equinox OSGI 它提供了声明扩展端点 然后发现并加载为这些端点提供服务的插件的能力 这与依赖注入不同 但不可否认

随机推荐

  • 最新ChatGPT GPT-4 NLU应用之实体分类识别与模型微调(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(六)

    目录 前言最新ChatGPT GPT 4 自然语言理解NLU实战之实体分类识别与模型微调主题分类精准分类解决手段模型微调步骤核心代码 其它NLU应用及实战相关文献 参考资料其它资料下载 前言 想象一下 xff0c 如果您也可以训练一个为特定
  • 最新ChatGPT GPT-4 NLU实战之智能多轮对话机器人(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(七)

    目录 前言最新ChatGPT GPT 4 自然语言理解NLU实战之智能多轮对话机器人概述分类不是万物都要ChatGPT的任务对话机器人设计要点 以订餐机器人设计为例使用目的使用方法消息查询 存储消息解析实时干预更新策略 敏感性检查 xff0
  • SIM868模块+Arduino将位置信息上传到服务器

    SIM868模块 43 Arduino将位置信息上传到服务器 一 简要介绍 商家提供的资料中 xff0c 有将GPS信息发送到OneNet平台的源码 xff0c 本文就是在此基础上进行修改 xff0c 将数据发送到自己的服务器中 二 源码
  • 登录和第三方授权(Cookie和Authorization)

    文章目录 1 登录和授权的区别2 Cookie2 1 Cookie的工作机制2 2 Cookie的作用2 3 Cookie存在的问题 xff08 了解即可 xff09 3 Authorization3 1 Basic3 2 Bearer3
  • VSCode下便捷编译运行C++代码——Code Runner配置及说明

    本文将描述如何使用VScode及其插件方便快速编译运行C 43 43 代码 下面举例均以C 43 43 为例 其他语言不再赘述 安装VSCode 官方地址配置好你的编译器路径 确保可以 如何验证 在命令行输入 若有相关信息输出则说明已配置成
  • ros如何获取topic中的md5sum及类型等

    string doQueue const ros MessageEvent lt topic tools ShapeShifter const gt amp msg event string const amp topic shared p
  • C语言使用 学习记录(1)

    本人没学过C xff0c 但是工作中赶鸭子上架 xff0c 得接触一些 对于一些开源代码 xff0c 编译配置 动态库 静态库之类的稍稍掌握了一些 xff0c 但写起代码来 xff0c 还是一头雾水 最近项目上的机会 xff0c 跟人学了些
  • 英伟达TX2的USB口无法使用的解决办法

    新做了一块TX2的底板 xff0c 但是USB口无法使用 xff0c 插上去USB设备之后什么反应都没有 这是由于官方的底板上采用INA3221芯片做了电源监控电路 xff0c 只有确保5V电源达到要求的情况下才会使能USB口 而新做的板子
  • Socket编程 ——UDP 实验报告

    一 客户端数据反射交互 xff08 1 xff09 实验内容 要求 xff1a 利用数据报套接字实现数据传输 客户端创建UDP套接字 xff0c 向指定的服务端发送数据 xff1b 服务端接收到新数据 xff0c 显示是谁发送过来的 xff
  • Ubuntn设置程序开机启动 指定浏览器

    setp1 xff1a 设置jar开机启动 xff08 非服务启动方式 xff09 1 新建启动脚本 auto start sh xff08 并基于权限命令 xff1a sudo chmod 777 auto start sh xff09
  • 企业微信开发实战:自建审批流引擎

    1 概述 企业微信上是这样介绍的 不过经本人的研究测试 xff0c 该工作流引擎的功能是比较有限的 首先只有移动端才能发起 xff0c 流程的定义是必须在企业微信控制台中定义 xff0c 而且不支持条件分支 xff0c 适用于比较简单的应用
  • CmakeLists 复杂c++工程应用实例

    project vir data process cmake minimum required VERSION 2 8 add compile options std 61 c 43 43 11 include directories us
  • ROS学习笔记7_服务端Server

    在上图所示的模型中 xff0c Client作为请求的发送端 xff0c Server端接收Client发送的指令 xff0c 并且完成topic指令的发送 其中请求的信息类型是std srvs Trigger类 xff0c 同时返回一个R
  • char和int转换

    char和int的转换有两种方式 最简单的方法就是利用ASSCII码的差值 xff0c 直接用char的值减去 0 就行了 eg xff1a char a 61 39 9 39 int a 61 a 39 0 39 或者就用atof函数 x
  • printf缓冲区踩坑

    问题 碰到了这样一段代码 经过简化的 span class token macro property span class token directive hash span span class token directive keywo
  • PSINS学习笔记---姿态解算(1)---圆锥运动

    PSINS堪称中国导航领域的福音了 计划将工具箱中常用于工程实际中的相关算法根据个人理解做个解读注释 并且利用严老师网站中公开的数据集进行测试 由于个人水平有限 料想会漏洞百出 希望大家发现了不吝赐教 xff0c 感谢 xff01 1 加载
  • 使用matlab读取excel并作图

    在写论文时无奈非要用matlab xff0c 于是用地面站把传感器数据导出到了excel xff0c 用matlab画个图 用地面站向excel中读入数据 读入完保存即可 我读的是两种传感器数据 xff0c 一个是光流的位置值 xff0c
  • 坐标系梳理

    在很久以来 xff0c 我以为世界上只有两种坐标系 n系导航系和b系机体坐标系 最近在调试厂实验期间才知道原来还有特么这么多坐标系 机体系 xff1a 无人机 潜航器这些刚体自身的坐标系 xff0c 坐标系符合右手法则 xff0c x轴为机
  • 串口通信实现Int或float类型数据传输的方法

    方法 xff1a 发送方拆分数据为多个字节 xff0c 接收方再合并 串口通信程序中发送和接受数据以字节为单位 xff0c 将int或float类型的数据拆成单个字节存放到发送字符数组中 xff0c 然后接收方按照大小端模式将其重新合并为i
  • Gazebo Plugins教程

    Overview of Gazebo plugins Gazebo插件通过标准C 43 43 类直接控制Gazebo模型 xff0c 其具有以下优点 可以控制gazebo中几乎各个方面 xff1b 容易共享 xff1b 能够在运行的系统中插