机器人操作系统(ROS)教程21:用rosserial创建一个subscriber
2016-02-24 18:53
537 查看
链接: http://www.arduino.cn/thread-12614-1-1.html
在前面的一节中,我们已经使用arduino创建了一个publisher节点,接下来将会用arduino来创建一个subscriber,接收电脑传去的信息并做出相应的反应。首先打开arduino
IDE:
arduino
选择File->Examples->ros_lib->Blink,就可以打开一个示例程序,代码如下:
[C] 纯文本查看 复制代码
?
下面看一下代码解释:
#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灯亮了,再运行一下次又灭了,如此反复的运行,会发生相应的变化。
在前面的一节中,我们已经使用arduino创建了一个publisher节点,接下来将会用arduino来创建一个subscriber,接收电脑传去的信息并做出相应的反应。首先打开arduino
IDE:
arduino
选择File->Examples->ros_lib->Blink,就可以打开一个示例程序,代码如下:
[C] 纯文本查看 复制代码
?
#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灯亮了,再运行一下次又灭了,如此反复的运行,会发生相应的变化。
相关文章推荐
- 1097. Deduplication on a Linked List (25)
- FastJSON自定义序列化-修改属性值
- Java对象初始化详解
- CodeForces 31B Sysadmin Bob
- 1096. Consecutive Factors (20)
- Gitlab的使用
- UINT8_T / UINT16_T / UINT32_T /UINT64_T讲解
- ntp 服务器搭建
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
- 机器人操作系统(ROS)教程20:使用rosserial创建一个publisher
- Cocos2d-x 3.1.1 Lua演示样例 ActionEaseTest(动作)
- hibernate开发(1)
- 归还文物(有时间就翻译。。)
- 机器人操作系统(ROS)教程19:安装ARDUINO IDE使用rosserial
- UI整理-----part8--导航控制器(navigationController)
- BZOJ 3713: [PA2014]Iloczyn|暴力
- arm9+linux fl2440 led 驱动 plat_led.c
- C语言常用转义字符表 和 ASCII码表
- 二维数组排序 array_multisort
- Activity横竖屏切换