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教程 的相关文章

  • GStreamer 上的“列入黑名单”是什么意思?

    我正在尝试交叉编译 GStreamer 版本是1 2 3 主机PC的操作系统是x86 linux 目标系统的操作系统是MIPSEL linux操作系统 我成功为目标设备编译了 gstreamer 和插件 和gst launch 1 0可以被
  • 如何设计插件系统才能不浪费这么多资源?

    我正在尝试建立一个基本的插件系统 https stackoverflow com a 3356922 99923就像您在 WordPress 等 CMS 中常见的那种 您有一个插件文件夹 它们通过使用事件通知的方式与主系统的操作相关联Obs
  • 如何在管理面板中显示插件激活通知?

    当我激活测试插件时 我试图在管理面板中显示通知 我怎样才能显示它 那个方法是什么 对于插件激活 不能直接使用 admin notices 挂钩 因为存在重定向 解决方法是将您的通知存储在选项表中 并在下次检查 另外 如果您还想涵盖插件升级和
  • 安装插件时出错:“无法获取框架操纵器服务”

    在我的 Windows XP 计算机上使用 Eclipse Helios 的 RCP 版本 我尝试从标准更新站点安装一些相当基本的插件 例如 PyDev 和 EPIC 不幸的是 我不断收到以下错误消息 An error occurred w
  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • 如何在插件场景中实现程序集绑定重定向?

    我有一个plugin P延伸和application A NET40 我无法控制 P 程序集 NET40 有一个shared dependency D NET35 P和D都依赖于FSharp Core 但版本不同 P是针对FSharp Co
  • Facebook 页面插件无法运行 - 仅适用于一个网站

    我已将页面插件集成到我的目录中 ruhrlink de info php schluessel 150991 不起作用 其他的可以 当我在开发者网站 gt 页面插件中手动输入网址时 它在那里也不起作用 https www facebook
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • 在Web应用程序中调用phonegap插件功能

    我正在构建我的第一个phonegap应用程序 当我打开该应用程序时 我立即将用户重定向 window location 到托管我的网络应用程序的服务器 是否可以从那里加载phonegap 插件 因为 deviceready 事件没有触发 我
  • Maven:无法解析的构建扩展

    我一直在谷歌上查看 没有任何内容真正指出这个问题 当我运行 mvn clean install 时 它返回以下错误 错误 无法解析的构建扩展 插件 org sonatype flexmojos flexmojos maven plugin
  • Javascript图像编辑插件

    在哪里可以找到 Javascript 或 jQuery 图像编辑器插件 用户可以单击图像进行编辑 并且该插件允许他们进行裁剪 调整大小 旋转 翻转等 Pixastic http pixastic com lib 不再活跃 和CamanJS
  • FileReader 在 Ionic 2 中未触发 onloadend

    我正在尝试使用 cordova file plugin 读取本地文件 目前我可以读取本地目录的内容并选择单个文件 但我在获取文件内容时遇到问题 这是我的函数 从列表中选择文件后单击按钮即可调用该函数 import window resolv
  • 有没有人有 Ruby 和 Rake 的 Notepad++ 函数列表插件的解析规则

    我使用 Notepad 编辑 rake 文件 并且希望能够使用函数列表插件 我无法在线找到任何解析规则 并且 语言解析规则 对话框没有非常清晰的记录 我正在将方法解析到以下列表中 但还想显示任务 Function Begin t def t
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • 如何在 Eclipse 下载站点上查找哪些功能包含所需的插件

    在针对目标平台开发 RCP 应用程序时 我 和别的 https stackoverflow com questions 10001143 eclipse rcp target platform bundle org eclipse ui v
  • 用于生成多色文本的 jQuery 插件,该文本可在悬停时改变颜色

    我想为各种链接生成多色文本 并从预先指定的颜色数组中为各个字母随机分配颜色 当将鼠标悬停在带有文本的 div 上时 颜色会发生变化 我正在考虑一个 jQuery 插件 脚本将是可行的方法 我想知道是否存在这样的插件或近似插件 Thanks
  • 如何创建浏览器插件?

    我必须创建一个插件 当用户将鼠标悬停在某些术语上时 该插件必须显示信息 谁能告诉我如何做的方向 我对创建插件没有太多想法 我知道我想要做的事情可以通过java脚本来完成 但是java脚本文件可以作为浏览器插件安装吗 任何对此的想法将不胜感激
  • 在 IE 上使用 CKEditor 插件获取选定的文本

    我为 CKEditor 制作了一个插件 但它依赖于当前选定的文本 在 FF 和 Chrome 中我可以使用 var selectedText editor getSelection getNative 但这在 IE 中不起作用 我只能得到
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz

随机推荐

  • 最新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 能够在运行的系统中插