「ROS從入門到放棄#2」Hello World ! ROS ! 建構工作區 寫個簡單的node來輸出訊息 筆記 教學

Standard
「ROS從入門到放棄#0」ROS & SLAM 資源整理篇 持續更新中
「ROS從入門到放棄#1」ROS 常見的指令集 筆記 教學
「ROS從入門到放棄#2」Hello World ! ROS ! 建構工作區 寫個簡單的node來輸出訊息 筆記 教學
「ROS從入門到放棄#3」turtlesim 試著跑一個簡單的package 經典烏龜模擬器 筆記 教學
「ROS從入門到放棄#4」試著寫一個簡單的 Publisher 筆記 教學
「ROS從入門到放棄#5」試著寫一個簡單的 Subscriber 筆記 教學


1.建立工作區
ROS的工作區架構大概像以下這樣分三層
ROScode/ 進去ROScode
build/ devel/ src/ 進去src
package_name1/  package_name2/  package_name3/


2.建立Package
新增package的時候可以打
catkin_create_pkg package_name
會自動生成一個資料夾裡面附package.xml和CMakeList.txt

這裡我們使用
catkin_create_pkg hello
裡面將會有三個檔案,前兩個是自動生成,.cpp檔是我們自己寫的

所以現在整體架構會是
ROScode/ 進去ROScode
build/ devel/ src/ 進去src
hello/ 進去hello
package.xml  CMakeList.txt  hello_world.cpp


3.完成主要執行檔


4.編輯package相關資訊
在package.xml前段編輯package_name、version、description、maintainer、license等等
雖然package.xml裡面寫的東西基本上都不影響到程式執行
但是當你的package要給別人用的時候就很重要
其他使用者可以從這個檔案中獲取必要的資訊或是在debug中跳出正確的錯誤訊息
像下面會講到的depend,如果package.xml有寫清楚,使用者沒有裝哪個工具,編譯器都能跳出正確的提示告知使用者有哪些package需要但沒有裝


5.宣告相依的libraries
在CMakeList.txt中
更改find_package(catkin REQUIRED)

find_package(catkin REQUIRED COMPONENTS roscpp)

在package.xml中
更改<build_depend>package_name</build_depend>
更改<run_depend>package_name</run_depend>

<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>



6.宣告可執行的文件
在CMakeList.txt中把註解打開
更改add_executable(executable_name source _files)
更改target_link_library(executable_name source _files)
可以自己取executable_name

add_executable(hello_world_exe hello_world.cpp)
target_link_library(hello_world_exe $(catkin_LIBRARIES))


7.編譯workspace
到build/ devel/ src/ 這層打
catkin_make


8.設定環境變數
讓ROS能找到我們新建的Package與檔案
source devel/setup.bash
這個步驟只要這個workspace不變就只需要在每個terminal執行一次
但這樣還是太麻煩
所以要改去家目錄底下更改.bashrc,讓terminal每次開啟時都自動執行這行,步驟如下
cd ~
vim .bashrc
至文件最下方,如果已經有舊的source就助解掉,然後貼上這行
source ~/PATH_TO_WORKSPACE/ROScode/devel/setup.bash


9. 執行程式
要先開節點管理器
roscore
然後就可以執行了rosrun package_name executable_name
rosrun hello hello_world_exe


#後續
之後再次新增package時只需要做2345679即可


#名詞整理
folder_name       資料夾名通常就是package_name,ex: hello
package_name      package名通常等於資料夾名,是在package.xml裡取的,ex: hello
executable_name      自己取的之後rosrun會call的名字,是在CMakeList.txt裡取的,ex: hello_world_exe
source_files      實際實作code的檔案,可能是一個或多個,ex: hello_world.cpp
node_name        node名在rqt_graph裡會顯示,是在source_files裡面取的,ex: hello_world_node
topic_name        topic的名字,ex: /turtle/cmd_vel
message_type_name       topic裡面的message type的名字,ex: geometry_msgs/Twist


#為什麼
為什麼要寫 int main(int argc, char** argv){}
那你一定是C++沒學好,跟我一樣,以下連結有清楚的解釋
https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean
還有什麼是char**
http://bbs.csdn.net/topics/90016932
這則回得不錯
指针的指针,
保存指针的地址 ...
char ch;      //字符
char *a=&ch;  //ch 的地址
char **b=&a;  //a  的地址
那么有:
*b == a
*a == ch
**b == ch .......

0 意見:

張貼留言

留言