ROS-4 : ROS节点和主题

  依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp、std_msgs、actionlib、actionlib_msgs,并构建该空功能包。ROS中节点间的基本通讯方式是topic,即publish/subscribe模式。以下介绍如何创建两个两个节点分别发布和订阅一个主题。

一、创建节点

1、创建发布者节点topic_publisher

  首先在功能包ros_demo_pkg下的src下创建第一个节点文件topic_publisher.cpp。该节点在主题/numbers上发布一个整数,其代码和详解如下:

 1 //roscpp client APIs的核心头文件
 2 #include "ros/ros.h"
 3 //标准消息类型Int32的头文件
 4 #include "std_msgs/Int32.h"
 5 #include <iostream>
 6
 7 int main(int argc, char **argv)
 8
 9 {
10
11     //初始化ROS node--topic_publisher
12     ros::init(argc, argv,"topic_publisher");
13
14     //创建一个节点句柄对象,用于和ROS系统通讯
15     ros::NodeHandle node_obj;
16
17     //创建一个主题发布者对象,设定主题名、消息类型和缓冲区大小
18     ros::Publisher number_publisher = node_obj.advertise<std_msgs::Int32>("/numbers",10);
19
20     //设定发送数据的频率
21     ros::Rate loop_rate(10);
22
23     int number_count = 0;
24
25     //开启while循环,递增一个数值,并发布到topic /numbers
26     while (ros::ok())
27     {
28
29         //创建 Int32型消息对象
30         std_msgs::Int32 msg;
31
32         //设置消息值
33          msg.data = number_count;
34
35         //打印消息数据
36         ROS_INFO("%d",msg.data);
37
38         //将消息发布到主题
39         number_publisher.publish(msg);
40
41         //读取并更新所有的topics
42          ros::spinOnce();
43
44         //实现数据发布频率
45         loop_rate.sleep();
46
47         ++number_count;
48     }
49
50     return 0;
51 }

2、创建订阅者节点topic_subscriber

  接下来在功能包ros_demo_pkg下的src下创建第二个节点文件topic_subscriber.cpp。该节点订阅主题/numbers,接收该主题的消息,其代码和详解如下: 

 1 #include "ros/ros.h"
 2 #include "std_msgs/Int32.h"
 3 #include <iostream>
 4
 5 //Callback 函数,当有数据被发布到主题/numbers时会调用该函数
 6 void number_callback(const std_msgs::Int32::ConstPtr& msg)
 7 {
 8     ROS_INFO("Recieved  [%d]",msg->data);
 9 }
10
11 int main(int argc, char **argv)
12 {
13
14     //初始化ROS node --topic_subscriber
15         ros::init(argc, argv,"topic_subscriber");
16     ros::NodeHandle node_obj;
17     //创建一个订阅者对象,设定主题名、缓冲区大小和callback函数
18     ros::Subscriber number_subscriber = node_obj.subscribe("/numbers",10,number_callback);
19     //Spinning the node
20     ros::spin();
21     return 0;
22 }

3、构建节点

  为编译并构建上述节点的源代码,必须编辑功能包中的CMakeLists.txt文件。

$ cd ~/catkin_ws/src/ros_demo_pkg
$ gedit CMakeList.txt

  在已有的CMakeLists.txt文件中加入以下代码:

## 指定头文件的位置
include_directories(
      include
      ${catkin_INCLUDE_DIRS}
)

## 声明一个C++可执行文件
## add_executable(node_name src/node_source_file.cpp)
add_executable(topic_publisher src/topic_publisher.cpp)
add_executable(topic_subscriber src/topic_subscriber.cpp)

## 添加可执行文件所需的cmake  target dependencies
## add_dependencies(node_name {package_name}_generate_messages_cpp)
add_dependencies(topic_publisher ros_demo_pkg_generate_messages_cpp)
add_dependencies(topic_subscriber ros_demo_pkg_generate_messages_cpp)

## 指定链接 a library 或 executable target所需的libraries
# target_link_libraries(node_name ${catkin_LIBRARIES} )
target_link_libraries(demo_topic_publisher ${catkin_LIBRARIES})
target_link_libraries(demo_topic_subscriber ${catkin_LIBRARIES})

  然后就可以编译上述节点并构建该功能包:切换到catkin工作空间再进行构建。

$ cd ~/catkin_ws
$ catkin_make

  以上即为构建成功。

  综上,创建ROS节点包括以下几个步骤:

  1. 在功能包的src下编写节点的源文件,即.cpp文件
  2. 编辑功能包的CMakeLists.txt文件,添加编译和构建节点所需的内容;
  3. 构建功能包。

二、执行节点

  ROS系统中运行任何节点前都必须先运行roscore。roscore将启动ROS Master、ROS paramter和rosout logging nodes。

$ roscore

  再在另两个终端中分别运行上述两个节点。先运行发布者节点topic_publisher:

$ rosrun ros_demo_pkg topic_publisher

  再运行订阅者节点topic_subscriber:

$ rosrun ros_demo_pkg topic_subscriber

  可看到两个节点的运行结果如下图:

  综上,运行以topic模式通讯的节点的过程如下:

  1. 在一个终端上运行roscore;
  2. 在另一个终端上运行主题发布者节点;
  3. 在另一个终端上运行主题订阅者节点。

  在终端中输入rqt_graph,可看到上述两个节点间的通讯关系:

$ rqt_graph

原文地址:https://www.cnblogs.com/yanqingyang/p/9823424.html

时间: 2024-10-13 19:56:45

ROS-4 : ROS节点和主题的相关文章

ROS 订阅图像节点(1)

博客 http://blog.csdn.net/github_30605157/article/details/50990493 参考ROS原网站 http://wiki.ros.org/image_transport/Tutorials ROS:两个节点同时具有发布和订阅图像信息的功能 http://blog.csdn.net/ding977921830/article/details/70168877

ROS 订阅图像节点

博客 http://blog.csdn.net/github_30605157/article/details/50990493 参考ROS原网站 http://wiki.ros.org/image_transport/Tutorials ROS:两个节点同时具有发布和订阅图像信息的功能 http://blog.csdn.net/ding977921830/article/details/70168877

ROS分布式控制的节点配置

首先在终端中输入下面的指令查看ROS主节点主机的IP和远程控制端的IP: ifconfig 比如机器人控制器中运行着ROS主节点,其IP地址为192.168.1.111,hostname为xubuntu:远程控制端电脑IP为192.168.1.138,hostname为ubuntu. 首先要确保两台电脑能相互ping通. 然后在主节点和远程控制端的配置文件 /etc/hosts 中分别添加对方的IP地址和hostname信息(Add entries to your /etc/hosts file

ROS开机自动启动节点

ROS中提供了开机自动启动节点的工具robot_upstart,借助linux systemd工具实现守护进程开机启动功能. 1 systemd工具简介 Systemd 入门教程:命令篇 Systemd 入门教程:实战篇 2 robot_upstart安装节点 sudo apt-get install ros-kinetic-robot-upstart rosrun robot_upstart install package_name/launch/start.launch --logdir /

解决ROS系统中节点无法启动的问题

在调试中出现ROS节点无法启动的问题报错 Usage: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS] rosrun will locate PACKAGE and try to find an executable named EXECUTABLE in the PACKAGE tree. If it finds it, it will run it with ARGS. 处理方法就是把节点文件直接移到PACKAGE的下一级文

ros wiki usb_cam节点翻译

1 节点 1.1 usb_cam节点 usb_cam节点使用libusb_cam与标准的usb摄像头联系,它发布图像消息:sensor_msgs::Image,使用image_transport库可以使图像压缩传输 1.1.1 发布的话题 ~<camera_name>/image (sensor_msgs/Image) The image 1.1.2 参数 ~video_device (string, default: "/dev/video0")          视频设

ros 杀掉所有节点

rosnode kill -a 或者 rosnode kill --all 原文地址:https://www.cnblogs.com/sea-stream/p/10105118.html

&lt;ROS&gt; Gazebo Ros Control 及 Controller运用

写在前面 Gazebo ROS Control Default Robot HW SIM Gazebo ROS Control Plugin ROS Controller运用 1 position_controllersJointPositionController 2 position_controllersJointGroupPositionController 3 joint_state_controller 31 方式一 32 方式二 33 效果验证 附录 1. 写在前面 第一篇 – 机

E: Failed to fetch http://packages.ros.org/ros/ubuntu/pool/main/r/ros-kinetic-gazebo-dev/ros-kinetic-gazebo-dev_2.5.18-1xenial-20190124-142040-0800_amd64.deb 404 Not Found

参考:http://answers.ros.org/question/325039/apt-update-fails-cannot-install-pkgs-key-not-working/ 在安装一些东西时,会出现上述错误(比如,我是安装gazebo-ros包时出现)其他的有关ros的包也会出现. 原因:密钥已更新,旧密钥不再有效,导致apt update和apt install出现问题. old key: 421C365BD9FF1F717815A3895523BAEEB01FA116 ne