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 (开 ...
随机推荐
- Spring 整合Hibernate 示例
虽然Spring整合Hibernate早就会了,但经常在创建项目整合这两个框架的时候出一些低级错误.所以在这里写一个示例,以后再遇到错误时,再把遇到的错误或异常添加上. 一.创建一个动态WEB工程,添 ...
- 【剑指offer】字符串的组合
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/26405471 转载请注明出处:http:// ...
- css3的代替图片的三角形
1.小三角形(与边框结合,不兼容IE8) .callout{ position: relative; width: 100px; height: 100px; background: #fce6ed; ...
- redis 哈希数据类型简单操作(实现购物车案例)
这里不累赘如何安装redis和php redis扩展,主要熟悉调用redis哈希数据类型 简单方法操作如下 1:hSet 2:hGet 4:hDel 5:hGetAll 4:hExists 5:hI ...
- 理解基本包装类型Number,String,Boolean
在前面我们知道了引用类型是什么了,也就能理解包装类型了.包装对象其实也是一种引用类型,之所以要单独提出来只不过是因为它们可以把原始类型的值变成(包装成)对象,这样它们也就获得了各自类型相应的特殊行为了 ...
- springboot多数据源的配置与使用
转自:https://www.jianshu.com/p/34730e595a8c 之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Sp ...
- redis make报错
解压redis后,第一次make出现报错: [root@localhost redis-3.2.5]# make cd src && make allmake[1]: Entering ...
- 【题解】洛谷P1311 [NOIP2011TG] 选择客栈(递推)
题目来源:洛谷P1311 思路 纯暴力明显过不了这道题 所以我们要考虑如何优化到至多只能到nlogn 但是我们发现可以更优到O(n) 我们假设我们当前寻找的是第二个人住的客栈i 那么第一个人住的客栈肯 ...
- stylus(css预编译器)
推荐去张鑫旭大神这里详细了解:http://www.zhangxinxu.com/jq/stylus/ 安装 npm install -g stylus 自动编译 $ stylus -w demo.s ...
- Ajax请求(415 Unsupported Media Type)
Unsupported media type-415(不支持的媒体类型) 该错误类型是后台接收参数为json类型的,然而ajax提交的类型不对,如下: 异常代码: $.ajax({ url: api ...