Visão Geral
O stack de navegação 2D do ROS é projetado para processar informações provenientes de odometrai, sensores de profundidade e fluxos de dados de localização global para gerar comandos de velocidade seguros e precisos para o robô. Implementar essa funcionalidade em uma plataforma específica exige uma integração cuidadosa entre o hardware e o ecossistema ROS. É fundamental que o robô publique transformações via TF, forneça dados de sensores compatíveis e seja capaz de interpretar mensagens de controle de movimento.
Requisitos de Hardware
Embora o framework seja versátil, existem premissas básicas para o sucesso da navegação:
- O robô deve ser do tipo de tração diferencial ou holonômico, controlado por mensagens de velocdiade linear e angular.
- É obrigatória a presença de um sensor de distância a laser (LiDAR) ou similar que forneça leituras em um plano bidimensional.
- O sistema foi otimizado para bases circulares ou quadradas. Foramtos assimétricos ou complexos podem exigir ajustes finos adicionais no modelo de colisão.
Estrutura de Configuração do Robô
A arquitetura de navegação exige que diversos componentes trabalhem em harmonia. Os blocos principais incluem:
1. Transformações de Coordenadas (TF)
O robô deve publicar o relacionamento entre os diferentes frames (ex: base_link, laser_frame, odom). Isso permite que o sistema saiba a posição exata de cada sensor em relação ao centro do robô.
2. Fontes de Sensores
Dados de sensores devem ser transmitidos usando os tipos sensor_msgs/LaserScan ou sensor_msgs/PointCloud. Drivers padrão para a maioria dos LiDARs e câmeras RGB-D (como Kinect ou RealSense) já estão disponíveis na comunidade ROS.
3. Odometria
É necessário um fluxo de mensagens nav_msgs/Odometry que informe a posição e velocidade estimada do robô com base nos encoders das rodas ou sistemas de IMU.
4. Controlador da Base
O nó de controle deve ser capaz de assinar o tópico cmd_vel e converter mensagens do tipo geometry_msgs/Twist em sinais elétricos para os motores.
Desenvolvimento do Pacote de Navegação
O primeiro passo é criar um pacote workspace dedicado para armazenar os arquivos de configuração e lançadores (launch files).
catkin_create_pkg bot_navigation move_base amcl map_server sensor_msgs nav_msgs
Arquivo de Inicialização de Hardware
Crie um arquivo chamado robot_hardware_setup.launch para iniciar os drivers e as transformações:
<launch>
<!-- Driver do Scanner Laser -->
<node name="lidar_node" pkg="rplidar_ros" type="rplidarNode" output="screen">
<param name="serial_port" value="/dev/ttyUSB0"/>
</node>
<!-- Publicador de Odometria e TF -->
<node name="base_controller" pkg="my_robot_base" type="odom_publisher_node" output="screen">
<param name="publish_tf" value="true"/>
</node>
</launch>
Configuração dos Mapas de Custo (Costmaps)
A navegação utiliza dois mapas: um global para planejamento de rota a longo prazo e um local para desvio de obstáculos em tempo real.
Parâmetros Comuns (costmap_common_params.yaml)
obstacle_range: 3.0
raytrace_range: 3.5
footprint: [[-0.25, -0.25], [-0.25, 0.25], [0.25, 0.25], [0.25, -0.25]]
inflation_radius: 0.60
observation_sources: scan
scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}
Mapa Global (global_costmap_params.yaml)
global_costmap:
global_frame: map
robot_base_frame: base_link
update_frequency: 4.0
static_map: true
Mapa Local (local_costmap_params.yaml)
local_costmap:
global_frame: odom
robot_base_frame: base_link
update_frequency: 5.0
publish_frequency: 3.0
static_map: false
rolling_window: true
width: 5.0
height: 5.0
resolution: 0.05
Planejador Local
O base_local_planner é responsável por calcular as velocidades reais. Configure o arquivo base_local_planner_params.yaml:
TrajectoryPlannerROS:
max_vel_x: 0.5
min_vel_x: 0.05
max_vel_theta: 1.2
min_in_place_vel_theta: 0.3
acc_lim_theta: 3.0
acc_lim_x: 2.0
acc_lim_y: 0.0 # Zero para robôs não-holonômicos
holonomic_robot: false
Lançamento do Módulo Move_Base
Consolide as configurações em um arquivo move_base.launch:
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find bot_navigation)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find bot_navigation)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find bot_navigation)/config/local_costmap_params.yaml" command="load" />
<rosparam file="$(find bot_navigation)/config/global_costmap_params.yaml" command="load" />
<rosparam file="$(find bot_navigation)/config/base_local_planner_params.yaml" command="load" />
</node>
</launch>
Execução
Para iniciar o sistema, execute sequencialmente o hardware e o gerenciador de navegação:
roslaunch bot_navigation robot_hardware_setup.launch
roslaunch bot_navigation move_base.launch
Com esses nós ativos, o robô estará pronto para receber metas de navegação via ferramentas como o RViz ou através de mensagens programáticas enviadas ao move_base/goal.