Nós no ROS2
No ROS2, um nó é uma entidade abstrata que ancapsula funcionalidades específicas, podendo residir em um processo ou thread. Ele serve como base para toda comunicação, pois todas as interações passam por nós.
Executores de Nós
Um executor é responsável por coordenar e agendar a operação dos nós, processando callbacks de comunicação. Cada processo pode ter um ou mais executores, e cada executor pode gerenciar múltiplos nós.
Tipos de executores incluem:
- Executor de thread único: Processa todos os nós em uma única thread, com controle de prioridade e ordem de callbacks.
- Executor multi-thread: Alocar callbacks em múltiplas threads, usando
std::thread::hardware_concurrency()para determinar o máximo de threads disponíveis, otimizando o desempenho. - Executor estático de thread único: Disponível apenas no rclcpp, oferece menor consumo de CPU e memória em comparação com o executor padrão.
A comunidade ROS discute regularmente novos executores para melhorar eficiência e determinismo.
Criando um Nó
Em projetos C++, é necessário herdar da classe base rclcpp::Node; em Python, de rclcpp.Node. O rclcpp usa por padrão o executor de thread único.
Regras de nomenclatura para nós:
- Não pode ser vazio.
- O primeiro caractere deve ser uma letra, sublinhado, til ou barra.
- Caracteres subsequentes podem incluir letras, dígitos, sublinhados ou barras.
- Nós com nomes iniciados por sublinhado são ocultos.
Modos de Rotação do Executor
O executor inicia operações com funções de rotação como spin(), spin_all() e outras:
spin(): Bloqueia operações e processa callbacks continuamente até interrupção.spin_all(): Não bloqueia e processa todos os callbacks prontos até timeout ou conclusão.spin_some(): Processa apenas callbacks prontos no momento da chamada, sem bloqueio.spin_once(): Executa o primeiro callback pronto, sem bloqueio.spin_node_once(): Adiciona temporariamente um nó, executaspin_once()e o remove.spin_until_future_complete(): Processa callbacks até que um futuro seja concluído, timeout ou interrupção.
Depuração de Nós
Use comandos como ros2 node list e ros2 node info para listar e inspecionar nós.
Relação entre Processos, Threads e Nós
Executores podem ser de thread único ou multi-thread. Ao executar um nó, parâmetros de linha de comando especificam a quantidade de nós e o tipo de executor, por exemplo:
ros2 run pacote_exemplo no_principal 3 s
ros2 run pacote_exemplo no_principal 4 m
Ao aumentar callbacks e temporizadores sem mais nós, o executor multi-thread pode alocar mais threads conforme necessário.
Criando um Pacote com Nó
Use ros2 pkg create com opções como --node-name para gerar arquivos de nó. Exemplo:
ros2 pkg create pacote_teste --build-type ament_cmake --node-name no_lifecycle --dependencies std_msgs rclcpp
Alternativamente, crie manualmente o arquivo do nó no diretório src.
Configurando um Publicador
Para publicar mensagens, modifique package.xml e CMakeLists.txt:
- Em
package.xml, adicione dependências comorclcppestd_msgsusando tags<depend>. - Em
CMakeLists.txt, usefind_packagepara localizar pacotes eament_target_dependenciespara vinculação dinâmica. Exemplo de configuração:
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(publicador src/funcao_membro_publicador.cpp)
ament_target_dependencies(publicador rclcpp std_msgs)
install(TARGETS publicador DESTINATION lib/${PROJECT_NAME})
Compilação e Execução
Verifique dependências com rosdep install, compile usando colcon build (opcionalmente --packages-select para pacotes específicos), e configure o ambiente com . install/setup.bash. Execute com ros2 run.
Recursos Estendidos para Nós
O ROS2 utiliza DDS como middleware de comunicação, oferecendo auto-descoberta, modularidade e baixa latência. Funcionalidades adicionais incluem:
- Domínio DDS: Variável de ambiente
ROS_DOMAIN_IDisola recursos em portas UDP distintas, com ID seguro entre [0,101] no Linux. - Namespace: Renomeia nós e recursos via remapeamento, permitindo isolamento lógico. Configurável via linha de comando ou código, com precedência de argumentos sobre código fonte.
- Nós de ciclo de vida: Oferecem controle de estados como não configurado, inativo, ativo e finalizado, com transições gerenciadas por serviços.
Exemplo de configuração de domínio:
export ROS_DOMAIN_ID=50
ros2 node list -a
Para namespace, use --ros-args --remap __ns:=/meu_ns ao executar um nó.