"A Gentle Introduction to ROS" by Jason M. O'Kane
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))
成
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 comments:
張貼留言
留言