
不太冷知識:雷神是程式員
本文耗時5天完成,博主也是從零開始,盡力去寫的,如果發現了錯誤一定要私信告訴我呀,這么努力的博主,關注一下吧,
作者:楊絲兒
座右銘:始于興趣,源于熱愛,成于投入,
介紹:愛丁堡大學 人工智能專業,技術興趣點集中在機器人、人工智能可解釋性、數學、物理等等,
聊天吹水QQ群:兔嘰的魔術工房 (942848525)
個人博客:discover304.top
個人B站賬號:楊絲兒今天也在科學修仙(UP主跨站求個三連加關注)
描述
- ROS是一個開發機器人軟體的框架,軟體被設計成許多互相之間高速傳遞資訊的小程式,
- ROS是一個介于典型客戶端/服務器系統和完全分布式系統之間,因為有一個處于中央角色的roscore在為點對點資訊服務提供命名服務,
- ROS節點交換資訊的渠道叫做話題(topic),一個定義了型別的訊息流,
- ROS對大量的底層實作進行了封裝,很多網路編程中常見的概念在這里被封裝成了高級介面,
- ROS圖中的節點表示的是獨立運行的程式,而圖中的邊表示資料流,這些資料可以是傳感器的資料、執行器的命令、規劃器的狀態等資訊,
輔助工具
- 介紹:catkin是ROS的構建系統:ROS用于可執行程式、庫、腳本和其他代碼可以用的介面的一系列工具,
- 技巧:使用
rqt_graph可以清晰看到當前啟動節點的ROS圖, - 技巧:使用
rostopic檢查當前系統狀態,相關幫助使用$rostopic -h進行查看 - 技巧:可以使用
rosmsg來查看是否有已經滿足你的需求的型別
軟體結構
ROS以包括代碼、資料和檔案在內的包的形式進行管理,
核心結構
- 當一個新節點出現時,roscore向它提供連接其他節點的必要資訊,
- 每個節點周期性地呼叫roscore提供的服務找到其他節點,
- 節點之間的資訊交換是兩個節點直接完成的
軟體結構
系統路徑/任意
- 確保ROS1安裝正確
- 執行ROS初始化:
$source /opt/ros/<ROS1版本名稱>/setup.bash - 新建作業目錄:
$mkdir -p <新建作業區路徑>/src,-p parent引數表示按路徑創建,同時創建src檔案夾,
cd到作業區下的src檔案夾
- 初始化作業區
- 執行作業區初始化命令:
$catkin_init_workspace
- 新建包
- 執行新建包命令:
$catkin_create_pkg <新包名稱> rospy [<其他的依賴包>] - 修改新創建的
package.xml,添加包資訊,例如版本號和包依賴等等,注意:包名稱不允許修改,
cd到作業區ws下
- 編譯作業區
- 執行
catkin_make
- 運行編譯好的包
cd到作業區- 執行環境初始化:
$source devel/setup.bash - 運行:
$rosrun <包名> <包內可執行程式/python腳本> [<其他引數>](默認已經啟動roscore) - 運行:
$roslaunch <包名> <包內.launch檔案>
程式細節
命名問題
- 命名空間概念
- ROS使用
/來分隔命名空間,像是我們的檔案系統一樣
- 命名處理方法
- 訊息重命名:
$<包名> <訊息名>:=<新訊息名> - 命名空間重映射:
$<包名> __ns:=<新命名空間名稱>,ns naming space,所有訊息全部轉移到新的命名空間,簡單來講就是所有名稱前多了新命名空間的路徑 - 節點重命名:
$<包名> __name:=<新節點名>
自動化問題
包內有代碼,部分代碼作為可執行程式存在,一個包會有很多的可執行程式,在包內程式執行一系列合作任務的時候使用.launch實作自動化,
launch檔案結構:樹狀XML結構
- launch
- node
- name="<節點名稱>"
- pkg="<包名>"
- type="<軟體名>"
- output="screen",這是一個除錯的方法,輸出到終端,除錯完成后可以去掉,以保證終端的干凈,
- node
- ···
型別問題
| ROS訊息型別 | 序列化結果 | C++型別 | Python型別 | 注釋 |
|---|
| bool | Unsigned 8-bit integer | uint8_t | Boolean | |
| int8 | Signed 8-bit integer | int8_t | Int | |
| uint8 | Unsigned 8-bit integer | uint8_t | Int | uint[]8 在python中以String表示 |
| int16 | Signed 16-bit integer | int16_t | Int | |
| uint16 | Unsigned 16-bit integer | uint16_t | Int | |
| int32 | Signed 32-bit integer | int32_t | Int | |
| uint32 | Unsigned 32-bit integer | uint32_t | Int | |
| int64 | Signed 64-bit integer | int64_t | Int | |
| uint64 | Unsigned 64-bit integer | uint64_t | Int | |
| float32 | 32-bit IEEE float | float | Float | |
| float64 | 64-bit IEEE float | double | Float | |
| string | ASCII string | std::string | String | ROS不支持Unicode字串,需要用UTF-8編碼 |
| time | secs/nsecs unsigned 32-bit ints | rows::Time | rospy.Time | duration |
- 注意python中的型別和ROS內置型別存在差異,猶如c++的int8和python的Int(32位),所以在Python使用范圍受限的ROS型別時一定要小心,
- ROS中的型別已經很豐富了,可以使用
rosmsg來查看是否有已經滿足你的需求的型別,推薦優先使用已有型別,可以更方便與已有包/軟體互動,如果沒有,那么可以就需要自定義,
自定義訊息
- 自定義訊息在包下的
msg目錄中的訊息定義檔案說明, - 自定義訊息
<類名>.msg檔案結構
- 定義以后使用
catkin_make進行編譯/處理,生成一系列檔案, - 添加訊息構建依賴到
package.xml - 修改
CMakeLists.txt檔案
更改自定義型別
- 那么需要重新運行
catkin_make,否則python會一直使用舊版本的訊息類, - 而且因為訊息是有一個MD5驗證的,為了確保訊息是正確版本,所以你需要對每一個使用了這個型別的包重新使用
catkin_make來保證校驗成功, - 綜上所述,盡量不要去改型別,
ROS代碼部分
工程示例和決議,請參見博客文章:TODO已經在寫了,待更新,
參考