ROS學習之Arduino篇——Arduino訂閱(Subscriber)節點
阿新 • • 發佈:2019-02-17
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
就這樣,小燈又開始閃爍了...