如何通过Dronekit获取Mission Planner中的伺服输出及第二电池数据?
解决Dronekit-Python的两个功能缺失问题
一、获取实时伺服输出位置
Dronekit默认没有封装Mavlink的SERVO_OUTPUT_RAW消息(对应Mission Planner里的实时伺服输出位置),需要手动订阅该消息来获取实时PWM值:
- 注册消息监听器,监听
SERVO_OUTPUT_RAW消息:
from dronekit import Vehicle def servo_output_callback(attr_name, value): # value是SERVO_OUTPUT_RAW消息对象,通道1-8对应servo1_raw到servo8_raw字段 servo1_pwm = value.servo1_raw servo2_pwm = value.servo2_raw print(f"Servo 1 PWM: {servo1_pwm}, Servo 2 PWM: {servo2_pwm}") # 绑定监听器 vehicle.add_attribute_listener('servo_output_raw', servo_output_callback)
- 转换为实际位置(可选):
结合之前获取的伺服参数(如SERVO1_MIN、SERVO1_MAX),可将PWM值转换为百分比位置:
def pwm_to_position(pwm, min_pwm, max_pwm): return ((pwm - min_pwm) / (max_pwm - min_pwm)) * 100 if max_pwm > min_pwm else 0
注意:需确保飞控开启SERVO_OUTPUT_RAW消息发送,部分型号需调整参数(如SRV1_RAW设置发送频率)。
二、获取第二块电池数据(battery_voltage2、battery_remaining2)
Dronekit的vehicle.battery仅封装第一块电池数据,第二块电池数据需通过监听BATTERY_STATUS消息获取:
先配置飞控双电池参数:
设置BATT2_MONITOR为对应监测类型(如3代表电压监测),并配置BATT2_VOLT_PIN等参数,飞控才会输出第二块电池数据。注册
BATTERY_STATUS消息监听器:
def battery_status_callback(attr_name, value): # value是BATTERY_STATUS消息对象,数组索引1对应第二块电池(索引0为第一块) battery2_voltage = value.voltages[1] / 1000.0 # 原始值为mV,转换为V battery2_remaining = value.remaining_capacity[1] print(f"Battery 2 Voltage: {battery2_voltage}V, Remaining: {battery2_remaining}%") # 绑定监听器 vehicle.add_attribute_listener('battery_status', battery_status_callback)
注意:部分固件版本中remaining_capacity字段可能未填充,若仅需电压,直接读取voltages[1]即可。
内容的提问来源于stack exchange,提问作者Krishnan Shankar
相关产品推荐
相关产品推荐

