ros2与webots入门教程-创建自定义 Cpp 插件
ros2与webots入门教程-创建自定义 Cpp 插件
说明:
- 介绍如何创建自定义 Cpp 插件
- 从 webots_ros2 1.1.0 开始,该软件包包含了 webots_ros2_driver。 子包的主要目标是:
- 它会自动从 Webots 机器人模型中创建一个 ROS 2 界面。
- 它允许用户在 URDF 文件中配置 ROS 2 接口。
- 它允许用户使用 pluginlib 插件机制扩展接口。
- 在本教程中,我们将解释如何创建一个利用 webots_ros2_driver 插件机制的自定义 C++ 插件。
webots_ros2_driver 架构
- 请查看下图以更好地了解插件系统架构。
插件文件结构
- 下面的树描述了自定义插件的最小文件结构。
.
├── include
│ └── webots_ros2_plugin_example
│ └── WebotsRos2PluginExample.hpp
├── src
│ └── WebotsRos2PluginExample.cpp
├── webots_ros2_plugin_example.xml
├── CMakeLists.txt
└── package.xml
- include/webots_ros2_plugin_example/WebotsRos2PluginExample.hpp 文件,请参阅插件 C++ 头文件部分。
- src/WebotsRos2PluginExample 文件,请参阅插件 C++ 实现文件部分。
- webots_ros2_plugin_example.xml pluginlib 描述文件(参见 pluginlib 描述文件部分)。
- CMakeLists.txt 文件(请参阅插件 CMake 文件部分)。
插件文件
- 本节展示了用于创建 Webots 插件包(以及一般的 pluginlib 包)的关键文件。
- 插件 C++ 头文件
#ifndef WEBOTS_ROS2_PLUGIN_EXAMPLE_HPP
#define WEBOTS_ROS2_PLUGIN_EXAMPLE_HPP
#include "rclcpp/macros.hpp"
#include "webots_ros2_driver/PluginInterface.hpp"
#include "webots_ros2_driver/WebotsNode.hpp"
namespace webots_ros2_plugin_example
{
class WebotsRos2PluginExample : public webots_ros2_driver::PluginInterface
{
public:
// Your plugin has to override step() and init() methods
void step() override;
void init(webots_ros2_driver::WebotsNode *node, std::unordered_map<std::string, std::string> ¶meters) override;
};
}
#endif
- 插件 C++ 实现文件
#include "webots_ros2_plugin_example/WebotsRos2PluginExample.hpp"
namespace webots_ros2_plugin_example
{
void WebotsRos2PluginExample::init(webots_ros2_driver::WebotsNode *node, std::unordered_map<std::string, std::string> ¶meters)
{
// This method is executed once the plugin is loaded by the `webots_ros2_driver` package.
// The `webots_ros2_driver::WebotsNode` inherits the `rclcpp::Node`, so you have all methods available from there.
// In addition, from the `webots_ros2_driver::WebotsNode` instance you can also get a `webots::Robot` reference (`node.robot()`).
}
void WebotsRos2PluginExample::step()
{
// This method is executed on each Webots step
}
}
// The class has to be exported with `PLUGINLIB_EXPORT_CLASS` macro.
// The first argument is the name of your class, while the second is always `webots_ros2_driver::PluginInterface`
#include "pluginlib/class_list_macros.hpp"
PLUGINLIB_EXPORT_CLASS(webots_ros2_plugin_example::WebotsRos2PluginExample, webots_ros2_driver::PluginInterface)
- pluginlib 描述文件
- 这个文件是 pluginlib 能够找到您的 Webots ROS 2 插件所必需的。
<library path="webots_ros2_plugin_example">
<!-- The `type` attribute is a reference to the plugin class. -->
<!-- The `base_class_type` attribute is always `webots_ros2_driver::PluginInterface`. -->
<class type="webots_ros2_plugin_example::WebotsRos2PluginExample" base_class_type="webots_ros2_driver::PluginInterface">
<description>
This is a Webots ROS 2 plugin example
</description>
</class>
</library>
- 插件 CMake 文件
- CMake 文件与典型的 ROS 2 CMake 文件略有不同,因为它包含 Webots 头文件和 pluginlib。
cmake_minimum_required(VERSION 3.5)
project(webots_ros2_plugin_example)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
# Besides the package specific dependencies we also need the `pluginlib` and `webots_ros2_driver`
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(pluginlib REQUIRED)
find_package(webots_ros2_driver REQUIRED)
# Export the plugin configuration file
pluginlib_export_plugin_description_file(webots_ros2_driver webots_ros2_plugin_example.xml)
# The rest is standard ROS 2 packaging description
add_library(
${PROJECT_NAME}
SHARED
src/WebotsRos2PluginExample.cpp
)
target_include_directories(
${PROJECT_NAME}
PRIVATE
include
)
ament_target_dependencies(
${PROJECT_NAME}
pluginlib
rclcpp
webots_ros2_driver
)
install(TARGETS
${PROJECT_NAME}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
ament_export_include_directories(
include
)
ament_export_libraries(
${PROJECT_NAME}
)
ament_package()
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号