最終效果
這是最終的效果,老夫前前后后弄了一個月才弄好的(中間實在不知道怎么弄放棄了一段時間)。
到最終的效果,需要三篇文章進行介紹的,可能要花費你的部分時間,如果想要達到老夫這個最終的效果,那閣下需要有足夠的耐心并且需要你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倉庫下來之后,然后根據項目中的運用命令行進行各個平臺下的庫生成。
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
這樣我們就可以用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é)議項目吧