引言:因为项目需要,我们需要提供基于某种定制传感器的GAZEBO仿真,因此,开始了整个基于ROS下的GAZEBO仿真学习
一、GAZEBO添加插件代码
链接: GAZEBO添加插件代码
链接: link
链接: link
链接: link
1、什么是gazebo_plugin
gazebo的插件机制给用户提供了更多的自由度和发挥空间,可以通过插件与gazebo中的模型进行交互。比如改变模型的质量、惯性张量,给模型施加力、提供速度等等。同时,gazebo的插件机制也具有ros发布订阅、请求响应等模式。
2、怎么使用gazebo插件
gazebo的插件机制相关的教程比较少,我的个人对他的使用流程是这样的。首先你会写一个.cc文件以及相应的.hh文件,然后将其编译成为一个.so的动态链接库,然后再在模型的xacro文件中的gazebo标签中将这个动态链接库与模型绑定。然后加载模型后,插件将会一起上传到gazebo中,你可以在gazebo/model/plugins下查看一个模型绑定的插件。下面具体说说:
Gazebo插件通过标准C++类直接控制Gazebo模型, 其具有以下优点
可以控制gazebo中几乎各个方面;
容易共享;
能够在运行的系统中插入移除;
Gazebo插件共有六种:
1.World:控制世界特性,如物理引擎、环境光等
2.Model:用于控制关节和模型状态
3.Sensor:用于获取传感器数据和控制传感器
4.System
5.Visual
6.GUI
安装Gazebo开发文件
sudo apt-get install libgazebo#-dev //#为版本号(无需重复安装)
Plugin简单例程—Hello WorldPlugin!
1、创建Plugin文件夹
mkdir ~/gazebo_plugin_tutorial
cd ~/gazebo_plugin_tutorial
gedit hello_world.cc
2、输入如下代码:
#include <gazebo/gazebo.hh>
/* 包含gazebo基本功能,
不包括gazebo/physics/physics.hh, gazebo/rendering/rendering.hh, 和 gazebo/sensors/sensors.hh
gazebo/gazebo.hh 文件包含了一些gazebo的基础函数,但有时可能还会需要包含 gazebo/physics/physics.hh 、 gazebo/rendering/rendering.hh、gazebo/sensors/sensors.hh 等。所有的插件都必须位于 gazebo 命名空间中。*/
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 作为参数。每类插件都有与之匹配宏,例如:GZ_REGISTER_MODEL_PLUGIN、 GZ_REGISTER_SENSOR_PLUGIN、 GZ_REGISTER_GUI_PLUGIN、 GZ_REGISTER_SYSTEM_PLUGIN、GZ_REGISTER_VISUAL_PLUGIN。*/
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
}
2、编译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})
3、编译CMakeLists
mkdir ~/gazebo_plugin_tutorial/build
cd ~/gazebo_plugin_tutorial/build
cmake ../
make
4、编译后即可生成如下图所示共享库文件
将库路径添加到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