ROS与Arduino学习(三)订阅与发布
ROS与Arduino学习(三)订阅与发布
Tutorial Level:HelloWorld
Next Tutorial:用ROS的Cmake编译程序
本节介绍如何在arduino中发布与订阅消息。他和ROS通过串口进行节点通信。
Tips 1 订阅
ros::Subscriber<std_msgs::Empty> sub("WWWW",&hhhhh);
其中WWWW是话题的名称,hhhhh是收到消息后调用的函数函数名称。sub是实例化订阅对象的名字,也可以是别的名字。
<std_msgs::Empty>是指传输的消息类型。也可以是整形<std_msgs::Int16>或者其他类型。
nh.subscribe(sub);
其中nh代表句柄的意思,每一个节点有一个句柄。此节点使用sub订阅对象来订阅世界中的话题。
Tips 2 发布
ros::Publisher chatter("chat",&str_msg);
其中“chat”为话题名称,str_msg为消息内容。chatter是实例化发布对象的名字。
nh.advertise(chatter)
其中nh代表句柄的意思,每一个节点有一个句柄。此节点使用chatter发布对象来向世界中的话题发布消息。
chatter.publish(&str_msg);
发布消息
Tips 3 实例程序(控制灯)
整体思路为用Arduino订阅一个主题“PC2Arduino”,然后Ubuntu发布一个消息到主题中,1代表亮,0代表灭。代码比较简答,不解释。
代码如下:
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/UInt16.h>
ros::NodeHandle nh;
std_msgs::String str_msg;
//publish and subscribe
//
ros::Publisher pub("Arduino2PC",&str_msg);
void Control(const std_msgs::UInt16& cmd_msg)
{
if(cmd_msg.data == 1)
{
digitalWrite(13, LOW);
}
if(cmd_msg.data == 0)
{
digitalWrite(13, HIGH);
}
}
ros::Subscriber <std_msgs::UInt16> sub("PC2Arduino", &Control );
char hello[]="hello world!";
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.advertise(pub);// publish
nh.subscribe(sub);// subscribe
}
void loop()
{
str_msg.data = hello;
pub.publish(&str_msg);//publish a message
nh.spinOnce();
delay(1000);
}
Tips 4 测试
#新终端打开
$ roscore
#新终端打开
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
#新终端打开
$ rostopic pub PC2Arduino std_msgs/UInt16 1