ROS4 : ROS节点和主题

摘要:
根据创建catkin工作区,并在Start src_demo_ Pkg下创建一个函数包ROS,依赖项为roscpp和std_ msgs、actionlib、actionlib_ msgs,并构建空函数包。ROS中节点之间的基本通信模式是主题,即发布/订阅模式。roscore将启动ROSMaster、ROSparamter和rosoutlogingnodes。

  依照<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

ROS4 : ROS节点和主题第1张

  以上即为构建成功。

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

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

二、执行节点

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

$ roscore

ROS4 : ROS节点和主题第2张

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

$ rosrun ros_demo_pkg topic_publisher

  再运行订阅者节点topic_subscriber:

$ rosrun ros_demo_pkg topic_subscriber

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

ROS4 : ROS节点和主题第3张ROS4 : ROS节点和主题第4张

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

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

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

$ rqt_graph

ROS4 : ROS节点和主题第5张

 

 

免责声明:文章转载自《ROS4 : ROS节点和主题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下Nodejs安装(完整详细)关于Python IDLE reload(sys)后无法正常执行命令的原因下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于重心偏移的视差计算

视差的计算,主要要计算待匹配图像对应像素的水平偏移,那么针对一个物体而言,其在场景中的视差大体上应该是平滑的,所以可以直接针对分割出的物体计算重心的水平偏移从而得到视差值,我做了一个小实验,感觉效果还行,下面是代码和实验结果,希望各位有什么想法大家交流。 有一个问题就是,我这个视差计算出来是这个台灯是221的灰度,标准的是224的灰度。 我的流程是算出横向...

ROS launch 文件的编写

ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file)。事实上,在ROS功能包中,启动文件的使用是非常普遍的。任何包含两个或两个以上节点的系统都可以利用启动文件来指定和配置需要使用的节点。通常的命名方案是以.launch作为启动文件的后缀,启动文件是XML文件。一般把启动文件存储在取名为launch的目...

Kafka基础教程(三):C#使用Kafka消息队列

接上篇Kafka的安装,我安装的Kafka集群地址:192.168.209.133:9092,192.168.209.134:9092,192.168.209.135:9092,所以这里直接使用这个集群来演示 首先创建一个项目,演示采用的是控制台(.net core 3.1),然后使用Nuget安装 Confluent.Kafka 包: 上面的截图中有C...

博客基础_django_python从入门到实践_添加主题_添加条目_编辑条目

 要求及文件   用户可以添加新主题,添加新条目,以及编辑既有条目    forms.py  urls.py  views.py  html    new_topic.html  new_entry.html    edit_entry.html 添加新主题 new_topic.html   topics.html   添加新条目 new_entry.ht...

Kafka(四) —— KafkaProducer源码阅读

一、doSend()方法 Kafka中的每一条消息都对应一个ProducerRecord对象。 public class ProducerRecord<K, V> { private final String topic; private final Integer partition; private final...

Linux C SMTP POP3 极简陋邮件客户端

以前以为协议非常高神,但做了这个之后发现还好,没想象的那么艰难。 先要了解邮件的原理 再者就是上面2协议 可以先用telnet测试一下,以初步了解那2协议:http://hi.baidu.com/343243581/item/113c7212ced7e0e05e53b1d8 实现大致思想,SMTP,POP3相关介绍:http://www.doc88.com...