ROS(一)Topic 通信
ROS系统起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后就由Willow Garage来进行推动。
ROS是开源的,是用于机器人的一种后操作系统,或者说次级操作系统。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。
了解ROS的几个概念:
1. 功能包(Package):相当于一个C++工程,包含程序文件,编译描述文件,配置文件等。
2. 功能包集(Stack):实现某种功能的多个功能包集合,例如导航功能包,是ROS软件发布的主要形式。
3. 节点(Node):可执行文件。位于功能包中,实现功能的最小单位,.cpp 和.py文件转换为可执行文件后才可以变为node。
4. 主题(Topic)和服务(Service):节点间通信的两种方式。主题实现节点之间的单向通信,服务包括请求(Request)和响应(Response)的双向通信。
5. 消息(Msg):节点之间通信的内容,相当于C语言中的结构体。
安装ROS,不赘述,参考官方网站,目前主流使用的是Ubuntu14.04+ROS indigo版本。
ROS会有自己的功能包命令,类似于bash命令,常用的有
rospack
roscd
rosls
catkin_create_pkg
catkin_make roscore
rosrun
rosnode
rosmsg/rossrv
rostopic/rosservice
rosparam
roslaunch
rosbag
具体的操作参考官方文档,这里主要使用catkin创建一个简单的主题发布订阅的功能包。节点之间的通信关系如下图所示:

目前ROS的官方编译系统是catkin,功能包分配更加合理,支持交叉编译,可移植性好。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace cd ~/catkin_ws
// 空的工程也可以编译
catkin_make
// 更新环境变量,将当前工作空间加入$ROS_PACKAGE_PATH
source devel/setup.bash catkin_create_pkg my_topic_test std_msgs roscpp rospy
// 打开my_topic_test功能包,重要的是编译描述文件CMakeLists.txt和配置文件package.xml // 创建完功能包后,需要编译该功能包,可以编译整个空间中的功能包,也可以只编译指定的功能包
cd ~/catkin_ws
catkin_make
// catkin_make --pkg my_topic_test
具体实现node在src目录下,新建两个文件分别为talker.cpp, listener.cpp。注意最后需要修改CMakeLists.txt文件。
// publisher: talker
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream> int main(int argc, char** argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher my_pub = n.advertise<std_msgs::String>("my_topic", );
ros::Rate loop_rate();
int cnt = ;
std_msgs::String msg;
while(ros::ok())
{
std::stringstream ss;
if((cnt%)==) ss << "false " << cnt;
else ss << "true";
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
my_pub.publish(msg);
loop_rate.sleep();
cnt = cnt + ;
}
return ;
}
// subscriber: listener
#include "ros/ros.h"
#include "std_msgs/String.h" void MyTopicCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
} int main(int argc, char** argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber my_sub = n.subscribe("my_topic", , MyTopicCallback);
ros::spin();
return ;
}
由于我们没有使用自己定义的消息类型,所以package.xml文件不需要更改,CMakeLists.txt文件也比较简单:
cmake_minimum_required(VERSION 2.8.)
project(my_topic_test) ## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg) ### Declare ROS messages and services
#add_message_files(FILES xx.msg)
#add_service_files(FILES xx.srv) ## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs) ## Declare a catkin package
catkin_package() ## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS}) add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp) add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
注意
其中find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)和include_directories(include ${catkin_INCLUDE_DIRS})的顺序不能改变。不然会找不到ros系统的头文件。
重新编译功能包后,验证结果
roscore
rosrun my_topic_test talker
rosrun my_topic_test listener
发布节点talker向主题my_topic发送消息,同时订阅my_topic主题的节点接收到消息
ROS(一)Topic 通信的更多相关文章
- 【转】ROS之topic和service通信比较
实验速度 1. via topic 上图是以前ROS课上做的一个实验,内容是测试一个publisher和一个subscriber之间通讯所用的时间.两个node都很简单,publisher发送一个字符 ...
- ROS学习(七)—— 理解ROS Topic
一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...
- 节点和Topic通信
1.简介 对于实时性. 周期性的消息, 使用topic来传输是最佳的选择. topic是一种点对点的单向通信方式, 这里的“点”指的是node, 也就是说node之间可以通过topic方式来传递信息. ...
- ROS Node/Topic/Message/Service的一些问题
1.Node http://blog.exbot.net/archives/1412 (摘自老王说ros) node干的什么活?callback queue里的活.这个callback queue里的 ...
- Ros学习topic——小海龟
ROS Topics 1.rqt_graph:创建一个显示当前系统运行情况的动态图形 安装 $ sudo apt-get install ros-<distro>-rqt $ sudo a ...
- ROS多机通信计算机网络配置
以实现master和nico的互联共享信息为例 1 查看IP地址 $ifconfig 查看ip地址 可以看到 master的IP为192.168.1.10 nico的IP为192.168.1.103 ...
- ROS中的通信机制
http://www.ros.org/core-components/ Communications Infrastructure At the lowest level, ROS offers a ...
- ros 充电topic
#!/usr/bin/env python #coding=utf- import rospy from std_msgs.msg import String i= def talker(): glo ...
- ros之串口通信---imu
1.sudo apt-get install ros-kinetic-rosserial 或者sudo git clonegit://github.com/wjwwood/serial.git (开 ...
随机推荐
- 【Hankson 的趣味题】
可能我只适合这道题的50分 但还是要争取一下的 我们知道对于\(gcd\)和\(lcm\)有这样的定义 \(a=\prod _{i=1}^{\pi(a)}p_i^{d_{i}}\) \(b=\prod ...
- 转:git 的常用命令
转自:阮一峰 常用git命令清单 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Wor ...
- ASP.NET CORE 边学边记之 SwaggerUI简单配置
前言 当使用 ASP.NET CORE 开发WebApi程序时候,一般使用SwaggerUI生成接口文档.本文记录最简单的一个配置.(生成的文档无注释) 操作 首先安装Nuget包. 然后在Start ...
- js 模拟百度关键字搜索与跳转
测试效果: css样式: ul{ display:none; } html代码: <input type="text" id="text" /> & ...
- 100个常用的linux命令(转)
来源:JavaRanger – javaranger.com http://www.javaranger.com/archives/907 1,echo “aa” > test.txt 和 ...
- IE下页面左偏移并页头空出一行解决方法
在其它浏览器下显示正常,包括360浏览器,在IE下,页面向左偏移,通过firebug查看,head标签为空,并且head标签里面的内容都跑到body标签内了,原因是有bom头,访问的页面或是加载,包含 ...
- JQuery Ajax 使用FormData上传文件对象
FormData部分: 先new FormData对象 :let somedata = new FormData(),然后将数据添加进去,这里我们使用append()进行添加. 这里举一个上传头像的例 ...
- 课时18.h标签和p标签以及hr标签(掌握)
如何在webstorm中利用快捷键创建一个新的html的文件? 同时按下键盘上的ctrl+alt+insert(windows) 同时按下键盘上的ctrl+alt+n(os) h标签系列(header ...
- 360极速浏览器用ie8模式打开网页(360浏览器同理)
在访问年代久远的的网页时经常会遇到兼容性的问题,用360浏览器(或360极速浏览器)中通过设置可解决. 在360极速浏览器中分别依次选择:选项->高级设置->内核模式->内核切换设置 ...
- HSL与RGB颜色转换
/** * HSL颜色值转换为RGB. * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space. * h, s, 和 l 设定在 [0, 1] 之 ...