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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM