diff_drive_controller

O pacote diff_drive_controller faz parte dos ros_controllers e aplica-se ao controlo a uma base de robot com propulsão diferencial.

O diff_drive_controller necessita de um node que implemente a interface com o hardware de acordo com o estabelecido para o ros control. Ou seja um programa baseado numa classe que herde a hardware_interface::RobotHW, e implemente os métodos que façam a ligação com o controller_manager, o diff_drive_controller e o hardware, via firmware.

O controlo é efectuado por comandos de velocidade, ou seja mensagens do tipo geometry_msgs/Twist). Destas mensagens o controlador extrai o componente x da velocidade linear e o componente z da velocidade angular (os outros componentes são ignorados), que utiliza para calcular a velocidade de cada uma das rodas. Estas velociades são então enviadas através do node com o hardware interface para cada uma das duas rodas existentes num robot 2WD. A odometria é calculada e publicada pelo controlador com base no feedback que provem do hardware através do mesmo interface.

O diff_drive_controller necessita de um conjunto de configurações que devem obedecer a critérios especificos e estarem adequadas ao hardware.

O ficheiro robot.urdf que descreve o robot deve conter as articulações (joints), neste caso das rodas, com os nomes adequados, ou em consonancia com os nomes usados no programa e no ficheiro de configuração (controllers.yaml).

Exemplo de joints relevantes num robot.urdf
<joint name="front_right_wheel_joint" type="continuous">
(...)
</joint>

<joint name="front_left_wheel_joint" type="continuous">
(..)
</joint>

O ficheiro controllers.yaml que contém a configuração dos controllers, entre os quais a do diff_drive_controller, tendo cada um deles os seus parametros de configuração. No minimo tem de conter a identificação do controller com o respectivo tipo e as articulações (joints) neste caso as rodas com o mesmo nome que está no urdf e no programa.

O conteúdo minimo para o diff_drive_controller  no controllers.yaml é o seguinte:

robot_velocity_controller:
    type: "diff_drive_controller/DiffDriveController"
    left_wheel: 'front_left_wheel_joint'
    right_wheel: 'front_right_wheel_joint'
    pose_covariance_diagonal: [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]
    twist_covariance_diagonal: [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]

Note que o nome indicado para o left_wheel e right_wheel é o mesmo que o indicado no urdf.

Outra coisa importante é que a indentação é importante para a atribuição dos parâmetros ao controlador respectivo.

A descrição do robot incluida no ficheiro robot.urdf e a configuração dos controllers no ficheiro controllers.yaml são carregadas no servidor de paramentros rod ROS (parameter server) por intermédio de um launch file com os seguintes elementos:

<param name="robot_description" command="$(find xacro)/xacro '$(find diff_drive_base1)/urdf/robot.urdf.xacro'
--inorder"/>
<rosparam command="load" file="$(find diff_drive_base1)/config/controllers.yaml"/>

No que se refere a forma como os ros controllers são executados ter em atenção que eles são executados indirectamente por referência aos parametros carregados pelo ficheiro yaml, como por exemplo no caso abaixo em que o diff_drive_controller é carregado pela evocação do robot_velocity_controller.

<node name="base_controller_spawner" pkg="controller_manager" type="spawner"
args="robot_joint_publisher robot_velocity_controller"/>

Apesar de não esta referido aqui, o robot_joint_publisher refere-se ao  joint_state_controller, que é também um ros controller e na mesma por referência á sua inclusão no ficheiro de configuração controllers.yaml.

A identificação usada no controllers.yaml para o diff_drive_controller é usada também no nome dos topicos que são publicados e subscritos pelo node que usa o controller conforme exemplo abaixo:

/robot_velocity_controller/cmd_vel
/robot_velocity_controller/odom
/robot_velocity_controller/parameter_descriptions
/robot_velocity_controller/parameter_updates

 

Fontes

http://wiki.ros.org/diff_drive_controller