Na forma mais simplificada podermos dizer que o gestor de controlador (controller_manager) fornece a infraestrutura para interagir com os controladores.
O gestor de controlador também fornece um ciclo compatível com requerimentos de hard-realtime para controlar um mecanismo robótico.
O mecanismo robótico tem de estar representado por uma instância hardware_interface :: RobotHW (ver hardware_interface), e o controlador (ros_controller) a carregar tem de herdar a classe controller_interface::Controller. (ver controller_interface)
O controller_manager fornece diferentes ferramentas para os controladores. Com uma flexibilidade permite a execução de controladores a partir de um ficheiro de lançamento (launch files), da linha de comandos ou de um node ROS. De uma forma geral fornece os mecanismos para carregar, libertar, iniciar e parar controladores.
Ao carregar um controlador, o controller_manager usará o nome do controlador como raiz para todos os parâmetros específicos do controlador. Sendo o mais importante, o tipo que identifica qual o plugin (ros_controller) a carregar.
Ferramentas de linha de comandos do gestor de controlador
O pacote controller_manager tem duas ferramentas para operar com os controllers. O controller_manager , o spawner e o unspawner .
controller_manager
Podemos interagir com o controlador especifico com o seguinte input na linha de comandos:
rosrun controller_manager controller_manager <command> <name1> <name2> ...
Na linha acima, <name1> e <name2> representam os ros_controlers com que queremos interagir.
Ainda na linha acima, o <command> representa as seguintes acções a executar sobre os ros_controllers especificados na linha.
- load: carrega controllers (carrega e inicializa controladores)
- unload: liberta controllers (destrói controladores previamente carregados)
- start: arranca controllers (arranca controladores carregados)
- stop: pára controllers (pára controladores a executar)
- spawn: carrega e arranca controllers
- kill: pára e liberta controllers
Quando não se especifica controladores é possível obter informações sobre os controladores e recarregar as suas bibliotecas.
rosrun controller_manager controller_manager <command>
list: lista todos os controladores pela ordem em que foram executados e fornece o estado de cada controlador
list-types: lista todos os tipos de controladores que o gestor de controlador conhece. Se o controlador não estiver nesta lista, então não poderá gerá-lo.
reload-libraries: recarrega todos os controladores disponíveis como plugins. Esta operação é conveniente quando se está a desenvolver um controlador e se deseja testar o novo código, sem reiniciar sempre todo o robot. Esta operação não reinicia os controladores que estavam a ser executados antes.
reload-libraries –restore: recarrega todos os controladores disponíveis como plugins e restaura todos os controladores ao seu estado original.
spawner
Para carregar e iniciar automaticamente, de uma só vez, um conjunto de controladores, e posteriormente, parar e destruir automaticamente os mesmos controladores de uma só vez, usa-se a ferramenta spawner:
rosrun controller_manager spawner [--stopped] <name1> <name2> ...
Quando se executa o spawner, os controladores indicados na linha de comandos serão carregados e iniciados (a menos que se especifique –stopped). O Spawner continuará a funcionar enquanto os controladores estiverem activos. Quando se mata o spawner com (ctrl-c), todos os controladores iniciados por ele param e são destruídos.
unspawner
Para parar automaticamente um conjunto de controladores e reiniciá-los mais tarde, pode-se usar a ferramenta unspawner, com a seguinte linha de comando:
rosrun controller_manager unspawner <name1> <name2> ...
Os controladores indicados serão parados, mas não destruídos. Assim que que o unspawner for morto com (ctrl-c) os controladores serão reiniciados.
controller_group
No ROS melodic foi incluído um novo comando que permite alternar um grupo de de controladores com propósitos especiais. Para saber mais consultar a página do ros wiki cujo o endereço está disponível no fim deste artigo.
Ferramentas de lançamento (launch)
Pode-se executar controller_manager para iniciar os controladores em ficheiros de lançamento (launch files). No entanto, este procedimento não é recomendado pois o controlador permanecerá activo mesmo depois de o ficheiros de lançamento for morto com (ctrl+c). Em vez disso, nos ficheiros de lançamento deve-se usar a ferramenta spawner para carregar, iniciar, parar e descarregar automaticamente um ou mais controladores.
Exemplo de ficheiro launch para lançar controllers.
<launch>
<node pkg="controller_manager"
type="spawner"
args="controller_name1 controller_name2" />
</launch>
Para carregar os controllers mas não proceder ao seu arranque, incluir o comando –stopped nos argumentos. Fica conforme exemplo abaixo.
<launch>
<node pkg="controller_manager"
type="spawner"
args="--stopped controller_name1 controller_name2" />
</launch>
Caso se use um ficheiro controllers.yaml, o nome dos controllers a ser nos ficheiros launch está ligado ao nome e a forma como o nome está estruturado no ficheiro controllers.yaml.
Para saber mais sobre a interacçao sobre o ficheiro controllers.yaml e o lançamento de controllers em ficheiros launch, ver o seguinte artigo: ROS controllers config.
ROS API
Para interagir com os ros_controllers a partir de outro node ROS, o controller_manager fornece cinco chamadas de serviço (com indicação do respectivo tipo de mensagens):
- controller_manager/load_controller (controller_manager_msgs/LoadController)
- controller_manager/unload_controller (controller_manager_msgs/UnloadController)
- controller_manager/switch_controller (controller_manager_msgs/SwitchController)
- controller_manager/list_controllers (controller_manager_msgs/ListControllers)
- controller_manager/list_controller_types (controller_manager_msgs/ListControllerTypes)
- controller_manager/reload_controller_libraries (controller_manager_msgs/ReloadControllerLibraries)
Para saber mais sobre as mensagens usadas pelos serviços do controller_manager ver: ROS control controller_manager_msgs
Para saber mais consultar a página do ros wiki cujo o endereço está disponível no fim deste artigo.
http://wiki.ros.org/controller_manager?distro=melodic