2018年8月18日 星期六

ROS的世界 - 寫Code測試 - Part 2


上一篇費了九牛二虎之力,終於把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

3、catkin_make

然後在/catkin_ws/src下key ls,會看到src資料夾下有一個CMakeLists.txt


而在catkin_ws下key ls會看到build devel src的資料夾




這樣就做好了ROS工作區了,以後的CODE就在這裡寫

再來不論玩什麼程式語言,都會有個Hello WorldROS也不例外

這裡的CODE是參考這本電子書來的,也可直接在Githubdownload

首先要先在前面的工作區新建一個package,而新建package的指令是

catkin_create_pkg package_name

所以這次做的hello world我們是這樣輸入

catkin_create_pkg hello_world_node

進去hello_world_node的資料夾會發現有package.xmlCMakeList.txt

package.xml是寫一些像packege名稱、版本和描述等等的,其實小弟都很懶的去改 XD

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

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

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

而且depend還挺重要的,compiler會告訴使用者哪些東西沒裝

所以這裡簡單看一下





再來就是CMakeList.txt,要修正宣告一些相依有用到的Libraries以及宣告可執行檔,如這支hello world

1add_executable(${PROJECT_NAME} src/hello_world_node.cpp)

2target_link_libraries(${PROJECT_NAME}
   ${catkin_LIBRARIES}
 )

3add_executable(${PROJECT_NAME} src/hello_world_node.cpp)

4target_link_libraries(${PROJECT_NAME}
   ${catkin_LIBRARIES}
 )


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





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

但基本上演算法再複雜,直接看code比講師千言萬語還有用

再來就是hello_world_node.cpp程式碼要自己寫,依小弟的習慣會再建一個資料夾叫src,在裡面放code,這樣可以把專案的程式碼全丟進去,參考下圖




hello_world_node.cppcode長這樣 

原始碼在這兒

#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




然後看到它劈哩啪啦Run100%,代表code沒什麼問題


再來先roscore一下


因為要跑一支自己寫的hello world,所以會是長的這樣 ->
rosrun package_name executable_name

快捷鍵(ctrl+alt+t)開一個Terminal
輸入rosrun hello_world_node hello_world_node


就會發現它一直瘋狂的在hello world


太棒啦!!! 終於真正地進入ROSHello World了,希望大家能看的懂 XD


再來是要玩PublisherSubscriberCode

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

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

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


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


ServiceClient的關係可以做到相互溝通,Client去詢問Service回覆目前狀態

多說無益,直接看下圖


再來就是玩玩ROScode,大家可以參閱ROS官網連結

這次我們玩的是PublisherSubscriber,建置方式與前面類似,但如果不想再做一次,直接下載GithubCode也行

下載後放入catkin_ws/src內,如下圖紅框


進去資料夾內,就能一窺裡頭的檔案


註:這裡不會講的太詳細,因為電子書7.2(page.151),已經寫的已經夠明白囉 ~

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

1.     roscore

2.     再開個Terminal 輸入 rosrun ros_tutorials_topic topic_publisher


1.     開第3Terminal 輸入rosrun ros_tutorials_topic topic_subscriber
(總共開了3Terminal)


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

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

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




您也想與ROS愈靠愈近嗎?

               Simple Care - 開放長照智慧系統 !

#文章發表於南科AI_Robot


1 則留言:

  1. 在做Hello world的時候catkin_make一直有問題
    後來終於找到真正問題
    在建立pkg的時候
    catkin_create_pkg hello_world_node
    如果這樣打就會錯誤
    翻電子書原文的東西找來找去才發現(在4.9.1節)
    要修正為
    catkin_create_pkg hello_world_node std_msgs roscpp
    這樣才能make成功
    如果其他人hello world做失敗也可以參考一下是不是這個問題

    回覆刪除

FB設定搶先看的方式

設定搶先看的兩種方式 A1. 先到我家的日常粉絲團按下 …( 紅框處 ) A2. 按下追蹤中 ( 紅框處 ) A3. 按下搶先看 ( 紅框處 ) A4. 完成!!! 另一種方式 ...