近些年無(wú)人機(jī)編隊(duì)很火熱,大家也熱衷于低成本的實(shí)現(xiàn),大家看也在尋求著各種方案,很不幸,這個(gè)東西不是普通人可以玩轉(zhuǎn)的東西。當(dāng)DJI 推出了可以編程的Tello以后大家都覺(jué)得看到了希望,大量的人來(lái)涌入研究這個(gè)東西,但比較遺憾,由于無(wú)人機(jī)本身在設(shè)計(jì)上面對(duì)場(chǎng)景的不適配,效果不好,聽(tīng)見(jiàn)最多的聲音就是定位不準(zhǔn)。不過(guò)無(wú)所謂,它本身已經(jīng)足夠優(yōu)秀了。
我去年的時(shí)候,發(fā)現(xiàn)了一個(gè)關(guān)于PX4+ROS設(shè)計(jì)的無(wú)人機(jī),是一個(gè)俄羅斯的廠商。
由于都是通用器件,所以這個(gè)體積就很大。。。
不過(guò)無(wú)傷大雅,在基礎(chǔ)構(gòu)件提供的情況下,我發(fā)現(xiàn)還有一個(gè)編隊(duì)的庫(kù),哇哦,這不就是正合我意了?
簡(jiǎn)單講下編隊(duì)的原理,有了圖案,接著將這個(gè)東西離散化,相當(dāng)于線變點(diǎn),這些工作都不重要,很簡(jiǎn)單。最大的問(wèn)題是,如何保持這個(gè)圖像,我們繪畫(huà),因?yàn)槭庆o態(tài)的坐標(biāo),所以我們都不關(guān)注這個(gè)問(wèn)題,但是無(wú)人機(jī)不是會(huì)靜止在一個(gè)地方的,而是有偏移的,也就是編隊(duì)最大的問(wèn)題,相對(duì)定位的問(wèn)題。
?沒(méi)辦法,想要編的過(guò)去只能解決這些問(wèn)題,對(duì)于定位那是一個(gè)多傳感器融合的問(wèn)題了,這里使用ROS解決??赡懿皇亲顑?yōu)的,但是是暫且可以使用的。
這里使用的是,第十三個(gè)發(fā)行版,念力忍者,針對(duì)的是Ubuntu 20.04 (Focal) 版本。然后ROS運(yùn)行在樹(shù)莓派上面,提供高層的服務(wù)。
在里面我也提過(guò)issue,詢問(wèn)是不是可以自己做這個(gè)包,這里說(shuō)可以
就像這樣
有一個(gè)web的工具
在這里
SSH的IP在這里可以設(shè)置
這里是自定義固件時(shí)候的腳本位置
這個(gè)是檢查無(wú)人機(jī)的正確性的工具
就好像這樣使用
rosrun 在啟動(dòng)節(jié)點(diǎn)時(shí),也可以設(shè)置參數(shù):
語(yǔ)法: rosrun 包名 節(jié)點(diǎn)名稱 _參數(shù)名:=參數(shù)值
哥們兒今天領(lǐng)你看看什么叫ROS開(kāi)發(fā)。rospy,你一直以為是個(gè)包,它確實(shí)是個(gè)包(放屁?)
rospy 是 ROS 的純 Python 客戶端庫(kù)。rospy 客戶端 API 使 Python 程序員能夠快速與 ROS主題、服務(wù)和參數(shù)交互。rospy 的設(shè)計(jì)有利于實(shí)現(xiàn)速度(即開(kāi)發(fā)人員時(shí)間)而不是運(yùn)行時(shí)性能,以便算法可以在 ROS 中快速原型化和測(cè)試。它也是非關(guān)鍵路徑代碼的理想選擇,例如配置和初始化代碼。許多 ROS 工具都是用 rospy 編寫(xiě)的,以利用類型自省功能。
注意看,在這里被定義,源文件去ROS的Github上面找
這個(gè)是上層的安裝包,這個(gè)就是使用的catkin安裝的。
你看這個(gè)元消息,rospy是ROS的python客戶端的原生實(shí)現(xiàn)
里面重要的東西有話題,服務(wù),和參數(shù)服務(wù)器,走,去看看。
主題被命名為節(jié)點(diǎn)交換消息的總線。主題具有匿名發(fā)布/訂閱語(yǔ)義,將信息的生產(chǎn)與消費(fèi)分離。一般來(lái)說(shuō),節(jié)點(diǎn)不知道他們正在與誰(shuí)通信。相反,對(duì)數(shù)據(jù)感興趣的節(jié)點(diǎn)訂閱相關(guān)主題;生成數(shù)據(jù)的節(jié)點(diǎn)發(fā)布到相關(guān)主題。一個(gè)主題可以有多個(gè)發(fā)布者和訂閱者。
大概就是,哥們兒我就是發(fā)消息,你愛(ài)看不看。高傲!
太狂這也
主題旨在用于單向流式通信。需要執(zhí)行遠(yuǎn)程過(guò)程調(diào)用(即接收對(duì)請(qǐng)求的響應(yīng))的節(jié)點(diǎn)應(yīng)該使用服務(wù)來(lái)代替。還有用于維護(hù)少量狀態(tài)的參數(shù)服務(wù)器。
主題類型
每個(gè)主題都由用于向其發(fā)布的 ROS消息類型強(qiáng)類型化,節(jié)點(diǎn)只能接收具有匹配類型的消息。Master不強(qiáng)制發(fā)布者之間的類型一致性,但訂閱者不會(huì)建立消息傳輸,除非類型匹配。此外,所有 ROS 客戶端都會(huì)檢查以確保從msg 文件計(jì)算的 MD5匹配。此檢查確保 ROS 節(jié)點(diǎn)是從一致的代碼庫(kù)編譯的。
主題傳輸
ROS 目前支持基于 TCP/IP 和 UDP 的消息傳輸?;?TCP/IP 的傳輸稱為TCPROS,它通過(guò)持久的 TCP/IP 連接流式傳輸消息數(shù)據(jù)。TCPROS 是 ROS 中使用的默認(rèn)傳輸,并且是客戶端庫(kù)需要支持的唯一傳輸?;?UDP 的傳輸,稱為UDPROS,目前僅在roscpp中支持,它將消息分離為 UDP 數(shù)據(jù)包。UDPROS 是一種低延遲、有損傳輸,因此最適合遠(yuǎn)程操作等任務(wù)。
ROS 節(jié)點(diǎn)在運(yùn)行時(shí)協(xié)商所需的傳輸。例如,如果一個(gè)節(jié)點(diǎn)更喜歡 UDPROS 傳輸,但另一個(gè)節(jié)點(diǎn)不支持它,它可以回退到 TCPROS 傳輸。隨著引人注目的用例的出現(xiàn),這種協(xié)商模型可以隨著時(shí)間的推移添加新的傳輸。
rostopic list
關(guān)于現(xiàn)在的節(jié)點(diǎn)情況,你可以使用這個(gè)命令看。
實(shí)現(xiàn)就是這么的樸實(shí)無(wú)華,Python一擼到底
這個(gè)std_msgs是一個(gè)測(cè)試使用的東西
std_msgs 包含 ROS 原始類型的包裝器,這些包裝器記錄在msg 規(guī)范中。它還包含Empty類型,這對(duì)于發(fā)送空信號(hào)很有用。然而,這些類型并沒(méi)有傳達(dá)關(guān)于其內(nèi)容的語(yǔ)義含義:每條消息都只是有一個(gè)名為“數(shù)據(jù)”的字段。因此,雖然此包中的消息可用于快速原型設(shè)計(jì),但它們不適合“長(zhǎng)期”使用。為了便于記錄和協(xié)作,我們建議使用現(xiàn)有消息或創(chuàng)建新消息,以提供有意義的字段名稱。
先看一個(gè)bool
雖然不愛(ài)英語(yǔ),但是現(xiàn)在習(xí)慣看英語(yǔ)了
你看這個(gè)一個(gè)bool的定義
但是它實(shí)現(xiàn)起來(lái)是個(gè)宏,我也看不大懂下面的內(nèi)容,參數(shù)倒是懂
大概就這樣。接下來(lái)看看服務(wù)是什么?
發(fā)布/訂閱模型是一種非常靈活的通信范式,但它的多對(duì)多單向傳輸不適用于分布式系統(tǒng)中經(jīng)常需要的 RPC 請(qǐng)求/回復(fù)交互。請(qǐng)求/回復(fù)是通過(guò)服務(wù)完成的,該服務(wù)由一對(duì)消息定義:一個(gè)用于請(qǐng)求,一個(gè)用于回復(fù)。提供 ROS節(jié)點(diǎn)以字符串name提供服務(wù),客戶端通過(guò)發(fā)送請(qǐng)求消息并等待回復(fù)來(lái)調(diào)用服務(wù)。客戶端庫(kù)通常將這種交互呈現(xiàn)給程序員,就好像它是一個(gè)遠(yuǎn)程過(guò)程調(diào)用一樣。
服務(wù)是使用srv文件定義的,這些文件由 ROS 客戶端庫(kù)編譯成源代碼。
客戶端可以與服務(wù)建立持久連接,從而以降低對(duì)服務(wù)提供者更改的魯棒性為代價(jià)實(shí)現(xiàn)更高的性能。
服務(wù)類型
與topic一樣,服務(wù)具有關(guān)聯(lián)的服務(wù)類型,即 .srv 文件的包資源名稱。與其他基于 ROS 文件系統(tǒng)的類型一樣,服務(wù)類型是包名稱 + .srv文件的名稱。例如,my_srvs/srv/PolledImage.srv具有服務(wù)類型my_srvs/PolledImage。
除了服務(wù)類型之外,服務(wù)還通過(guò).srv文件的 MD5 和進(jìn)行版本控制。只有當(dāng)服務(wù)類型和 MD5 和都匹配時(shí),節(jié)點(diǎn)才能進(jìn)行服務(wù)調(diào)用。這確保了客戶端和服務(wù)器代碼是從一致的代碼庫(kù)構(gòu)建的。
接下來(lái)是參數(shù)服務(wù)器:
參數(shù)服務(wù)器是一個(gè)共享的多變量字典,可通過(guò)網(wǎng)絡(luò) API 訪問(wèn)。節(jié)點(diǎn)使用此服務(wù)器在運(yùn)行時(shí)存儲(chǔ)和檢索參數(shù)。由于它不是為高性能而設(shè)計(jì)的,因此最好用于靜態(tài)、非二進(jìn)制數(shù)據(jù),例如配置參數(shù)。它旨在全局可見(jiàn),以便工具可以輕松檢查系統(tǒng)的配置狀態(tài)并在必要時(shí)進(jìn)行修改。
參數(shù)服務(wù)器使用 XMLRPC 實(shí)現(xiàn)并在 ROS Master內(nèi)部運(yùn)行,這意味著它的 API 可以通過(guò)普通的 XMLRPC 庫(kù)訪問(wèn)。
在rospy的目錄下有兩個(gè)測(cè)試
在 rospy 程序中執(zhí)行的第一個(gè)調(diào)用是對(duì)rospy.init_node()的調(diào)用,它為進(jìn)程初始化 ROS 節(jié)點(diǎn)。rospy 進(jìn)程中只能有一個(gè)節(jié)點(diǎn),因此只能調(diào)用rospy.init_node()一次。
rospy.init_node('my_node_name')
rospy.init_node('my_node_name', 匿名=True)
?
在這里
在這里被定義
具體的以后有機(jī)會(huì)再看,繼續(xù)看tf2的庫(kù)的作用:
tf已經(jīng)被棄用,取而代之的是tf2。tf2是轉(zhuǎn)換庫(kù)的第二代,它允許用戶隨時(shí)間跟蹤多個(gè)坐標(biāo)幀。tf2在時(shí)間緩沖的樹(shù)結(jié)構(gòu)中維護(hù)坐標(biāo)幀之間的關(guān)系,并允許用戶在任何所需的時(shí)間點(diǎn)在任意兩個(gè)坐標(biāo)幀之間轉(zhuǎn)換點(diǎn)、向量等。
機(jī)器人系統(tǒng)通常具有許多隨時(shí)間變化的三維坐標(biāo)系,例如世界坐標(biāo)系、基礎(chǔ)坐標(biāo)系、夾具坐標(biāo)系、頭部坐標(biāo)系等。tf2隨時(shí)間跟蹤所有的這些坐標(biāo)系,并可以解答下列問(wèn)題:
①在5秒之前,頭部坐標(biāo)系相對(duì)于世界坐標(biāo)系在哪;
②我抓手中的物體相對(duì)于我的底座的姿態(tài)是什么;
③地圖坐標(biāo)系中的基礎(chǔ)坐標(biāo)系當(dāng)前位姿是什么。
tf2 可以在分布式系統(tǒng)中運(yùn)行。這意味著有關(guān)機(jī)器人坐標(biāo)系的所有信息都可用于系統(tǒng)中任何計(jì)算機(jī)上的所有 ROS 組件。?tf2 可以與包含所有轉(zhuǎn)換信息的中央服務(wù)器一起運(yùn)行,或者您可以讓分布式系統(tǒng)中的每個(gè)組件構(gòu)建自己的轉(zhuǎn)換信息數(shù)據(jù)庫(kù)。
tf2_geometry_msgs
下面這些是各種的消息
這里是要check的參數(shù)
這里是寫(xiě)明了一個(gè)從開(kāi)機(jī)就執(zhí)行的視覺(jué)任務(wù)
這個(gè)是攝像頭的參數(shù)
from clover import srvfrom std_srvs.srv import Trigger
飛行之前要導(dǎo)入這些的消息。
這是一個(gè)基礎(chǔ)的遙感消息
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)navigate = rospy.ServiceProxy('navigate', srv.Navigate)navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)set_position = rospy.ServiceProxy('set_position', srv.SetPosition)set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)land = rospy.ServiceProxy('land', Trigger)
打印起來(lái)很簡(jiǎn)單
print('Take off and hover 1 m above the ground')navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
控制飛行,就是這樣的輸入?yún)?shù)就行。
找到了實(shí)現(xiàn)的CPP函數(shù)
這是一些標(biāo)志位
如果是busy,那就觸發(fā)一個(gè)運(yùn)行時(shí)的錯(cuò)誤,接著把標(biāo)志位重置,檢查狀態(tài)
又檢查一個(gè)標(biāo)志位
寫(xiě)了好多了,下篇繼續(xù)
cat /proc/device-tree/model
樹(shù)莓派的版本
打印一下內(nèi)核
可能最快樂(lè)的事情就是catkin的logo這么好看
https://github.com/CopterExpress/clever-show
https://github.com/CopterExpress/clover
https://github.com/ros/ros
https://github.com/ros/ros_comm
https://www.ros.org/
?
編輯:黃飛
?
評(píng)論
查看更多