ROS control controller_interface

O pacote controller_interface contém a classe base para a interface dos ros controllers.

Todos os controladores  em tempo real para o ROS devem herdar a classe base do controlador deste pacote, controller_interface::Controller.

O gestor de controladores, controller_manager, apenas carrega o controlador caso ele herde e implemente os métodos desta classe.

Estrutura de um ROS controller

Os métodos fundamentais da classe controller_interface::Controller são os seguintes:

  • init();
  • start();
  • update();
  • stop();

A estrutura básica do classe Controller é a seguinte:

namespace controller_interface 
{ 
  class Controller 
  { 
  public: 
    virtual bool init(hardware_interface *robotHW, 
                     ros::NodeHandle &nh); 
    virtual void starting(); 
    virtual void update(); 
    virtual void stopping(); 
  }; 
} 

O fluxo de trabalho da classe Controller é o seguinte:

Esta classe é especialmente importante quando desenvolvemos controladores para o ROS control (ros_controllers). Assim como para percebermos como funcionam os controlladores já existentes.

Inicialização do controlador

O primeiro método do controlador a ser executado aquando do seu carregamento pelo controller_manager é o init().

Este método requer dois parametros:

  • hardware_interface *robotHW, (Implementação da classe hardware_interface que permite aceder ao hardware do robot)
  • ros::NodeHandle &nh (a classe de base do node ROS)

O método init(), não tem restrições do tempo de execução. Não corre em tempo real, e apenas é executado uma vez aquando do carregamento do controlador pelo controller_manager.

Se este método devolver um erro, o controller_manager não completa o carregamento do controlador.

Caso existe algum erro durante a execução neste método (init), podermos usar mensagens personalizadas para notificar da existência de erros específicos.

Arranque do ros_controller

O método starting() é executado em tempo real e apenas uma vez, antes de qualquer chamada ao método de actualização. O método também pode ser chamado aquando de uma reinicialização sem que o controller seja libertado pelo controller_manager.

Actualização do ros_controller

O método update() é o mais importante do ponto de vista da acção do controlador.  Este método é executado em tempo real a uma frequência de 1000 Hz.

Paragem do controlador

O método stopping() é executado, em tempo real, como a última chamada ao update() e é apenas executado uma vez quando o controlador está a parar. Este método não devolve qualquer resultado e não tem nenhum estado de falha.

Exemplo de um novo controlador

Um pequeno exemplo de como escrever um novo ros_controller está disponível no seguinte endereço:

https://github.com/ros-controls/ros_control/wiki/controller_interface