关键词:
依照<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节点包括以下几个步骤:
- 在功能包的src下编写节点的源文件,即.cpp文件
- 编辑功能包的CMakeLists.txt文件,添加编译和构建节点所需的内容;
- 构建功能包。
二、执行节点
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模式通讯的节点的过程如下:
- 在一个终端上运行roscore;
- 在另一个终端上运行主题发布者节点;
- 在另一个终端上运行主题订阅者节点。
在终端中输入rqt_graph,可看到上述两个节点间的通讯关系:
$ rqt_graph
php显示主题$节点的列表(代码片段)
phpimage_attach节点中的主题图像(代码片段)
爬取当当网新书排行及数据分析(代码片段)
...虫设计方案概述思路:分析html页面,找到所需内容所在节点,爬取采集数据,将数据可视化,最后做线性回归。技术难点:分析源代码,数据类型的转变,数据线性回归。二、主题页面的结构特征分析1.主题页面的结构与特征分... 查看详情
xml主题和风格(代码片段)
xml风格和主题(代码片段)
sh插件和主题安装(代码片段)
php自动更新插件和主题(代码片段)
typora修改主题和字体(代码片段)
typora修改主题和字体1、修改主题文件->偏好设置->外观->主题->获取主题,然后就会打开GitHub上的一个网页,示例:然后点击自己喜欢的主题即可。点击进入自己喜欢的主题之后,点击download控件即可。示例:然后进入GitH... 查看详情
爬取微博热搜top50(代码片段)
...的结构特征分析:2.Htmls页面解析:右击查看网页源代码3.节点(标签)查找方法与遍历方法:(1)热搜的名字都在<tdclass="td-02">的子节点<a>里(2)热搜的排名都在<tdclass=td-01ranktop>里(置顶热搜没有排名)(3)热搜... 查看详情
markdown简单的主题和插件升级(代码片段)
htmlvariantimages应用程序和简单主题(代码片段)
kafka基本命令和实践(代码片段)
...删除它,可以登录zookeeper客户端,进入终端后,删除相应节点#查看主题./bin/kafka-topics.sh--list--zookeeperlocalhost:2181#查看主题test的详情./bin/kafka-topics.sh--describe--zookeeperlocalhost:2181--topictest#Consumer读消息./bin/kafka-console-consumer.s 查看详情
php排队样式和脚本父母子主题(代码片段)
kafkamanager(代码片段)
...: 集群信息:添加主题;重新获取平衡 分区数、节点数、BrokersSpread节点分布比例(如一共3个节点,主题占了3个节点所以分布比例是100%,如果有3个节点主题只占1个,则33%)BrokersSkew节点倾斜度、(1个Topic--3 查看详情
php管理员插件和主题代码编辑器(代码片段)
理解消息,主题和服务
...是具体的通信数据.主题用于多对多的形式,且是单向发送.节点A,B,C...发布消息到主题上(广播),节点a,b,c...在主题上搜索并接收自己需要的信息,所以通信双方并不知道彼此的存在,不能够了解对方的情况,这种情况是间接通信.如果节... 查看详情