·

Engenharia Elétrica ·

Robótica

· 2023/1

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Publicação de Mensagens no ROS 2 Walter Fetter Lages fetter@ece.ufrgs.br Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Sistemas Elétricos de Automação e Energia ENG10026 Robótica A Copyright (c) Walter Fetter Lages – p. 1 Introdução Nodo: processo do S.O. hospedeiro Tópico: mecanismo de comunicação entre nodos do tipo publisher/subscriber Mensagem: dados publicados nos tópicos Gráfico de computação: Representa a comunicação entre os nodos através de tópicos Copyright (c) Walter Fetter Lages – p. 2 Tópicos • Nodos podem publicar mensagens em tópicos • Cada tópico pode ter vários publicadores e assinantes • Cada nodo pode publicar ou assinar vários tópicos • Publicadores e assinantes não sabem da existência um dos outros • A ordem de execução não é garantida • Comunicação assíncrona Copyright (c) Walter Fetter Lages – p. 3 it Exempl UFRGS XCMplo T A a cp es) ° AP, é obtido rotacionando “P, de 30° em torno de 4X e de 60° em torno de “Z. © Vizualizar “P, e “P> no Rviz. e O RViz mostra mensagens do tipo geometry_msgs/msg/PointStamped e A descricao da mensagem pode ser verificada com o comando ros2 interface show geometry_msgs/msg/PointStamped Copvricht (c) Walter Fetter Lages — p. 4 _ geometry_msgs/msg/PointStamped # This represents a Point with reference coordinate frame and timestamp std_msgs/Header header builtin_interfaces/Time stamp int32 sec uint32 nanosec string frame_id Point point float64 x float64 y float64 z Copyright (c) Walter Fetter Lages – p. 5 Frame de Referência • É necessário posicionar o frame de referência. Isso pode ser feito com o comando ros2 run tf2_ros static_transform_publisher −−frame−id map −− child−frame−id A −−x 0 −−y 0 −−z 0 −−roll 0 −−pitch 0 −− yaw 0 Copyright (c) Walter Fetter Lages – p. 6 Publicação de Mensagens • As mensagens padrão do ROS estão definidas em /opt/ros/$ROS_DISTRO/share/*_msgs • Pode-se definir outros tipos de mensages • Pode-se publicar em um tópico com o comando ros2 topic pub /p1 geometry_msgs/msg/PointStamped ’{header: {frame_id: A}, point: {x: 1, y: 2, z: 3}}’ −r 1 • ros2 topic também observa tópicos: ros2 topic echo /p1 Copyright (c) Walter Fetter Lages – p. 7 Vizualização no Rviz Copyright (c) Walter Fetter Lages – p. 8 AP2 • Para calcular e publicar a posição do ponto AP2 será criado um nodo • As coordeanadas de AP1 não serão obtidas de /p1 • Evita-se ter que assinar o tópico /p1 • Mais adiante haverá um exemplo de subscriber Copyright (c) Walter Fetter Lages – p. 9 Criação do Pacote • Criar o pacote: cd ~/colcon_ws/src ros2 pkg create −−build−type ament_cmake −−dependencies rclcpp geometry_msgs −−node−name p2_publisher eng10026_publisher • package.xml deve ser editado para configurar os detalhes de documentação e incluir dependências Copyright (c) Walter Fetter Lages – p. 10 CMakeLists.txt • Editar CMakeLists.txt para descomentar e ajustar as tags: add_executable(p2_publisher src/p2_publisher.cpp) ament_target_dependencies(p2_publisher rclcpp geometry_msgs) install(TARGETS p2_publisher DESTINATION lib/${PROJECT_NAME}) install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}) Copyright (c) Walter Fetter Lages – p. 11 Ajustes para usar a Eigen • Ajustar/incluir no CMakeLists.txt as tags: find_package(Eigen3 REQUIRED) target_include_directories(p2_publisher PUBLIC $<BUILD_INTERFACE:${ CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${EIGEN3_INCLUDE_DIR}> $<INSTALL_INTERFACE:include>) Copyright (c) Walter Fetter Lages – p. 12 Código Fonte do Nodo • Editar o arquivo p2_publisher.cpp com o código fonte no diretório src • Compilar com os comandos: cd ~/colcon_ws colcon build −−symlink−install source install/setup.bash • O executável estará em install/eng10026_publisher/lib/ eng10026_publisher/p2_publisher Copyright (c) Walter Fetter Lages – p. 13 Código Fonte do Nodo #include <rclcpp/rclcpp.hpp> #include <Eigen/Dense> #include <geometry_msgs/msg/point_stamped.hpp> class P2Publisher: public rclcpp::Node { public: P2Publisher(const char *name); void publish(const Eigen::Vector3d &p2) const; private: rclcpp::Publisher<geometry_msgs::msg::PointStamped>:: SharedPtr p2Pub_; }; Copyright (c) Walter Fetter Lages – p. 14 Código Fonte do Nodo P2Publisher::P2Publisher(const char *name): Node(name) { p2Pub_=create_publisher<geometry_msgs::msg::PointStamped>("p2 ",100); } Copyright (c) Walter Fetter Lages – p. 15 Código Fonte do Nodo void P2Publisher::publish(const Eigen::Vector3d &p2) const { geometry_msgs::msg::PointStamped p2Msg; p2Msg.header.stamp=now(); p2Msg.header.frame_id="A"; p2Msg.point.x=p2[0]; p2Msg.point.y=p2[1]; p2Msg.point.z=p2[2]; p2Pub_−>publish(p2Msg); } Copyright (c) Walter Fetter Lages – p. 16 Código Fonte do Nodo int main(int argc,char* argv[]) { rclcpp::init(argc,argv); P2Publisher p2Publisher("p2_publisher"); Eigen::Vector3d p1(1.0,2.0,3.0); Eigen::Matrix3d R; R=Eigen::AngleAxisd(60.0*M_PI/180.0,Eigen::Vector3d::UnitZ())* Eigen::AngleAxisd(30.0*M_PI/180.0,Eigen::Vector3d::UnitX()); Eigen::Vector3d p2=R*p1; Copyright (c) Walter Fetter Lages – p. 17 Código Fonte do Nodo rclcpp::Rate loop(1); while(rclcpp::ok()) { p2Publisher.publish(p2); rclcpp::spin_some(p2Publisher.get_node_base_interface()); loop.sleep(); } return 0; } Copyright (c) Walter Fetter Lages – p. 18 Execução do Nodo • Chamando diretamente o executável: install/eng10026_publisher/lib/eng10026_publisher/p2_publisher • Usando o comando ros2 run: ros2 run eng10026_publisher p2_publisher • Usando um arquivo de launch: ros2 launch eng10026_publisher p2.launch.xml • Launch com RViz: ros2 launch eng10026_publisher display.launch.xml Copyright (c) Walter Fetter Lages – p. 19 p2.launch.xml <launch> <node pkg="tf2_ros" exec="static_transform_publisher" name=" A_publisher" args="−−frame−id map −−child−frame−id A −−x 0 −−y 0 −−z 0"/> <node name="p2_publisher" pkg="eng10026_publisher" exec=" p2_publisher" output="screen"/> </launch> Copyright (c) Walter Fetter Lages – p. 20 display.launch.xml <launch> <executable cmd="ros2 topic pub /p1 geometry_msgs/ PointStamped ’{header: {frame_id: A}, point: {x: 1, y: 2, z: 3}}’ −r 1" name="p1_publisher"/> <include file="$(find−pkg−share eng10026_publisher)/launch/p2. launch.xml"/> <node name="rviz" pkg="rviz2" exec="rviz2" args="−d $(find−pkg −share eng10026_publisher)/config/p1_p2.rviz"/> </launch> Copyright (c) Walter Fetter Lages – p. 21 Vizualização no RViz Copyright (c) Walter Fetter Lages – p. 22 Gráfico de Computação Copyright (c) Walter Fetter Lages – p. 23 Pacote eng10026_publisher colcon_ws/ src/ eng10026_publisher/ CMakeLists.txt config/ p1_p2.rviz launch/ p2.launch.xml display.launch.xml package.xml src/ p2_publisher.cpp Copyright (c) Walter Fetter Lages – p. 24 Instalação do Pacote • Clonar e compilar o pacote cd ~/colcon_ws/src git clone −b $ROS_DISTRO http://git.ece.ufrgs.br/eng10026/ eng10026_publisher cd .. colcon build −−symlink−install source ~/colcon_ws/install/setup.bash Copyright (c) Walter Fetter Lages – p. 25