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 通信的更多相关文章

  1. 【转】ROS之topic和service通信比较

    实验速度 1. via topic 上图是以前ROS课上做的一个实验,内容是测试一个publisher和一个subscriber之间通讯所用的时间.两个node都很简单,publisher发送一个字符 ...

  2. ROS学习(七)—— 理解ROS Topic

    一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...

  3. 节点和Topic通信

    1.简介 对于实时性. 周期性的消息, 使用topic来传输是最佳的选择. topic是一种点对点的单向通信方式, 这里的“点”指的是node, 也就是说node之间可以通过topic方式来传递信息. ...

  4. ROS Node/Topic/Message/Service的一些问题

    1.Node http://blog.exbot.net/archives/1412 (摘自老王说ros) node干的什么活?callback queue里的活.这个callback queue里的 ...

  5. Ros学习topic——小海龟

    ROS Topics 1.rqt_graph:创建一个显示当前系统运行情况的动态图形 安装 $ sudo apt-get install ros-<distro>-rqt $ sudo a ...

  6. ROS多机通信计算机网络配置

    以实现master和nico的互联共享信息为例 1 查看IP地址 $ifconfig 查看ip地址 可以看到 master的IP为192.168.1.10 nico的IP为192.168.1.103 ...

  7. ROS中的通信机制

    http://www.ros.org/core-components/ Communications Infrastructure At the lowest level, ROS offers a ...

  8. ros 充电topic

    #!/usr/bin/env python #coding=utf- import rospy from std_msgs.msg import String i= def talker(): glo ...

  9. ros之串口通信---imu

    1.sudo apt-get install ros-kinetic-rosserial 或者sudo git clonegit://github.com/wjwwood/serial.git  (开 ...

随机推荐

  1. django get_object_or_404

    django get_object_or_404 是django shortcuts模块里面一个比较简便的方法,特别是用django get来操作数据库的时候,可以帮 我们少写一些代码,加快开发速度. ...

  2. 阅读《C陷阱与缺陷》的知识增量

    版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...

  3. [转]删除MSSQL所有的约束及表格

    --删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...

  4. wampserver 最新版本 mysql修改数据库密码

    由于wampsever版本更新就导致以前版本的密码修改造成失败,主要是密码字段改变造成的! 第一步 进入MySQL 控制台  wamp安装,数据库是没有密码 进入控制台直接回车就可以了 第二步 使用 ...

  5. docker-3-常用命令(上)

      帮助命令: docker version docker info docker --help 镜像命令: docker images:     列出本地主机上的镜像     各个选项说明:    ...

  6. 再谈Spring Boot中的乱码和编码问题

    编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了. Spring系列产品大 ...

  7. js 变速动画函数

    //获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { return window.getComputedStyle ...

  8. 用VMWare搭建服务器集群不能上外网的三种模式下对应解决办法

    前言 决心要花费宝贵时间写下这篇心得,是因为从昨天晚上到今天上午被这个VMWare模拟搭建的服务器集群不能上外网的问题搞得很心烦,最后决定跟它杠上了!上午还通过远程连接得到了“空白”同学的帮助,在此表 ...

  9. Asp.Net Core链接Mysql数据库

    一.新建一个Asp.Net Core WebMVC程序 添加nuget包  Mysql.Data 二.新建一个UserContext类 下面代码中的UserInfo是我自己建的一个实体,里面有俩字段: ...

  10. MySQL5.7主从同步--点位方式及GTID方式

    MySQL5.6加入了GTID的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover.GTID用于在binlog中唯一标识一个事务 ...