Swift下的MAVLink協(xié)議(一)

最終效果

drone.gif

這是最終的效果,老夫前前后后弄了一個月才弄好的(中間實在不知道怎么弄放棄了一段時間)。

到最終的效果,需要三篇文章進行介紹的,可能要花費你的部分時間,如果想要達到老夫這個最終的效果,那閣下需要有足夠的耐心并且需要你Mac上20-30G的內存空間。

步驟

1.理解什么這個項目的基礎MAVLink協(xié)議庫,并且知道如何導出自己需要的MavLink庫文件。
2.知道如何用MavLink文件中的方法,解析自己需要的無人機的數據。
3.集成基入MavLink的SDK,主要配置SDK需要的環(huán)境。
4.集成無人機的模擬器,主要用于在電腦終端上運行。

什么是MAVLink

MAVLink is a very lightweight messaging protocol for communicating with drones
這是原文的解釋,通俗的講,就是各個平臺(如swift,OC,C等)語言下與無人機通信的協(xié)議,而這個協(xié)議具體的作用就是將16進制下的Packet轉成Message,利用其中的allFields解析需要的無人機數據。
官方網址

導出需要的MAVLink協(xié)議庫

終端命令行:
git clone https://github.com/mavlink/mavlink.git
git submodule update --init --recursive
如果發(fā)現沒有安裝模塊沒有成功,在執(zhí)行一下這個
pip install --user future

這樣我們Git倉庫下來之后,然后根據項目中的運用命令行進行各個平臺下的庫生成。


WeChatbd183697d4269f038554d7a7d4c1e8a5.png

pymavlink-> generator-> swift->Tests 路徑下,打開ardugen.sh文件,配置如下腳本命令:

export PYTHONPATH="$PYTHONPATH:../../../../"

rm -rf ./MAVLink/MAVLink/Swift/
python -m pymavlink.tools.mavgen message_definitions/v1.0/ardupilotmega.xml -o ./MAVLink/MAVLink/Swift/ --wire-protocol 1.0 --lang Swift

目前版本1中可以支持導出swift的協(xié)議庫, ./MAVLink/MAVLink/Swift這個是導出的目錄。當然你也可以導出其他平臺下的協(xié)議庫, 只需要改一下--lang后面的語言即可。
官方解釋:

usage: mavgen.py [-h] [-o OUTPUT]
                 [--lang {C,CS,JavaScript,TypeScript,Python,WLua,ObjC,Swift,Java,C++11}]
                 [--wire-protocol {0.9,1.0,2.0}] [--no-validate]
                 [--error-limit ERROR_LIMIT] [--strict-units]
                 XML [XML ...]

This tool generate implementations from MAVLink message definitions

positional arguments:
  XML                   MAVLink definitions

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        output directory.
  --lang {C,CS,JavaScript,TypeScript,Python,WLua,ObjC,Swift,Java,C++11}
                        language of generated code [default: Python]
  --wire-protocol {0.9,1.0,2.0}
                        MAVLink protocol version. [default: 1.0]
  --no-validate         Do not perform XML validation. Can speed up code
                        generation if XML files are known to be correct.
  --error-limit ERROR_LIMIT
                        maximum number of validation errors to display
  --strict-units        Perform validation of units attributes.

項目建好之后,當然你也可以下載我在GitHub上的這個swift的協(xié)議庫。
swift_mavlink

接下來
就是socket的通信了。
服務端
客戶端

這樣我們就可以用CocoaAsyncSocket獲取得到的原始數據了。
例如:

let data = Data(bytes: [0xFE, 0x1C, 0x00, 0x01, 0x01, 0x1E, 0x7E, 0x19, 0x01, 0x00, 0x64, 0x6A, 0x8E, 0xBD, 0xB2, 0x0D, 0xDF, 0x3C, 0x5B, 0xD7, 0x8E, 0x3F, 0xEA, 0xC2, 0xAA, 0xBC, 0x56, 0x96, 0x15, 0x3C, 0x51, 0x30, 0xDA, 0x3A, 0x12, 0xAB])

let mavLink = MAVLink()

mavLink.parse(data: data, channel: 0) { message, _ in
    print(message.debugDescription)
}

這是通過MAVLink協(xié)議去解析相關數據,然后輸出是:

ATTITUDE: The attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right).
Fields:
    timeBootMs = 72062 : Timestamp (milliseconds since system boot)
    roll = -0.0695389 : Roll angle (rad, -pi..+pi)
    pitch = 0.0272282 : Pitch angle (rad, -pi..+pi)
    yaw = 1.11595 : Yaw angle (rad, -pi..+pi)
    rollspeed = -0.0208449 : Roll angular speed (rad/s)
    pitchspeed = 0.00913008 : Pitch angular speed (rad/s)
    yawspeed = 0.00166465 : Yaw angular speed (rad/s)

這樣我們通過socket的先拿到無人機的傳過來的原始數據,再通過協(xié)議進行解析,最后輸出我們想拿到的數據類型。

最后給出這個集成了mavlink協(xié)議項目吧

地址

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容