No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【Tutorial】一起走進ROS的世界吧(2)-工作區運作篇

   

作者: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比較容易懂,但這是學藝不精的小弟的學習路程,也許大家照著官網流程走可能更容易懂。

  1. mkdir -p ~/catkin_ws/src
  2. cd ~/catkin_ws/src
  3. 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沒什麼問題,如下圖所示:

再來是roscore,如下圖所示:

因為要跑一支自己寫的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),已經寫的已經夠明白囉!

所以我們直接拿來玩就好 ~

  1. 先roscore
  2. 再開個Terminal 輸入 rosrun ros_tutorials_topic topic_publisher
  3. 開第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自造基地原文連結;責任編輯:賴佩萱)

Ches拔(Sco Lin)

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: Ches拔(Sco Lin)

兩個男孩的爸爸、下班變身孩子王、衝浪閱讀與coding、PM擔當RD魂。

Share This Post On
468 ad

6 Comments

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *