【知識教學文】一起走進ROS的世界吧!-Part2

【知識教學文】一起走進ROS的世界吧!-Part2

上一篇費了九牛二虎之力,終於把VMWARE + UBUNTU + ROS安裝完畢。

其實小弟在玩ROS前吃了不少苦頭,並不像上一篇這麼順利,而且至少看了5本書(線上),與買了2本中文書與一堆網路文章,才看懂ROS到底能不能做到我想要的。

還要知道如何與硬體交互,又因為ROS實在是包山包海(我只是想用SLAM啊!)一定要從最根本才有辦法了解ROS的面貌,但追根究底就是小弟程度太差才需要看7本書 XD

學姐表示:

我們只是要做到SLAM而已,但ROS真的是浩瀚無垠,能做的真的太多!

如Machine Learning,小弟之前寫了二篇KNN演算法做室內定位,而ROS它也能搞AI

又如智能音箱做的語音辨識,ROS它也能玩

畢竟研究單位都拿來玩機器人了,AI與語音辨識對ROS來說根本不是問題

現在終於可以開始測試了!真是好事多磨啊!

roscore可以RUN了,此時就要玩玩ROS最經典的小烏龜

但在玩小烏龜之前,先建立工作區比較好一點,因為ROS官方教程是安裝之後就接著建工作區與寫CODE,其實當初這裡小弟看的不是很懂,我倒是覺得先玩小烏龜 → Rviz → Gazebo ,最後再去寫CODE比較容易懂。但這是學藝不精的小弟的學習路程,也許大家照著官網流程走可能一下就懂了。

這裡可能會看到睡著,大家要撐住 XD

  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是參考這本電子書來的,也可直接在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名稱、版本和描述等等的,其實小弟都很懶的去改 XD

但如果您是在研究所或是公司做專案就不一樣啦!

不寫的話,學弟妹可能接不上去!而且在夜深人靜的實驗室咒罵這是什麼鬼code

然後不小心吵醒另外一個同學,很慌張地說:哦哦!我脫隊了!快快快!跟上!Taiwan NO.1 !

而且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}

)

通常比較有在修正的請看下圖紅框↓

小弟覺得這裡如果在課堂上會講到睡著,不如開放同學看一日系列(為什麼沒有一日Coding工程師?邰哥只要不笑對著螢幕張著眼睛就好)

但基本上演算法再複雜,直接看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了,希望大家能看的懂 XD

再來是要玩Publisher與Subscriber的Code

 

上一篇有說過與我們之前玩的MQTT有87%相像,這裡就來說明是哪87%

簡單的Publisher與Subscriber就像下圖,我把測距Odometry的位置和角度丟出去,收的人是名字為SLAM的這位

我一直丟,他一直收,無怨無悔的收,就可以把位置畫出來

或是我一直丟,其他機器人一直收,就能做到母雞帶小鴨的追隨功能

(母雞帶小鴨!?)

而Service與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

(總共開了3個Terminal)

沒有有發現2支程式在交互作用了!? 當您停掉topic_publisher(ctrl+c)時,topic_subscriber也會跟著停

終於玩到Publisher與Subscriber啦! 的確與我們之前教的MQTT高度相似啊!

有沒有覺得離ROS愈來愈近了呢?

歡迎加入智慧醫療主題論壇:https://goo.gl/aNBkuN

(作者:智慧醫療主題論壇版主Sco;責任編輯:葉佳錚)

 

ROS系列教學文:

【知識教學文】一起走進ROS的世界吧!-Part1

Comment ( 1 )

  • Lizer

    您好,”在修正宣告一些相關使用到的Libraries以及宣告可執行檔”這一段落下方的四個步驟,1、2和3、4重複了,請問正確的四個步驟該如何執行呢?

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料