Cómo implementar rápidamente el complemento en ROS

Wikipedia: complemento

Tabla de contenido

paso:

paso 1: crea una clase base

paso 2: crea una clase de complemento

paso 3: Registre el complemento

paso 4: compile la biblioteca de complementos

Paso 5: La configuración del complemento es visible para el sistema ROS.

paso 6: Aplicar el complemento


paso:

paso 1: crea una clase base

#ifndef PLUGINLIB_TUTORIALS__POLYGON_BASE_H_
#define PLUGINLIB_TUTORIALS__POLYGON_BASE_H_

namespace polygon_base
{
  class RegularPolygon
  {
    public:
      virtual void initialize(double side_length) = 0;
      virtual double area() = 0;
      virtual ~RegularPolygon(){}

    protected:
      RegularPolygon(){}
  };
};
#endif

El constructor de la clase base es opcional. El
constructor se coloca bajo protegido, lo que indica que la inicialización de la clase padre debe completarse con la función initialize ().

paso 2: crea una clase de complemento

La clase de complemento es la clase derivada, la clase utilizada para la creación de instancias.

#ifndef PLUGINLIB_TUTORIALS__POLYGON_PLUGINS_H_
#define PLUGINLIB_TUTORIALS__POLYGON_PLUGINS_H_
#include "polygon_base.h"
#include <cmath>

namespace polygon_plugins
{
  class Triangle : public polygon_base::RegularPolygon
  {
    public:
      Triangle(){}

      void initialize(double side_length)
      {
        side_length_ = side_length;
      }

      double area()
      {
        return 0.5 * side_length_ * getHeight();
      }

      double getHeight()
      {
        return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
      }

    private:
      double side_length_;
  };

  class Square : public polygon_base::RegularPolygon
  {
    public:
      Square(){}

      void initialize(double side_length)
      {
        side_length_ = side_length;
      }

      double area()
      {
        return side_length_ * side_length_;
      }

    private:
      double side_length_;

  };
};
#endif

paso 3: registre la clase de complemento

PLUGINLIB_EXPORT_CLASS (subclase 1, clase principal)
...
PLUGINLIB_EXPORT_CLASS (subclase n, clase principal)
función: exportar clases derivadas y registrarlas con el sistema ROS. El propósito es permitir que el sistema ROS busque esta categoría.
PD: la declaración de la línea de exportación generalmente se escribe al final del archivo **. Cpp correspondiente a la clase derivada

#include <pluginlib/class_list_macros.h>
#include "pluginlib_test/polygon_base.h"
#include "pluginlib_test/polygon_plugins.h"

/*
 注册插件
*/
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)

paso 4: compile la biblioteca de complementos

Modifique add_library ($ {PROJECT_NAME} src / *. Cpp) en el archivo CMakeLists.txt para compilar el archivo de la biblioteca (la esencia del complemento es el archivo de la biblioteca).

Paso 5: La configuración del complemento es visible para el sistema ROS.

Cree un archivo de descripción de clase de complemento , archivo plugins.xml , que describa el contenido detallado del complemento. P.ej

<library path="lib/libpluginlib_test">
  <class type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
    <description>This is a triangle plugin.</description>
  </class>
  <class type="polygon_plugins::Square" base_class_type="polygon_base::RegularPolygon">
    <description>This is a square plugin.</description>
  </class>
</library>

Entre ellos, pluginlib_test es el nombre de la biblioteca generada en el paso 4, Triangle y Square son clases de complementos (subclases) y RegularPolygon es la clase principal.

Añadir el plugins.xml descripción del archivo de la plug-in para el package.xml archivo de consulta del paquete de funciones, por ejemplo:
 

  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->
    <pluginlib_test plugin="${prefix}/polygon_plugins.xml" />
  </export>

Donde pluginlib_test es el nombre del paquete del paquete de funciones

paso 6: Aplicar el complemento

Los casos de aplicación son los siguientes:

#include <pluginlib/class_loader.h>
#include "pluginlib_test/polygon_base.h"

int main(int argc, char** argv)
{
  pluginlib::ClassLoader<polygon_base::RegularPolygon> poly_loader("pluginlib_test", "polygon_base::RegularPolygon");

  try
  {
    boost::shared_ptr<polygon_base::RegularPolygon> triangle = poly_loader.createInstance("polygon_plugins::Triangle");
    triangle->initialize(10.0);

    boost::shared_ptr<polygon_base::RegularPolygon> square = poly_loader.createInstance("polygon_plugins::Square");
    square->initialize(10.0);

    ROS_INFO("Triangle area: %.2f", triangle->area());
    ROS_INFO("Square area: %.2f", square->area());
  }
  catch(pluginlib::PluginlibException& ex)
  {
    ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
  }

  return 0;
}

Contiene ClassLoader: clase de carga de complemento.

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44937328/article/details/114845642
Recomendado
Clasificación