目前你要知道的一點是,ROS說到底就是一個接收和發送的過程,這里就先對發送的信息來一個打包了。
?
- ?
https://dl.djicdn.com/downloads/RoboMaster%20TT/Tello_SDK_3.0_User_Guide_cn.pdf
?
官網有,自取
?
?
目前先了解這個就行
?
?
視頻流也是需要的
?
?
我們先建立一個這樣的文件夾
?
?
把我們需要得信息來封裝一下,ROS得Msg是固定的幾種
?
?
WIFI的配置也有
?
?
在Cmake里面寫好我們要編譯的信息
?
ROS終歸就是個軟件的框架,最終的還是需要一個語言去落實,這里就編譯成C++的。
?
?
XML文件呢,就是這個包的身份證,編譯的時候依賴誰,包的作用等等
?
?
對一個機器人來說,我們需要控制的對吧?
?
顯示無人機圖像并提供鍵盤控制。
?T 用于起飛,L 用于降落無人機,F 用于向前翻轉,E 用于緊急停止,WASD 和箭頭用于控制無人機運動。
?
?
SDK中獲得我們的控制命令
?
?
在具體的寫以前,我想讓大家這里這個控制文件的一個宏觀的設計
?
?
頭寫上
?
?
我們需要C++的ROS2控制庫
?
?
附有完整的API,使用的時候記得多查
?
假如你不查,我覺得就是欠揍,你咋個那么厲害喲~
關ROS中常用的消息。包括動作消息 (actionlib_msgs)、診斷 (diagnostic_msgs)、幾何圖元 (geometry_msgs)、機器人導航 (nav_msgs) 和常見傳感器 (sensor_msgs),例如激光測距儀、相機、點云。
?
?
這里有用這個
?
這表示自由空間中的速度,分為線性部分和角度部分。你等我寫完這些就閱讀ROS的源碼。
?
這個消息包的作用是:隔離消息以在共享依賴關系中的堆棧之間進行通信允許依賴堆棧中的節點進行通信,而無需相互依賴。該堆棧被設計為包含多個堆棧之間使用的最常見消息,以提供共享依賴關系,從而消除有問題的循環依賴關系。
?
?下面的代碼是:ROS 主題發布,你別問為什么這么寫,因為別人也是這樣寫的。
?
這里是ROS2的寫法
ROS1到ROS2的很多消息定義類似,大部分一樣只是多了一個msg域
我自己說的(夸我)
- ?
?
這也是變化
?
?
才學兩天模板就出來搞這了
?
ROS1的定時器使用的是while,二代就牛逼了一些。
?
每個節點都有一個句柄列表(與計時器、訂閱者、客戶端、服務、等待對象相關),這些句柄被放入等待集中。每當節點旋轉(執行周期)時,都會檢查此等待集以查看是否準備好執行任何操作。
?
對于計時器,這僅僅意味著檢查計時器是否“過期”-> 如果是,則執行回調。
對于訂閱,可以將其想象成 rcl 層詢問 rmw 是否在 DDS 級別發生了任何事情,例如接收消息。
?
但基本上,節點只是檢查是否為正確類型的回調觸發了正確的事件。回調中的內容無關緊要。你可以在里面放任何東西。
?
?
這個函數的原型
?
?
看參數就行
?
?
接著我們就可以寫出這樣的代碼,媽的,這就好像我教你1+1,但是留作業是微積分的樣子,但是寫程序就是這樣。事實上還有一段回調沒有寫,開始~
還是先解釋一下這個東西,我們設計了一個節點,這個節點不停的發送SDK里面的指令。里面的命令在外部被訂閱,收到就會執行任務。
?
之后里面搞了一個定時器。1ms看看有沒有東西發生,或者這樣說吧,1ms就看看回調函數有沒有活干,我想回調函數是罵罵咧咧的。
回調函數摸頭,定時器你禮貌嗎?
我之前是個土狗,沒有用過回調函數,曾經看過很多的文章,正經的不正經的都有,但是拋開一切。回調函數無非就是個等候調用的小老弟。說大白話有點不裝逼,來一段拽一些的:顧名思義,回調函數就是回頭再調用它?;卣{函數其實就是一個參數,將這個函數作為參數傳到另一個函數里面,當那個函數執行完之后,再執行傳進去的這個函數。這個過程就叫做回調。
這里我也決定把我的筆記分享給大家:
?
?
?
看懂了嗎?
?
?
在你假裝看懂的基礎上繼續看這個回調函數:
?
?
先看個大的
?
?
這些是OpenCV的東西,就是先搞個控制的照片,填充窗口,然后就是創建,顯示啥的。15ms看看有沒有按鍵按下,還記得我前面的東西嗎?
?
?
就看一個,如果按鍵按下
?
?
就把信息發出去
?
?
如果都沒有就調用手動的函數,媽的,老母豬戴胸罩,一套又一套,再寫個函數。
?
?
沒啥好說的,把來自鍵盤的信息發出去
?
?
發給這個
?
?
最后這個信息發的時候注意組裝
?
?
最后收尾,漂亮~
?
?
添加的編譯文件
?
?
在上面寫一下關于OpenCV的依賴項
?
內容準備的有點多的了。。。接下來一個Node,用于控制DJI Tello無人機的軟件包,根據DJI提供的官方SDK提供數據和對無人機的控制。
?
?
還是先看看組織的樣子
?
這個東西有點復雜,我怕我寫不下去。
?
?
先導入庫
?
?
代碼有點長,倒著看,就是一個節點的啟動
?
?
四元到歐拉
?
?
歐拉到四元
?
我不講這個,因為我們是APP不是算法文章,下次講,而且這兩個函數是可以復用的。
?
?
節點里面有這些函數
?
?
節點一開始內置的參數,不要改動。主要是連接的信息
?
?
把內部的參數獲取,進行類型的轉換
?
?
這里看這個,因為主題是單目的SLAM,所以鏡頭的參數就很重要了
?
?
相機的參數是可以從外部獲取的
?
?
這些參數是哪里來的額?是使用關于標定的ROS包搞來的
?
?
這里就會把外部標定的數據傳給變量。
?
?
這個是外部的Tello控制包,下次我給你解讀
?
?
和日志功能連用,來告訴操作者(就是我,連接情況)
?
?
一個節點的收發功能也啟動到位
?
?
三大線程也啟動
?
?
無人機準備起飛!
?
?
發布的節點是這樣的,應該可以看的明白把。有圖像,鏡頭標定信息,Tello的狀態,ID,IMU的數據,電池,溫度,里程計等,后面還有坐標的廣播。
?
?
訂閱的是外部的信息,起飛?迫降,控制啥的,翻跟頭
?
?
就是ROS之間,信息的傳輸都是標準的信息,所以這里需要進行一個信息的轉換,對于CV來說,思路就是按照順序,追蹤著視頻流走就好,這里就是一個信息的捕獲,轉換,發送,而且是作為線程處理的一個函數。
?
?
另外一個是無人機的信息線程
?
?
死鎖發送
?
?
一個電源的節點,其實有很多的信息,有不變的,有變的,大家都會發出來,但是你具體的使用,都要去選擇的訂閱, 不然我怎么知道你要啥信息,信息是從tello搞來的
?
?
tello的狀態是這樣的,注意看我選擇的關鍵詞,tello都是外部獲得的。感興趣的姿態信息都有了,
?
?
相機的信息是yaml里面存的,就像外掛一樣,也一起發送了。
?
?
剩下就是里程計的發送線程了
?
?
里程計說到底就是距離和角度,自己看要啥
?
?
這個相當于Util函數,寫幾個和機器本身相關的函數
?
?
可以通過這樣的信息,搭配RC指令來精確的控制俺們的小機機
?
本來應該上機給大家展示一下編譯過程的,但是我好累,明天文章的開頭展示,這里放上編譯的腳本:
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
cd ../workspace
rm -rf build install log
rosdep install -i --from-path src
colcon build --symlink-install --packages-select tello tello_control tello_msg
# 表示編譯時如果 install 中文件已經存在于 src 或者 build 文件夾中,
#?就用超鏈接指向該文件,避免浪費空間,也可以實現同步更新
評論