【开源飞控】调试
项目场景:
pixhawk 6c飞控板的telem2 外部接负载板 通过MAVLink协议实现读取飞行状态,以及飞控停桨的功能。
调试步骤
pixhawk 6c飞控板接口说明 点击进入
查阅Telem 2 Port分配uart5,配置QGC设置–参数–搜索SERIAL5,修改波特率115200(实际要根据飞控那边提供的波特率修改,并且负载端波特率也要一致)和用途MAVLink2,并保存后重启。
串口默认是1HZ心跳(02)输出,如果接了SUBUS输入,同样也会有1HZ的RC(06)消息输出
获取飞行状态:
extended status不用拉取 默认就有,为了可靠 可以主动设置一下频率,用MAV_CMD_SET_MESSAGE_INTERVAL 方法
注意:这里的系统ID和系统组件ID是飞控端提供,且不能与地面站设置一样,之前设置了两个1,无数据输出,这里的ID设置2,25是任意赋予的。
void set_message_interval()
{ uint8_t buffer[256]; uint16_t len = 0;uint8_t system_id = 2; // 系统 IDuint8_t component_id = 25; // 地面站组件 IDuint8_t target_system = 1; // 目标系统 IDuint8_t target_component = 1; // 目标组件ID(飞控)mavlink_message_t msg;// 设置消息ID为245(EXTENDED_SYS_STATE)的消息发送间隔为100000微秒(即每0.1秒发送一次)mavlink_msg_command_long_pack(system_id, component_id, &msg,target_system,target_component,MAV_CMD_SET_MESSAGE_INTERVAL, // 命令ID0, // 确认类型MAVLINK_MSG_ID_EXTENDED_SYS_STATE , // 消息ID (param1)100000.0f, // 时间间隔 (微秒)0.0f, 0.0f, 0.0f, 0.0f, 0.0f // 其余参数未使用 (param3 到 param7));// 发送 MAVLink 消息len = mavlink_msg_to_send_buffer(buffer, &msg);Send_nByte(buffer, len);
}
执行set_message_interval()函数之后,将telem2通过USB转TTL插在串口助手上,会有10Hz的飞行状态数据输出
接受解析飞行状态
// 全局变量,用于存储当前的MAVLink状态
mavlink_status_t mavlink_status;
mavlink_message_t mavlink_msg;
unsigned char fly_state;
unsigned char fly_debug; //调试用
// 飞行状态解析函数
void parse_mavlink_message(void) {uint16_t i ;if(Cmd_Flag==0) return;Cmd_Flag =0;fly_debug=1;for ( i = 0; i <=18; i++) { //这里的18字节待确认// 逐字节解析MAVLink消息if (mavlink_parse_char(MAVLINK_COMM_3, Cmd[i], &mavlink_msg, &mavlink_status)) {fly_debug=2; // 检查是否是 EXTENDED_SYS_STATE 消息 (ID: 245)if (mavlink_msg.msgid == 245) {// 解码 EXTENDED_SYS_STATE 消息mavlink_extended_sys_state_t extended_sys_state;mavlink_msg_extended_sys_state_decode(&mavlink_msg, &extended_sys_state);fly_debug=3;// 判断飞行器状态switch (extended_sys_state.vtol_state) {case MAV_VTOL_STATE_TRANSITION_TO_FW://表示VTOL(垂直起降)飞行器的状态,如固定翼模式、多旋翼模式等。 break;case MAV_VTOL_STATE_TRANSITION_TO_MC: //表示飞行器是否在地面上、飞行中、起飞中或降落中 break;default:break;}fly_debug=4;// 判断飞行器是否在飞行或地面状态fly_state=extended_sys_state.landed_state;switch (extended_sys_state.landed_state) {case MAV_LANDED_STATE_IN_AIR: //飞机正在飞行Active_En_Flag=1; //解锁标志Active_En_cmd1=1; break;case MAV_LANDED_STATE_ON_GROUND://飞机在地面状态Active_En_Flag =0; //锁定标志Active_En_cmd1=0; break;case MAV_LANDED_STATE_TAKEOFF:// 飞机正在起飞Active_En_Flag=0; Active_En_cmd1=0; break;case MAV_LANDED_STATE_LANDING: // 飞机正在降落Active_En_Flag=1; Active_En_cmd1=1; break;default: // 未知状态Active_En_Flag=0; Active_En_cmd1=0; break;}}}}
}
飞机与降落伞状态对应关系:
飞行状态未知:降落伞状态锁定
飞行状态地面:降落伞状态锁定
飞行状态飞行:降落伞状态解锁
飞行状态降落:降落伞状态解锁
飞行状态起飞:降落伞状态锁定
停桨逻辑:
降落伞状态解锁&&内部传感器数据(全向姿态80°||Z轴失重0.2g持续0.2s)超过阈值
开伞并10Hz持续发送停桨(消息ID:185)
停桨控制(185)函数 请求飞行状态(245)函数《可不用主动请求》
//停桨控制
void send_flight_termination_command(void)
{uint8_t buffer[128];uint16_t len =0;mavlink_message_t msg;uint8_t system_id = 2;
//地面站系统 IDuint8_t component_id =25;//地面站组件 ID
//目标系统ID(飞控)uint8_t target_system =1;uint8_t target_component=1;//目标组件ID(飞控)mavlink_msg_command_long_pack(system_id, component_id,&msg,target_system,target_component,185,0,1, //param1:1 表示启用停奖// 其他参数(未使用)0,0,0,0,0,0);len=mavlink_msg_to_send_buffer(buffer, &msg);Send_nByte(buffer,len);
}//请求飞行器发送消息 数据类型ID:245 //未用 不用主动发送
//system_id,component_id不能和飞控的ID重复uint8_t send245_buffer[128]; //设置全局方便DUBUG
void request_extended_sys_state(){uint16_t len =0;uint8_t system_id = 2; //系统 IDuint8_t component_id =25; //地面站组件 IDuint8_t target_system =1; //目标系统 IDuint8_t target_component=1;//目标组件ID(飞控)mavlink_message_t msg;mavlink_msg_request_data_stream_pack(system_id, // 系统 IDcomponent_id, // 组件 ID&msg, target_system, // 目标系统 IDtarget_component, // 目标组件 ID245, // 请求的数据流类型1, // 数据流的更新频率1 // 开启数据流);// 发送 MAVLink 消息len=mavlink_msg_to_send_buffer(send245_buffer, &msg);Send_nByte(send245_buffer,len);
}