< >
Home » ROS2与webots入门教程 » ros2与webots入门教程-创建自定义 Cpp 插件

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> &parameters) 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> &parameters)
  {
    // 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()

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与webots入门教程