pymavlink 解析自定义mavlink消息。

发布于:2024-04-18 ⋅ 阅读:(33) ⋅ 点赞:(0)

1.下载mavlink_master包,用于将xml 文件生成对应的py文件。地址是
https://codeload.github.com/mavlink/mavlink/zip/refs/heads/master
进入目录运行python .\mavgenerate.py
呈现gui程序
在这里插入图片描述
2.根据发送端的消息定义格式修改接收解析段的pymavlink有关库。
可修改…\venv\Lib\site-packages\pymavlink\dialects\v10\common.xml文件中的messageid中的fields。发送的msgid 要与接收的msgid保持一致!。
3.使用MAVLINK Generator工具。生成common.py文件。
4.将common.py中定义的消息名称有关类和函数复制到
…\venv\Lib\site-packages\pymavlink\dialects\v10\ardupilotmega.py文件内。
eg:我修改的gps_raw_int这个消息名称。那么需要修改的函数有;

 def gps_raw_int_encode(....
 def gps_raw_int_send(.....
 class MAVLink_gps_raw_int_message(MAVLink_message):
 setattr(MAVLink_gps_raw_int_message, "name", mavlink_msg_deprecated_name_property())
 

如果你的字段个数发生了变化,还需要修改…\venv\Lib\site-packages\pymavlink\mavutil.py

   if float(mavlink.WIRE_PROTOCOL_VERSION) >= 1:
            self.messages['HOME'] = mavlink.MAVLink_gps_raw_int_message(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

最后接收端的代码如下:

import time
from pymavlink import mavutil

master = mavutil.mavlink_connection(
    'COM6',
    baud=115200,
)
# master.mav.heartbeat_send(mavutil.mavlink.MAV_TYPE_GCS,
#                                                 mavutil.mavlink.MAV_AUTOPILOT_INVALID, 0, 0, 0)
master.mav.heartbeat_send(mavutil.mavlink.MAV_TYPE_ONBOARD_CONTROLLER,
                                                mavutil.mavlink.MAV_AUTOPILOT_INVALID, 0, 0, 0)
while True:
    msg = master.recv_match(blocking=True,type='GPS_RAW_INT')
    try:

        if not msg:
            continue
        if msg.get_type() == "BAD_DATA":
            if mavutil.all_printable(msg.data):
                print(msg.data)
        else:
            # Message is valid
            print(msg.to_dict(), msg.get_srcSystem(),msg.get_srcComponent(),  msg.get_type())
    except:
        pass
    time.sleep(0.1)