之前看了mavlink無(wú)人機(jī)協(xié)議,網(wǎng)上關(guān)于mavlink的資料不多。本文大概總結(jié)了下對(duì)mavlink協(xié)議的理解。以下如不說(shuō)明都是說(shuō)mavlink v1.0版本。
首先附上mavlink的各個(gè)消息的簡(jiǎn)介https://pixhawk.ethz.ch/mavlink/(這里的內(nèi)容很多,建議大概了解mavlink后再去瀏覽),mavlink協(xié)議介紹http://qgroundcontrol.org/mavlink/start
之后會(huì)在我的資源里上傳一份為初學(xué)者準(zhǔn)備的mavlink資料(轉(zhuǎn)載)已經(jīng)上傳至筆者資源,免費(fèi)下載。mavlink 純小白教程(英文)它用通俗的說(shuō)法幫助新人理解什么是mavlink,mavlink能干嘛等等。資料只有第一部分,第二部分筆者沒(méi)有找到(可能是原作者沒(méi)繼續(xù)第二部分吧)。
先簡(jiǎn)單介紹下mavlink協(xié)議。Mavlink協(xié)議最早由 蘇黎世聯(lián)邦理工學(xué)院 計(jì)算機(jī)視覺(jué)與幾何實(shí)驗(yàn)組 的 Lorenz Meier 于2009年發(fā)布,并遵循LGPL開(kāi)源協(xié)議。Mavlink協(xié)議是在串口通訊基礎(chǔ)上的一種更高層的開(kāi)源通訊協(xié)議,主要應(yīng)用在微型飛行器(micro aerial vehicle)的通訊上。Mavlink是為小型飛行器和地面站(或者其他飛行器)通訊時(shí)常常用到的那些數(shù)據(jù)制定一種發(fā)送和接收的規(guī)則并加入了校驗(yàn)(checksum)功能。
【1】下面開(kāi)始說(shuō)介紹mavlink所發(fā)送的數(shù)據(jù)結(jié)構(gòu)。Mavlink傳輸時(shí)的基本單位是消息幀。
如圖所示,每個(gè)消息幀都是上述的結(jié)構(gòu),除了灰色外,其他的格子都代表了一個(gè)字節(jié)的數(shù)據(jù)。
紅色的是起始標(biāo)志位(stx),在v1.0版本中以“FE”作為起始標(biāo)志。這個(gè)標(biāo)志位在mavlink消息幀接收端進(jìn)行消息解碼時(shí)有用處。
第二個(gè)格子代表的是灰色部分(payload,稱(chēng)作有效載荷,要用的數(shù)據(jù)在有效載荷里面)的字節(jié)長(zhǎng)度(len),范圍從0到255之間。在mavlink消息幀接收端可以用它和實(shí)際收到的有效載荷的長(zhǎng)度比較,以驗(yàn)證有效載荷的長(zhǎng)度是否正確。
第三個(gè)格子代表的是本次消息幀的序號(hào)(seq),每次發(fā)完一個(gè)消息,這個(gè)字節(jié)的內(nèi)容會(huì)加1,加到255后會(huì)從0重新開(kāi)始。這個(gè)序號(hào)用于mavlink消息幀接收端計(jì)算消息丟失比例用的,相當(dāng)于是信號(hào)強(qiáng)度。
第四個(gè)格子代表了發(fā)送本條消息幀的設(shè)備的系統(tǒng)編號(hào)(sys),使用PIXHAWK刷PX4固件時(shí)默認(rèn)的系統(tǒng)編號(hào)為1,用于mavlink消息幀接收端識(shí)別是哪個(gè)設(shè)備發(fā)來(lái)的消息。
第五個(gè)格子代表了發(fā)送本條消息幀的設(shè)備的單元編號(hào)(comp),使用PIXHAWK刷PX4固件時(shí)默認(rèn)的單元編號(hào)為50,用于mavlink消息幀接收端識(shí)別是設(shè)備的哪個(gè)單元發(fā)來(lái)的消息(暫時(shí)沒(méi)什么用) 。
第六個(gè)格子代表了有效載荷中消息包的編號(hào)(msg),注意它和序號(hào)是不同的,這個(gè)字節(jié)很重要,mavlink消息幀接收端要根據(jù)這個(gè)編號(hào)來(lái)確定有效載荷里到底放了什么消息包并根據(jù)編號(hào)選擇對(duì)應(yīng)的方式來(lái)處理有效載荷里的信息包。
最后兩個(gè)字節(jié)是16位校驗(yàn)位,ckb是高八位,cka是低八位。校驗(yàn)碼由crc16算法得到,算法將整個(gè)消息(從起始位開(kāi)始到有效載荷結(jié)束,還要額外加上個(gè)MAVLINK_CRC_EXTRA字節(jié))進(jìn)行crc16計(jì)算,得出一個(gè)16位的校驗(yàn)碼。之前提到的每種有效載荷里信息包(由消息包編號(hào)來(lái)表明是哪種消息包)會(huì)對(duì)應(yīng)一個(gè)MAVLINK_CRC_EXTRA,這個(gè)MAVLINK_CRC_EXTRA 是由生成mavlink代碼的xml文件生成的,加入這個(gè)額外的東西是為了當(dāng)飛行器和地面站使用不同版本的mavlink協(xié)議時(shí),雙方計(jì)算得到的校驗(yàn)碼會(huì)不同,這樣不同版本間的mavlink協(xié)議就不會(huì)在一起正常工作,避免了由于不同版本間通訊時(shí)帶來(lái)的重大潛在問(wèn)題。
為了方便敘述,消息包將稱(chēng)作包,包所代表的信息稱(chēng)作消息。上圖中的sys將稱(chēng)為sysid,comp將稱(chēng)為compid,msg將稱(chēng)為msgid。
官方的介紹如下圖:
由于圖片上傳量到達(dá)上限,將在接下去的博客中繼續(xù)介紹mavlink協(xié)議。下節(jié)主要介紹mavlink里消息的種類(lèi)和如何看懂開(kāi)始時(shí)提到的那個(gè)官方的mavlink消息介紹。
[摘要:本文松接上文(一),先容mavlink里音訊的品種戰(zhàn)若何看懂最先時(shí)提到的阿誰(shuí)民圓的mavlink音訊先容https://pixhawk.ethz.ch/mavlink/ (一)中已提到了正在mavlink音訊幀里最緊張的兩個(gè)器。
本文緊接上文(一),介紹mavlink里消息的種類(lèi)和如何看懂開(kāi)始時(shí)提到的那個(gè)官方的mavlink消息介紹https://pixhawk.ethz.ch/mavlink/
(一)中已經(jīng)提到了在mavlink消息幀里最重要的兩個(gè)東西,一個(gè)是msgid;一個(gè)是payload,前者是payload中內(nèi)容的編號(hào),后者則存放了消息。消息有許多種類(lèi)型,在官網(wǎng)的網(wǎng)頁(yè)中中以藍(lán)色的“#”加數(shù)字的方式來(lái)表示消息的編號(hào)如 “#0”(這樣的表示方法應(yīng)該是為了方便在網(wǎng)頁(yè)中查找相應(yīng)編號(hào)消息的定義)。在官網(wǎng)介紹網(wǎng)頁(yè)里往下拉,大概拉到二分之一的位置處,開(kāi)始出現(xiàn)“MAVLink Messages”的介紹,往下看是各種消息的數(shù)據(jù)組成說(shuō)明。下面將以幾個(gè)消息為例,講解mavlink消息。
先以 #0消息為例,這個(gè)消息叫心跳包(heartbeat)。它一般用來(lái)表明發(fā)出該消息的設(shè)備是活躍的,飛行器和地面站都會(huì)發(fā)出這個(gè)信號(hào)(一般以1Hz發(fā)送),地面站和飛行器會(huì)根據(jù)是否及時(shí)收到了心跳包來(lái)判斷是否和飛行器或地面站失去了聯(lián)系。
從圖上1可以看出,心跳包由6個(gè)數(shù)據(jù)組成,第一個(gè)是占一個(gè)字節(jié)的飛行器類(lèi)型數(shù)據(jù)type,這個(gè)數(shù)據(jù)表示了當(dāng)前發(fā)消息的是什么飛行器,比如四旋翼,固定翼等。type的取值如何與飛行器類(lèi)型對(duì)應(yīng),這要在官方的mavlink消息介紹網(wǎng)頁(yè)上找,位于網(wǎng)頁(yè)開(kāi)始出的數(shù)據(jù)枚舉中。如下圖所示:
這里只是一部分的類(lèi)型,第一個(gè)是通用飛行器,對(duì)應(yīng)的type數(shù)值是0;第二個(gè)是固定翼類(lèi)型,對(duì)應(yīng)的數(shù)值是1;第三個(gè)對(duì)應(yīng)的是四旋翼,對(duì)應(yīng)的數(shù)值是2.這個(gè)飛行器類(lèi)型,其實(shí)對(duì)于發(fā)心跳包的地面站來(lái)說(shuō)可能沒(méi)什么意義(不同飛控對(duì)該消息的處理方法不同,至少刷了PX4固件的Pixhawk飛控對(duì)地面站發(fā)來(lái)的心跳包里的這個(gè)參數(shù)并不關(guān)心,如無(wú)特殊說(shuō)明,之后所說(shuō)的Pixhawk飛控都是指刷PX4固件的飛控),對(duì)于飛行器端來(lái)說(shuō)代表了當(dāng)前飛行器的類(lèi)型,地面站可以根據(jù)這個(gè)參數(shù)來(lái)判斷飛行器的類(lèi)型并作出其他的反應(yīng)。
第二個(gè)參數(shù)是自駕儀(即通常所說(shuō)的飛控)類(lèi)型,比如apm,ppz,Pixhawk等飛控,具體定義查找和之前查找飛行器類(lèi)型時(shí)的方法一樣。同樣的,對(duì)于發(fā)送心跳包的飛行器來(lái)說(shuō)代表了自己的飛控類(lèi)性,對(duì)地面站發(fā)出的心跳包來(lái)說(shuō)意義不大。
第三個(gè)參數(shù)是基本模式(base mode),是指飛控現(xiàn)在處在哪個(gè)基本模式,對(duì)于發(fā)心跳包的地面站來(lái)說(shuō)沒(méi)有意義,對(duì)于發(fā)送心跳包的飛控來(lái)說(shuō)是有意義的。這個(gè)參數(shù)要看各個(gè)飛控自己的定義方式,mavlink介紹網(wǎng)頁(yè)并不會(huì)給出具體的模式。在Pixhawk中基本模式可以分為使用用戶(hù)模式(custom mode)還是基本模式(這里有點(diǎn)繞,其實(shí)是就是是否使用用戶(hù)模式)。使用用戶(hù)模式將在講下個(gè)參數(shù)時(shí)說(shuō)明,使用基本模式又會(huì)分為自動(dòng)模式(auto),位置控制模式(posctl)和手動(dòng)模式(manual)。一般情況下都會(huì)使用用戶(hù)模式,普通用戶(hù)不用關(guān)心這個(gè)參數(shù)。開(kāi)發(fā)者在使用mavlink修改飛行器模式時(shí)需要注意基本模式的設(shè)置,具體請(qǐng)看PX4代碼,下載地址https://pixhawk.org/firmware/source_code。
另外,Pixhawk的模式和apm的有很大的不同,具體請(qǐng)看官網(wǎng)介紹https://pixhawk.org/users/system_modes,里面還有關(guān)于遙控器如何設(shè)置模式的教程鏈接https://pixhawk.org/users/system_modes/mode_switch_config。用QGroundControl地面站(以后簡(jiǎn)稱(chēng)QGC,下載地址http://qgroundcontrol.org/downloads)的圖形界面來(lái)設(shè)置飛行模式的功能很雞肋,建議直接在QGC中讀取飛控參數(shù)值,并對(duì)遙控器的設(shè)置參數(shù)進(jìn)行修改,記得改變參數(shù)后只是改變了飛控ram參數(shù),要把參數(shù)寫(xiě)入到rom中才可以。
第四個(gè)參數(shù)是用戶(hù)模式(custom mode),大概說(shuō)一下Pixhawk的用戶(hù)模式。以多軸為例。它分為主模式(main mode)和子模式(sub mode),兩種模式組合在一起成為最終的模式,主模式分為3種,手動(dòng)(manual),輔助(assist),自動(dòng)(auto)。手動(dòng)模式類(lèi)似apm的姿態(tài)模式。在輔助模式中,又分為高度控制模式(altctl)和位置控制模式(posctl)兩個(gè)子模式,高度控制模式就類(lèi)似apm的定高模式,油門(mén)對(duì)應(yīng)到飛行器高度控制上。位置模式控制飛行器相對(duì)地面的速度,油門(mén)和高度控制模式一樣,yaw軸控制和手動(dòng)模式一樣。自動(dòng)模式里又分為3個(gè)子模式,任務(wù)模式(mission),留待模式(loiter),返航模式(return),任務(wù)模式就是執(zhí)行設(shè)定好的航點(diǎn)任務(wù),留待模式就是gps懸停模式,返航模式就是直線(xiàn)返回home點(diǎn)并自動(dòng)降落。在apm里這個(gè)參數(shù)貌似是沒(méi)有用的,注意這個(gè)數(shù)據(jù)占了4個(gè)字節(jié),在Pixhawk中,前兩個(gè)字節(jié)(低位)是保留的,沒(méi)有用,第三個(gè)字節(jié)是主模式,第四個(gè)字節(jié)是子模式。普通用戶(hù)請(qǐng)無(wú)視,開(kāi)發(fā)者請(qǐng)注意:官網(wǎng)給出的通過(guò)程序設(shè)置模式的代碼是錯(cuò)誤的。如圖,最后一行代碼有誤,應(yīng)該為:
uint32_t custom_mode = (main_mode<< 16) | (sub_mode << 24);
第五個(gè)是系統(tǒng)狀態(tài)(system status),查定義就好了,其中的standby狀態(tài)在Pixhawk里就是還沒(méi)解鎖的狀態(tài),active狀態(tài)就是已經(jīng)解鎖,準(zhǔn)備起飛的狀態(tài)。
第六個(gè)是mavlink版本(mavlink version),現(xiàn)在是“3”版本。
其余的消息也是類(lèi)似的結(jié)構(gòu),各個(gè)數(shù)據(jù)的定義可以查看mavlink官方網(wǎng)頁(yè)的說(shuō)明,這些說(shuō)明一般在網(wǎng)頁(yè)的前面部分。具體說(shuō)明以飛控為準(zhǔn),mavlink僅提供基本的定義。
有幾個(gè)相對(duì)特殊和容易混淆的消息再特別說(shuō)明下:
#76消息(command long),該消息是發(fā)送長(zhǎng)命令,一般是地面站發(fā)送給飛控命令用的。該消息組成如下圖。目標(biāo)系統(tǒng)(命令的接收方,就是目標(biāo)系統(tǒng)編號(hào)sysid),目標(biāo)單元(命令的接收單元,就是目標(biāo)單元編號(hào)compid)。command數(shù)據(jù)是這條命令的編號(hào),用于區(qū)別不同的命令。confirmation數(shù)據(jù),筆者還不是很明白,大概是是否需要收到命令后回復(fù)確認(rèn)信號(hào)的意思。接下去有七個(gè)參數(shù),這些參數(shù)是執(zhí)行這條命令所需要告訴飛控的,許多命令都用不到七個(gè)參數(shù),多余的參數(shù)清0就可以了。
Pixhawk支持的命令有許多種(但不是所有mavlink命令都支持)。要看mavlink提供了哪些命令請(qǐng)?jiān)诮榻Bmavlink的官網(wǎng)查詢(xún)mav_cmd,在網(wǎng)頁(yè)的中上部分。比如:第176號(hào)命令 MAV_CMD_DO_SET_MODE。這條命令用于改變飛行器的飛行模式,第一個(gè)參數(shù)就是設(shè)置飛控的base_mode,第二個(gè)是設(shè)置custom_mode。想要通過(guò)這條命令正確設(shè)置pixhawk的模式需要查看PX4代碼,mavlink對(duì)參數(shù)的描述不夠具體。
現(xiàn)在應(yīng)該對(duì)介紹mavlink官網(wǎng)的布局有所了解了吧。網(wǎng)頁(yè)前面主要講了各類(lèi)數(shù)據(jù)的取值和含義,比如飛控類(lèi)型(mav_autopilot),飛行器類(lèi)型(mav_type)等,其中mav_cmd是比較特殊和重要的一種數(shù)據(jù)。網(wǎng)頁(yè)的后半部分主要講了mavlink消息的種類(lèi)和數(shù)據(jù)組成,這里會(huì)用到各種數(shù)據(jù),具體數(shù)據(jù)定義的可以回到前半部分去找。但是mavlink是個(gè)通用的通訊協(xié)議,不同的飛控支對(duì)mavlink支持方式不一樣,一般都只支持一部分mavlink消息,還會(huì)自己擴(kuò)展一些mavlink協(xié)議所沒(méi)有定義的消息(pixhawk和apm都是如此),具體都以飛控代碼為準(zhǔn)。
大概說(shuō)說(shuō)地面站和飛控的通訊流程,由于沒(méi)看過(guò)地面站的代碼,所以很可能有誤,還望發(fā)評(píng)論指正!一般飛控在連接上地面站后都會(huì)主動(dòng)向地面站發(fā)送心跳包,飛行器姿態(tài),系統(tǒng)狀態(tài),遙控器信號(hào)等組成的數(shù)據(jù)流。各個(gè)數(shù)據(jù)都會(huì)以一定的頻率發(fā)送,比如心跳包一般是1Hz,姿態(tài)信息會(huì)快些,pixhawk用數(shù)傳連接QGC時(shí)的姿態(tài)數(shù)據(jù)發(fā)送頻率在7-8Hz左右。一般地面站會(huì)在剛連接上飛控時(shí)發(fā)送命令,請(qǐng)求飛控傳回所有參數(shù)(QGC就是這樣),飛控根據(jù)自己的情況判斷是否接受地面站的請(qǐng)求,并根據(jù)不同的命令執(zhí)行相應(yīng)的操作(有些命令需要飛控回復(fù)地面站確認(rèn)信號(hào))。之后地面站根據(jù)用戶(hù)的操作會(huì)發(fā)送相應(yīng)的mavlink消息給飛控,比如設(shè)置航點(diǎn),改寫(xiě)飛控參數(shù)等。據(jù)說(shuō)數(shù)傳是半雙工的(在同一時(shí)刻只能選擇發(fā)送或者選擇接受數(shù)據(jù),不能同時(shí)收發(fā)數(shù)據(jù)),地面站和飛控之間如何避免數(shù)據(jù)沖突(即雙方同時(shí)向?qū)Ψ桨l(fā)送消息)的機(jī)制筆者并不清楚,希望能拋磚引玉。
有問(wèn)題請(qǐng)回復(fù)評(píng)論,然后郵箱提醒我回復(fù),550746284@qq.com 。
本文在上兩篇博客的基礎(chǔ)上,介紹mavlink代碼的結(jié)構(gòu)和編解碼流程。mavlink有很多的版本,雖然都是mavlink v1.0,但還是有很多不一樣的地方,不同飛控,不同時(shí)間的mavlink文件都會(huì)不一樣,筆者講的mavlink是在這里下載的<a target=_blank href=”https://github.com/mavlink/c_library”>https://github.com/mavlink/c_library</a>。mavlink代碼全部由頭文件組成,可以很方便的添加到你自己的代碼中。
可以看到,里面有多個(gè)文件夾和幾個(gè)頭文件。pixhawk,ardupilotmega(apm),matrixpilot這類(lèi)的文件夾里都是各個(gè)飛控自己定義的mavlink消息類(lèi)型,原始的mavlink消息放在common文件夾里面(大部分消息都在common文件夾中)。checksum.h中存放的是計(jì)算校驗(yàn)碼的代碼。mavlink_helper.h里面是將各個(gè)消息包補(bǔ)充完整(調(diào)用checksum.h中的函數(shù)計(jì)算校驗(yàn)碼并補(bǔ)上消息幀的頭,比如sysid和compid等)成為mavlink消息幀再發(fā)送。最主要的功能集中在這兩個(gè)文件夾中。mavlink_conversions.h里是dcm,歐拉角,四元數(shù)三種姿態(tài)表示方法之間的轉(zhuǎn)換代碼。
下面以發(fā)送心跳包(heartbeat)為例,說(shuō)明下如何使用mavlink頭文件來(lái)發(fā)送心跳包。首先打開(kāi)common文件夾中的mavlink_msg_heartbeat.h頭文件。這個(gè)頭文件可以分為兩部分,一部分用來(lái)打包、發(fā)送heartbeat消息,另一部分用來(lái)接收到heartbeat消息時(shí)解碼消息。heartbeat.h定義了heartbeat消息對(duì)應(yīng)的數(shù)據(jù)類(lèi)型:
typedef struct __mavlink_heartbeat_t
{
uint32_t custom_mode; ///< A bitfield for use for autopilot-specific flags.
uint8_t type; ///< Type of the MAV (quadrotor, helicopter, etc., up to 15 types, defined in MAV_TYPE ENUM)
uint8_t autopilot; ///< Autopilot type / class. defined in MAV_AUTOPILOT ENUM
uint8_t base_mode; ///< System mode bitfield, see MAV_MODE_FLAG ENUM in mavlink/include/mavlink_types.h
uint8_t system_status; ///< System status flag, see MAV_STATE ENUM
uint8_t mavlink_version; ///< MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version
} mavlink_heartbeat_t;
如果mavlink的發(fā)送方式可以使用(串口發(fā)送,函數(shù)接口也兼容),則可以調(diào)用 【1】
static inline void mavlink_msg_heartbeat_send(mavlink_channel_t chan, uint8_t type, uint8_t autopilot, uint8_t base_mode, uint32_t custom_mode, uint8_t system_status)
其中的chan是channel的縮寫(xiě),用于選擇發(fā)送的串口或者usb口。type就是飛行器類(lèi)型,其余參數(shù)不明的可以看看本博客的第一篇文章。
該函數(shù)功能是將傳入的各個(gè)參數(shù)按照對(duì)應(yīng)的格式放到heartbeat消息包中(即打包)這個(gè)函數(shù)內(nèi)部有一句預(yù)處理:
#if MAVLINK_CRC_EXTRA
是說(shuō)是否使用額外的crc校驗(yàn)字符(默認(rèn)使用),詳情請(qǐng)看第一篇博客中對(duì)于兩個(gè)校驗(yàn)字節(jié)的說(shuō)明。
函數(shù)中會(huì)調(diào)用函數(shù)【2】
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_HEARTBEAT, buf, MAVLINK_MSG_ID_HEARTBEAT_LEN, MAVLINK_MSG_ID_HEARTBEAT_CRC); MAVLINK_MSG_ID_HEARTBEAT//這個(gè)是心跳包消息對(duì)應(yīng)的編號(hào) 這里=0 MAVLINK_MSG_ID_HEARTBEAT_LEN//這個(gè)是心跳包的長(zhǎng)度 注意這個(gè)長(zhǎng)度僅僅是payload的長(zhǎng)度,不包括幀的頭尾。 MAVLINK_MSG_ID_HEARTBEAT_CRC//這個(gè)是heartbeat消息對(duì)應(yīng)的額外的crc校驗(yàn)碼 這里=50
這個(gè)函數(shù)位于mavlink_helper.h中,用于更新消息幀的編號(hào)(seq 每發(fā)送一幀加1)并將消息幀的頭和計(jì)算校驗(yàn)碼,使得成為完整的一個(gè)mavlink消息幀。最后調(diào)用串口發(fā)送函數(shù)進(jìn)行消息幀的發(fā)送。
如果只是想將對(duì)應(yīng)的心跳包參數(shù)按照心跳包的格式存放好,則可以只調(diào)用
static inline uint16_t mavlink_msg_heartbeat_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
uint8_t type, uint8_t autopilot, uint8_t base_mode, uint32_t custom_mode, uint8_t system_status)
將參數(shù)打包為heartbeat消息幀,待之后使用。
解碼消息幀時(shí)可以調(diào)用mavlink_helper.h中的
MAVLINK_HELPER uint8_t mavlink_parse_char(uint8_t chan, uint8_t c, mavlink_message_t* r_message, mavlink_status_t* r_mavlink_status)
它會(huì)將收到的字符一個(gè)個(gè)進(jìn)行解碼,會(huì)檢驗(yàn)收到的校驗(yàn)碼是否正確;有效載荷的長(zhǎng)度小于最大長(zhǎng)度并且和該消息的長(zhǎng)度一致。如果一切順利,將會(huì)得到解碼到的消息,放在解碼得到的消息幀類(lèi)型中
typedef struct __mavlink_message {
uint16_t checksum; ///< sent at end of packet
uint8_t magic; ///< protocol magic marker
uint8_t len; ///< Length of payload
uint8_t seq; ///< Sequence of packet
uint8_t sysid; ///< ID of message sender system/aircraft
uint8_t compid; ///< ID of the message sender component
uint8_t msgid; ///< ID of message in payload
uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
} mavlink_message_t;
其中的magic是一幀的起始標(biāo)志(FE=254),就是mavlink_stx的值。
其余的mavlink消息也是類(lèi)似的,舊的mavlink代碼中有些類(lèi)型的消息類(lèi)型可能會(huì)找不到,使用時(shí)要注意接受和發(fā)送方使用的mavlink版本是否兼容。common文件夾中的common.h里面包含了要用到的數(shù)據(jù)類(lèi)型和所有消息的頭文件,使用時(shí)直接包含進(jìn)來(lái)即可。
mavlink系列博客到此告一段落,請(qǐng)多指正。有錯(cuò)誤歡迎回復(fù)評(píng)論,或聯(lián)系我。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至2161241530@qq.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.parklessenses.com/wurenjibaike/djiwurenzhishi/8327/