1. 程式人生 > >ROS學習之Arduino篇——Arduino訂閱(Subscriber)節點

ROS學習之Arduino篇——Arduino訂閱(Subscriber)節點

1. 建立廣播話題檔案

進入~catkin_ws/src目錄,建立comWithArduino包,包中建立comWithArduino_node.cpp檔案,寫入以下內容:
#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char** argv){
    ros::init(argc, argv, "pub_to_arduino");
    ros::NodeHandle n;

    ros::Publisher pub = n.advertise<std_msgs::String>("blink", 1000);
    ros::Rate loop_rate(1); //1秒廣播一次
    int i = 0;

    while(ros::ok()){
	ROS_INFO("round: %d", i++);
	std_msgs::String str;
	str.data="hello arduino!";
	pub.publish(str);
	loop_rate.sleep();
    }
    return 0;
}

更改CMakeList.txt檔案,新增以下兩行:

add_executable(${PROJECT_NAME}_node src/comWithArduino_node.cpp)
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})

回到catkin_ws目錄下

catkin_make #生成comWithArduino_Node檔案

2. 建立Arduino訂閱節點檔案

開啟Arduino IDE 寫入如下程式碼:

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

ros::NodeHandle nh;

void messageCb(const std_msgs::String &blink){
  digitalWrite(13, HIGH-digitalRead(13));
  }

ros::Subscriber<std_msgs::String> sub("blink", &messageCb);

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

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

3. 執行節點

釋出blink話題:

roscore
# 釋出節點
rosrun comWithArduino comWithArduino_node 

開啟rosseries客戶端應用程式,將ROS釋出的節點轉發到Arduino,我的埠是/dev/ttyACM1

#將 ROS 釋出的節點轉發到Arduino, Arduino收到該節點發布的訊息之後就會呼叫回撥函式 
rosrun rosserial_python serial_node.py /dev/ttyACM1

此時就可以看到Arduino開發板13號引腳處小燈每隔1秒閃爍一次了。

使用下面命令還可以檢視釋出的話題中的內容:

rostopic echo blink

4. 將命令整合成launch檔案

整合正launch檔案,省的每次開啟那麼多視窗,launch檔案的編寫可參考:ROS學習之launch檔案編寫

在任一包下建立一個名為blink.launch的檔案,我是在包my_launch下建立的。寫入一下內容:

<launch>
  <node pkg="comWithArduino" name="my_blink" type="comWithArduino_node" />
  <node pkg="rosserial_python" name="serial_node" type="serial_node.py" args="/dev/ttyACM1"/>#注意埠
</launch>

執行launch檔案:

roslaunch my_launch blink.launch

就這樣,小燈又開始閃爍了...