在前面的一篇博客中,我们已经使用arduino创建了一个publisher节点,接下来将会创建一个subscriber,打开arduino IDE:

arduino

选择File->Examples->ros_lib->Blink,就可以打开一个示例程序,代码如下:

/** rosserial Subscriber Example* Blinks an LED on callback*/#include <ros.h>
#include <std_msgs/Empty.h>ros::NodeHandle nh;void messageCb( const std_msgs::Empty& toggle_msg){digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );void setup()
{pinMode(13, OUTPUT);nh.initNode();nh.subscribe(sub);
}void loop()
{nh.spinOnce();delay(1);
}

下面看一下代码解释:

#include <ros.h>
#include <std_msgs/Empty.h>

像前面的例子一样,我们需要包括ros.h,同样需要包括消息的头文件。

ros::NodeHandle nh;

上面的一行代码创建了一个节点句柄,这允许我们的程序能够创建发布者和订阅者,节点句柄同样和串口通信有关系。

void messageCb( const std_msgs::Empty& toggle_msg){digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

我们为subscriber创建了一个回调函数,这个函数必须使用一个消息的常引用作为一个参数。在我们的回调函数 messageCb中,消息的类型是 std_msgs::Empty,消息的名字是 toggle_msg

在回调函数中,我们可以引用toggle_msg,但是因为它是空的,所以就没有必要了。当收到一次消息时,我们让aduino板子上的LED闪烁一下。

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

上面代码使我们在话题toggle_led上建立了一个subscriber,并且类型是 std_msgs::Empty。在使用Subscriber时,必须用上面<std_msgs::Empty> 的这种形式,说明消息的类型。它的两个参数是它将要订阅的话题和所使用回调函数。

void setup()
{pinMode(13, OUTPUT);nh.initNode();nh.subscribe(sub);
}

在arduino的setup函数中,你需要去初始化ros的节点句柄,告知所有将要订阅的话题,订阅你想收听的任何话题。

void loop()
{nh.spinOnce();delay(1);
}

最后在loop函数中,我们调用了ros::spinOnce(),在这个函数中,所有ROS通信的回调函数都被处理。在loop函数中,我们不许要去做任何其它的处理。因为这个函数ros::spinOnce()将会传递消息给subscriber的回调函数。

在arduino IDE中点击upload按钮,运行程序。接着运行roscore:

roscore

接着运行rosserial客户端应用,它把你的arduino消息转发到ROS系统的其它部分:

rosrun rosserial_python serial_node.py /dev/ttyACM0

最后你可以输入一下命令来查看你的arduino板子上的LED灯的变化情况:

rostopic pub toggle_led std_msgs/Empty --once

上述命令运行一次后LED灯亮了,在运行一下次又灭了,如此反复的运行,挥发生相应的变化。

ROS的学习(十九)用rosserial创建一个subscriber相关推荐

  1. ROS的学习(十八)使用rosserial创建一个publisher

    在arduino开发人群中,经常把源代码称为"sketch",之后,我们就会使用这个惯例.打开一个终端,启动arduino: arduino 将arduino开发板连接到电脑的us ...

  2. PyTorch框架学习十九——模型加载与保存

    PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...

  3. 【itext学习之路】--1.创建一个简单的pdf文档

    来源:https://blog.csdn.net/tomatocc/article/details/80666011 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文 ...

  4. maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程

    前面maven 学习笔记(二)已经说过了怎样通过插件创建一个简单的工程,有了前面的基础,创建一个较复杂的工程就容易了很多.同样是通过已经有了插件,同样如果插件系统中并未存在,还是需要通过Add Arc ...

  5. ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果

    继续用"ShaderLab学习小结(十八)cubemap"中所做的shader 想要让它能对周围的环境进行反射 思路就是要让它的cubemap里的内容是周围环境的映射 shader ...

  6. 鸿蒙Hi3861学习十九-DevEco Device Tool源码获取、编译、下载

    一.简介 在上一篇文章中,已经讲述了如何在Windows通过Remote SSH远程连接Linux下的DevEco Device Tool.这篇文章,来说一下关于源码的获取.编译与下载.建议先按照上一 ...

  7. 强化学习(十九) AlphaGo Zero强化学习原理

    在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...

  8. android学习(十九) 使用无线连接设备(三) 通过P2P搜索网络服务

    使用WI-FI P2P搜索服务可以直接搜索附近的设备,而不需要专门通过本地网络.这项特性使得在没有本地网络或者热点的情况下还可以在不同的设备间进行通信. 建立清单 <manifest xmlns ...

  9. 我的Go语言学习之旅七:创建一个GUI窗体

    在上次中,刚刚学过了  弹窗效果,这里再接着学习一下如何创建一个窗体. 还是老路子,先上代码: package mainimport ( "github.com/lxn/go-winapi& ...

最新文章

  1. Linux zip-tar.gz 压缩解压
  2. CSM+3PAR帮助XXX教育技术中心
  3. 【算法】一个简单的主成分分析(PCA)原理
  4. php 5.3 require,PHP5.3提示PHP Wrequire(./xx.php)arning: [function.require]: failed to open stream
  5. 数据挖掘-亲和性分析函数(通用)
  6. 使用 Packer、Ansible 和 Terraform 构建不可变的基础设施Devops工具链
  7. Web开发——PHP vs Java
  8. docker swarm快速搭建mogodb集群
  9. 为什么道理都懂,课执行力差的现象如此普遍?
  10. 廖雪峰java教程 pdf_廖雪峰java学习笔记.pdf
  11. 测试注意力的游戏软件,培养孩子专注力,1套测试题+7个小游戏,在家就可以轻松玩!(家长必看)...
  12. 枚举算法典型的三个例子
  13. 关于pycharm出现unindent does not match any outer indentation level错误的解决
  14. 华为交换机配置syslog发送_配置华为交换机推送syslog到日志服务器
  15. 微信第三方服务商更新ticket时,aes解密失败
  16. Elasticsearch02
  17. 为ARM处理器实现Machine Forth
  18. 【无人机三维路径规划】基于帝国企鹅算法实现无人机三维路径规划附matlab代码
  19. “辶”“廴”偏旁的字五笔拆字
  20. GPS定位详解——涉及GPS版本变化、定位获取失败等常见问题。

热门文章

  1. 送6个Gmail邀请!
  2. [转载] Python中int类型和string类型的相互转换
  3. [转载] numpy.logspace和numpy.linspace区别对比
  4. [转载] 远程方法调用(RMI)与远程过程调用(RPC)
  5. [转载] Java中的abstract关键字
  6. What is Closure
  7. 站在巨人的肩膀上看Servlet——原来如此(更适合初学者认识Servlet)
  8. Winfrom窗体无法关闭问题--检查是否存在重写
  9. 《构建之法》读书心得
  10. codeforces 702A A. Maximum Increase(水题)