作者:Sco Lin
上一篇【Tutorial】一起走進ROS的世界吧(1) -安裝篇,小弟費了九牛二虎之力,終於把VMWARE 、UBUNTU 、 ROS安裝完成。其實我在玩ROS前可是吃了不少苦頭,至少在線上看了5本書和一些網路文章,同時也買了2本中文書,才看懂ROS到底能不能做到我想要的。
因為ROS的原理和應用實在是包山包海,能做的實在太多,如Machine Learning,小弟之前寫了二篇KNN演算法做室內定位(【Tutorial】:運用KNN演算法進行室內定位Part 1、【Tutorial】運用KNN演算法進行室內定位 Part 2);然而,ROS也能玩AI,又如智能音箱做的語音辨識,畢竟研究單位都拿來玩機器人了,AI語音辨識對ROS來說根本不是問題。
為了瞭解ROS的廣泛運用和知道它如何與硬體交互,一定要從最根本的方式才能了解ROS的完整面貌,但追根究底就是小弟程度太差才需要看7本書,真是好事多磨啊!終於要開始測試了!
ROS工作區運作
roscore可以RUN了,此時應該來玩玩ROS最經典的小烏龜。但在玩小烏龜之前,先建立工作區會比較好,因為ROS的官方教程是安裝之後接著建工作區、寫CODE,其實小弟當初這個部分看的不是很懂,我倒是覺得先玩小烏龜 → Rviz → Gazebo ,最後再寫CODE比較容易懂,但這是學藝不精的小弟的學習路程,也許大家照著官網流程走可能更容易懂。
- mkdir -p ~/catkin_ws/src
- cd ~/catkin_ws/src
- catkin_ws_init_workspace
然後key ls,會看到src資料夾下有一個CMakeLists.txt,如下圖所示:
接下來回到catkin_ws下輸入catkin_make這個指令,如下圖所示:
這樣就做好了ROS工作區了,以後的CODE就在這裡寫,之後不論玩什麼程式語言,都會有個Hello World,ROS也不例外。這裡的CODE是參考ROS Robot Programming這本電子書來的,也可直接在Github上download。
首先要先在前面的工作區新建一個package,而新建package的指令是catkin_create_pkg package_name,所以這次做的hello world我們是輸入catkin_create_pkg hello_world_node,進去hello_world_node的資料夾會發現有package.xml與CMakeList.txt。
package.xml是寫一些像packege名稱、版本和描述等等的,其實小弟都很懶的去改,但如果您是在研究所或是公司做專案就不一樣。不寫的話,很可能會接不上去,而且depend挺重要的,compiler會告訴使用者哪些東西沒裝。
這裡簡單看一下:
再來就是CMakeList.txt,要利用它修正宣告一些相關使用到的Libraries以及宣告可執行檔,如這支hello world。
1. add_executable(${PROJECT_NAME} src/hello_world_node.cpp)
2. target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
)
3. add_executable(${PROJECT_NAME} src/hello_world_node.cpp)
4. target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
)
基本上演算法再複雜,直接看code比講師千言萬語還有用。再來就是hello_world_node.cpp程式碼要自己寫,依小弟的習慣會再建一個資料夾叫src,在裡面放code,這樣可以把專案的程式碼全丟進去,如下圖所示:
而hello_world_node.cpp的code長這樣,如下圖所示:
以下為原始碼:
完整原始碼
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<sstream>
int main ( int argc , char ** argv )
{
ros::init(argc,argv,”hello_world_node”);
ros::NodeHandle nh ;
ros::Publisher chatter_pub=nh.advertise<std_msgs::String>(“say_hello_world”,1000);
ros::Rate loop_rate(10);
int count=0;
while(ros::ok())
{
std_msgs::String msg ;
std::stringstream ss;
ss<<“hello world !”<<count;
msg.data=ss.str();
ROS_INFO(“%s”,msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++ count ;
}
return 0;
}
寫完後記得在catkin_ws資料夾先輸入catkin_make,如下圖所示:
然後看到它Run到100%,代表code沒什麼問題,如下圖所示:
因為要跑一支自己寫的hello world,所以會是長這樣 :
rosrun package_name executable_name
快捷鍵(ctrl+alt+t)開一個Terminal,輸入rosrun hello_world_node hello_world_node,就會發現它一直瘋狂的在hello world!
太棒啦!終於真正地進入ROS的Hello World了,希望大家能看的懂!
Publisher與Subscriber的Code
在Publisher與Subscriber的Code與我們之前玩的MQTT有87%相像,這裡就來說明是哪87%。簡單的Publisher與Subscriber就如下圖,我把測距Odometry的位置和角度丟出去,收的人是名字為SLAM這位。我一直丟,他一直收,無怨無悔的收,就可以把位置畫出來。
或是我一直丟,其他機器人一直收,就能做到類似母雞帶小鴨的追隨功能。
而Server與Client的關係可以做到相互溝通,Client也可去詢問Service以回覆目前狀態,如下圖所示:
再來就是玩玩ROS的code,大家可以參閱ROS官網。這次我們玩的是Publisher與Subscriber,建置方式與前面類似,但如果不想再做一次,直接下載Github看Code也行。
下載後放入catkin_ws/src內,如下圖紅框:
記得回到catkin_ws做一下catkin_make,如下圖所示:
註:這裡不會講的太詳細,因為電子書7.2節(page.151),已經寫的已經夠明白囉!
所以我們直接拿來玩就好 ~
- 先roscore
- 再開個Terminal 輸入 rosrun ros_tutorials_topic topic_publisher
- 開第3個Terminal 輸入rosrun ros_tutorials_topic topic_subscriber
(P.S.總共開了3個Terminal)
小結
有沒有發現2支程式在交互作用了!當您停掉topic_publisher(ctrl+c)時,topic_subscriber也會跟著停呢!
這次透過ROS工作區的解說,讓大家更認識ROS外,也終於玩到Publisher與Subscriber,發現它的Code的確與我們之前教的MQTT有高度相似呢!有沒有覺得離ROS愈來愈近了呢?
(本文轉載自南科AI_ROBOT自造基地、原文連結;責任編輯:賴佩萱)
- 【育教於樂】我家日常的康達效應 - 2019/04/25
- 【Tutorial】一起走進 ROS 的世界吧(5) - 語音辨識篇 - 2018/12/26
- 【Tutorial】一起走進 ROS 的世界吧(4) — 視覺辨識篇 - 2018/11/14
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2019/08/22
沒有圖啊大大!!
2019/08/22
請問什麼圖?
2019/08/23
大大的 如下圖所示:
然後下面都是空白的,看不到東西
2020/02/04
找到圖了
看來這篇文章也是取自別的文章再修正
只是圖片沒有修正好
http://scolin912.blogspot.com/2018/08/ros-code-part-2.html
希望能幫助那些看不到圖的人
2020/02/04
是圖片連結失效了,我們來處理,謝謝告知!
2020/02/05
圖已救回~