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