上一篇費了九牛二虎之力,終於把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
然後在/catkin_ws/src下key ls,會看到src資料夾下有一個CMakeLists.txt
這樣就做好了ROS工作區了,以後的CODE就在這裡寫
再來不論玩什麼程式語言,都會有個Hello World,ROS也不例外
首先要先在前面的工作區新建一個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,這樣可以把專案的程式碼全丟進去,參考下圖
原始碼在這兒
#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
再來是要玩Publisher與Subscriber的Code
上一篇有說過與我們之前玩的MQTT有87%相像,這裡就來說明是哪87%
簡單的Publisher與Subscriber就像下圖,我把測距Odometry的位置和角度丟出去,收的人是名字為SLAM的這位
我一直丟,他一直收,無怨無悔的收,就可以把位置畫出來
或是我一直丟,其他機器人一直收,就能做到母雞帶小鴨的追隨功能
(母雞帶小鴨!?)
而Service與Client的關係可以做到相互溝通,Client去詢問Service回覆目前狀態
多說無益,直接看下圖
下載後放入catkin_ws/src內,如下圖紅框
進去資料夾內,就能一窺裡頭的檔案
所以我們直接拿來玩就好 ~
1.
先roscore
2.
再開個Terminal 輸入 rosrun
ros_tutorials_topic topic_publisher
1.
開第3個Terminal 輸入rosrun ros_tutorials_topic topic_subscriber
(總共開了3個Terminal)
沒有有發現2支程式在交互作用了!? 當您停掉topic_publisher(ctrl+c)時,topic_subscriber也會跟著停
終於玩到Publisher與Subscriber啦! 的確與我們之前教的MQTT高度相似啊!
您也想與ROS愈靠愈近嗎?
在做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做失敗也可以參考一下是不是這個問題