Configuração do Stack de Navegação 2D no ROS

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.

Tags: ROS Navigation-Stack move_base LiDAR AMCL

Publicado em 7-12 19:30