在安装好ROS后,接着学习如何创建节点和节点之间的通信方式,以一个简单的主题发布节点和主题订阅节点说明。

  节点是连接ROS网络等可执行文件,是实现某些功能的软件包,也是一个主要计算执行的进程。

  一、创建工作空间

  创建新文件夹,名字自定义,路径也根据自己设定。

cd ~
mkdir -p ros_workspace

  创建好后,就需要将次路径添加到ROS_PACKAGE_PATH中。

  查看目前ROS的工作空间,

echo $ROS_PACKAGE_PATH

  一般显示如下:

  /opt/ros/kinetic/share

  下面将路径添加到~/.bashrc中

echo "export ROS_PACKAGE_PATH=~/ros_workspace:${ROS_PACKAGE_PATH}" >> ~/.bashrc
. ~/.bashrc

  再次查看ROS正在使用的空间,确保路径正确添加。

  二、创建ROS功能包

  打开ROS工作目录:

cd ~/ros_workspace

  在该目录下创建功能包:

roscreate-pkg test1_tutorials std_msgs rospy roscpp

  功能包文件夹下一般包括Makefile、manifest.xml、CMakeLists.txt、mainpage.dox等文件。

  std_msgs  包含常见等消息类型

  rospy    py库

  roscpp    cpp库

  运行命令,查看功能包是否创建

rospack find test1_tutorials

  

  三、编写代码

  1、主题发布节点

  在功能包中创建src/test1_a.cpp,并添加代码:

 #include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream> int main(int argc, char **argv)
{
ros::init(argc,argv,"test1_a");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",);
ros::Rate loop_rate();
while(ros::ok()) {
std_msgs::String msg;
std::stringstream ss;
ss << "Hello test1_b! I am test1_a.";
msg.data = ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return ;
}

  第8行: 初始化,其中第三个参数是节点名称,在ROS系统中必须唯一。

  第10行:声明主题message上发布一个消息类型为str_msgs::String的消息,并设置消息缓冲区的大小。

  第11行:设置发送消息的频率 10HZ,它追踪自从上一次Rate::sleep()被唤醒之后的持续时间,并在到达时间后继续休眠。

  第12行:ros::ok()函数返回值,在下列情况返回false。

  •   SIGINT句柄接收到Ctrl+C命令来结束;
  •   被名称相同的节点提出ROS网络;
  •   ros::shutdown()被应用的另一部分唤醒。

  第18行:把消息通过主题发布出去。

  第19行:和下面test1_b.cpp程序ros::spin()进行对比,参考http://www.yfworld.com/?p=2318

  2、主题订阅节点

  在功能包中创建src/test1_b.cpp,并添加代码:

 #include "ros/ros.h"
#include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO("Hello test1_a! I am test1_b. I heard:[%s]",msg->data.c_str());
} int main(int argc, char **argv)
{
ros::init(argc,argv,"test1_b");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("message",,chatterCallback);
ros::spin(); return ;
}

  第4-7行:回调函数,当一个新消息到达指定主题时即调用。

  第17行:第一个参数指定订阅主题;第二个参数设置消息缓冲区的大小;第三个参数指定回调函数。

  订阅节点需要做四件事情:

  1)初始化;

  2)从主题订阅消息;

  3)然后等待消息到达;

  4)当消息到达时,chatterCallback()被回调。

  四、编译节点

  编辑CMakeLists.txt文件,在末尾处添加如下代码:

rosbuild_add_executable(test1_a src/test1_a.cpp)
rosbuild_add_executable(test1_b src/test1_b.cpp)

  rosmake工具进行编译:

rosmake test1_tutorials

  五、运行功能包

  在运行功能包前,请确认节点管理器已经打开。使用下面的命令运行:

roscore

  在不同的终端窗口分别运行:

rosrun test1_tutorials test1_a
rosrun test1_tutorials test1_b

  可以看到以下信息:

  

  

  六、参考

  http://wiki.ros.org/ROS/Tutorials

  《ROS机器人程序设计》 刘品杰 译

  (欢迎转载,转载请注明出处。)

ROS笔记——创建简单的主题发布节点和主题订阅节点的更多相关文章

  1. Web Service 的创建简单编码、发布和部署

    最近,老大准备将已有的C/S架构项目中的通信部分做成通用,需要将其支持WebService为以后项目向着B/S架构升级做好铺垫,为此身为屌丝的我去各种百度WebService是个什么卵玩意,然后逐渐搭 ...

  2. Robot Operating System (ROS)学习笔记---创建简单的机器人模型smartcar

    搭建环境:XMWare  Ubuntu14.04  ROS(indigo) 转载自古月居  转载连接:http://www.guyuehome.com/243 一.创建硬件描述包 已创建catkin_ ...

  3. Angular5学习笔记 - 创建、运行、发布项目(一)

    一.安装脚手架 npm install -g cnpm --registry=https://registry.npm.taobao.org #安装阿里镜像 npm install -g @angul ...

  4. ROS学习记录(三)————创建一个简单的发布节点和订阅节点

    暑假在家有些懈怠,不,非常懈怠- -||!良心已经发痛了,想快些补回原来的进度,但忽然发现,中断了一段时间再重新去学习,有的地方连最基本的符号都忘记了 ,这次特意弄个最最基础的,恢复一下,以前的进度. ...

  5. ROS主题发布订阅

    节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...

  6. SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. ROS-4 : ROS节点和主题

    依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp.std_msgs.action ...

  8. Ros学习——C++发布器publisher和订阅器subscriber

    1.编写发布器 初始化 ROS 系统 在 ROS 网络内广播我们将要在 chatter 话题上发布 std_msgs/String 类型的消息 以每秒 10 次的频率在 chatter 上发布消息 在 ...

  9. Spark学习笔记0——简单了解和技术架构

    目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...

随机推荐

  1. Using Call_Form in Oracle D2k

    Using Call_Form in Oracle D2k CALL_FORM examples/* Example 1:** Call a form in query-only mode.*/BEG ...

  2. [HIHO1393]网络流三·二分图多重匹配

    题目链接:http://hihocoder.com/problemset/problem/1393 把项目到汇点的边权值都加起来,跑完最大流后看是否最大流=权值和.如果等于权值和说明所有项目都有足够的 ...

  3. linux多文本替换内容

    之前不小心写错了代码,把nil写成了Nil,脚本写的传到git中了,批量替换解决办法: grep "Nil" -rl $PATH/ |xargs sed -i 's/Nil/nil ...

  4. SQL2008 的 日期数据类型

    摘要 你是否曾经想在数据库中存储一个日期而没有时间部分,或者想存储一个时间值希望有更高的精度?在SQL Server 2008的介绍中,微软介绍了一些新的日期数据类允许你只存储一个日期.更高精度的时间 ...

  5. YII 伪静态 IIS7 方法 web.config

    YII 伪静态 IIS7 方法 web.config <?xml version="1.0" encoding="UTF-8"?> <conf ...

  6. 插件开发--BE插件开发

    U9的插件主要分为3种,即(1)BE插件(2)UI插件(3)BP/SV插件 1.新建类库解决方案 2.新建插件类,并引用以下dll,UBF安装目录U9.VOB.Product.UBF\UBFStudi ...

  7. Kinect外包团队(长年承接微软Kinect体感项目外包,有大型Kinect案例)

    承接Kinect体感企业项目.游戏项目外包 北京公司.专业团队,成员为专业WPF产品公司一线开发人员,有大型产品开发经验: 提供优质的售后服务,保证产品质量,轻量级产品可以提供规范清晰的源代码,有业务 ...

  8. servlet学习笔记_3

    一.路径问题如果是在浏览器端请求服务器的数据(超链接,js的src),那么加/代表在Tomcat的webapp目录,不加/的话通常不考虑,实际上不加/在浏览器端也是当前项目目录(但是开发中通常必须要写 ...

  9. 深入理解js构造函数

    JavaScript对象的创建方式 在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: ? 1 2 3 4 5 6 var o1 ...

  10. shell中$0,$?,$!等变量意义

    变量说明:   $$     #Shell本身的PID(ProcessID) $!     #Shell最后运行的后台Process的PID $?     #最后运行的命令的结束代码(返回值) $- ...