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上发布一个整数,其代码和详解如下:
//roscpp client APIs的核心头文件
#include "ros/ros.h"
//标准消息类型Int32的头文件
#include "std_msgs/Int32.h"
#include <iostream> int main(int argc, char **argv) { //初始化ROS node--topic_publisher
ros::init(argc, argv,"topic_publisher"); //创建一个节点句柄对象,用于和ROS系统通讯
ros::NodeHandle node_obj; //创建一个主题发布者对象,设定主题名、消息类型和缓冲区大小
ros::Publisher number_publisher = node_obj.advertise<std_msgs::Int32>("/numbers",); //设定发送数据的频率
ros::Rate loop_rate(); int number_count = ; //开启while循环,递增一个数值,并发布到topic /numbers
while (ros::ok())
{ //创建 Int32型消息对象
std_msgs::Int32 msg; //设置消息值
msg.data = number_count; //打印消息数据
ROS_INFO("%d",msg.data); //将消息发布到主题
number_publisher.publish(msg); //读取并更新所有的topics
ros::spinOnce(); //实现数据发布频率
loop_rate.sleep(); ++number_count;
} return ;
}
2、创建订阅者节点topic_subscriber
接下来在功能包ros_demo_pkg下的src下创建第二个节点文件topic_subscriber.cpp。该节点订阅主题/numbers,接收该主题的消息,其代码和详解如下:
#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include <iostream> //Callback 函数,当有数据被发布到主题/numbers时会调用该函数
void number_callback(const std_msgs::Int32::ConstPtr& msg)
{
ROS_INFO("Recieved [%d]",msg->data);
} int main(int argc, char **argv)
{ //初始化ROS node --topic_subscriber
ros::init(argc, argv,"topic_subscriber");
ros::NodeHandle node_obj;
//创建一个订阅者对象,设定主题名、缓冲区大小和callback函数
ros::Subscriber number_subscriber = node_obj.subscribe("/numbers",,number_callback);
//Spinning the node
ros::spin();
return ;
}
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

ROS-4 : ROS节点和主题的更多相关文章
- ROS笔记——创建简单的主题发布节点和主题订阅节点
在安装好ROS后,接着学习如何创建节点和节点之间的通信方式,以一个简单的主题发布节点和主题订阅节点说明. 节点是连接ROS网络等可执行文件,是实现某些功能的软件包,也是一个主要计算执行的进程. 一.创 ...
- ROS学习笔记6-理解主题
本文来源于:http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics ROS主题假设turtlesim节点已经运行,打开一个新终端,使用如下命令运行键 ...
- ROS 订阅图像节点(1)
博客 http://blog.csdn.net/github_30605157/article/details/50990493 参考ROS原网站 http://wiki.ros.org/image_ ...
- ROS 订阅图像节点
博客 http://blog.csdn.net/github_30605157/article/details/50990493 参考ROS原网站 http://wiki.ros.org/image_ ...
- ROS分布式控制的节点配置
首先在终端中输入下面的指令查看ROS主节点主机的IP和远程控制端的IP: ifconfig 比如机器人控制器中运行着ROS主节点,其IP地址为192.168.1.111,hostname为xubunt ...
- ros中关于节点、话题、服务以及自定义消息等在终端中的常用命令
以下面的计算力图说明 节点相关常用命令 在终端中查看项目中有哪些节点命令:rosnode list 有了节点信息想要查看节点中到底发布订阅了哪些话题,作为服务端服务类型或者作为客户端需要的服务类型以上 ...
- ros 杀掉所有节点
rosnode kill -a 或者 rosnode kill --all
- Learning ROS: Running ROS across multiple machines
Start the master ssh hal roscore Start the listener ssh hal export ROS_MASTER_URI=http://hal:11311 r ...
- ROS学习笔记5-理解节点(Node)
本文内容来源于:http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes 图(Graph)概念概览 节点(Nodes):一个节点是ROS下面一个可执行程 ...
随机推荐
- Cisco AP-格式化AP
故障情况:APC11-AP04#sho capwap ip config LWAPP Static IP ConfigurationIP Address 172.17.239.204I ...
- PCSearch
1.hinstance:GetModuleHandle(NULL) 2.窗口直角: 方法1:在Oncreate函数中添加以下代码,然而这种方法会导致窗口阴影无效 LONG styleValue = : ...
- 「AHOI2014/JSOI2014」骑士游戏
「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...
- django-实现登录短信验证
功能演示 核心任务 前端功能: 点击按钮Ajax调用发送验证码功能 输完验证码后Ajax调用验证功能 后端功能: 功能1:发送验证码功能 功能2:验证码检查 后台核心逻辑(不需要手写) 功能3:发短信 ...
- ShellCode模板
前言 在上一篇文章上使用到的添加用户的shellcode是怎么得到的呢? 先来拆分一下汇编的功能 ;寻找kernel32.dll的基地址 xor ecx,ecx mov eax,dword ptr f ...
- spark实验(一)--linux系统常见命令及其文件互传(2)
2.使用 Linux 系统的常用命令 启动 Linux 虚拟机,进入 Linux 系统,通过查阅相关 Linux 书籍和网络资料,或者参考 本教程官网的“实验指南”的“Linux 系统常用命令”,完成 ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- 【转】bug management process
What is Bug? A bug is the consequence/outcome of a coding fault What is Defect? A defect is a variat ...
- JS原型链的理解和使用(一)
一些个人的理解,不一定是对的,仅供参考. 在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象.所以可以说函数一定可以作为一个对象,而对象不一定是一个函数. 也可以说在js中对象分为 ...
- Array数组的方法总结
1.检测数组 自从ECMAScript3作出规定后,就出现了确定某个对象是不是数组的经典问题.对于一个网页,或者一个全局作用域而言,使用instanceof操作符就能得到满意结果. if (value ...