1. 程式人生 > >Ros使用Arduino 3用rosserial創建一個subscriber

Ros使用Arduino 3用rosserial創建一個subscriber

oar 按鈕 run tool boa 所有 情況 分享 highlight

在前面的一節中,我們已經使用arduino創建了一個publisher節點,接下來將會用arduino來創建一個subscriber,接收電腦傳去的信息並做出相應的反應。

1啟動Arduino

將arduino開發板連接到電腦的usb口,在arduino IDE中進行設置。

選擇Tools->Board,選擇你所使用的arduino開發板的類型,所使用的arduino開發板是arduino pro min。

設置好開發板之後,繼續選擇Tools->Serial Port->/dev/ttyUSB0。

2編譯程序

選擇File->Examples->ros_lib->Blink,就可以打開一個示例程序,代碼如下:

/* 
 * rosserial Subscriber Example
 * Blinks an LED on callback
 */

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

//創建了一個節點句柄,這允許我們的程序能夠創建發布者和訂閱者,節點句柄同樣和串口通信有關系。 ros::NodeHandle nh;
// 創建回調函數,必須使用一個消息的常引用作為一個參數。
// 消息類型是 std_msgs::Empty 消息的名字是toggle_msg
// 回調函數中,我們可以引用 toggle_msg,因為他是空的,所以就沒必要了。接受到一次,讓LED閃爍一次。
void messageCb( const std_msgs::Empty& toggle_msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

//創建一個訂閱者subscriber , 訂閱消息 toggle_led,消息類型是 std_msgs::Empty,回調函數是messageCb() ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

//初始化ros的節點句柄,告知所有將要訂閱的話題,訂閱你想收聽的任何話題。 void setup() { pinMode(13, OUTPUT); nh.initNode(); nh.subscribe(sub); }
//調用了ros::spinOnce(),在這個函數中,所有ROS通信的回調函數都被處理。
//在loop函數中,我們不需要去做任何其它的處理。因為這個函數ros::spinOnce()將會傳遞消息給subscriber的回調函數。

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

燒錄程序

在arduino IDE中點擊upload按鈕,運行程序。

技術分享

運行ROS

新建窗口

roscore

接著運行rosserial客戶端應用,它把你的arduino消息轉發到ROS系統的其它部分:

rosrun rosserial_python serial_node.py /dev/ttyUSB0  

最後你可以輸入一下命令來查看你的arduino板子上的LED燈的變化情況:

rostopic pub toggle_led std_msgs/Empty --once 

上述命令運行一次後LED燈亮了,再運行一下次又滅了,如此反復的運行,會發生相應的變化。

 技術分享

Ros使用Arduino 3用rosserial創建一個subscriber