当前位置: 首页 > news >正文

【开源飞控】调试

项目场景:

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);
}

相关文章:

  • maven打包时配置多环境参数
  • 设置右键打开VSCode
  • MCP协议:AI与数据世界的“万能连接器“
  • [创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论
  • SpringBoot技术概述与应用实践
  • GPT系列模型-20250426
  • 《软件设计师》复习笔记(6.1)——信息安全及技术
  • 常见的机器视觉通用软件
  • 数据安全和合规性市场分析
  • Redis常见面试题——List对象
  • Redis 数据分片三大方案深度解析与 Java 实战
  • Python爬虫实战:获取高考资源网各学科精品复习资料
  • 蓝桥杯 8. 移动距离
  • Angular开发经常涉及到组件间传递参数,用原生js开发时,如何解决这些问题?
  • 使用 Spring Boot 进行开发
  • 印刷设备管理绩效考核制度与设备优化路径
  • Linux: 如何在VMware上安装Ubuntu操作系统
  • 72.评论日记
  • WPF定义扩展属性和依赖属性
  • Prometheus、Zabbix 和 Nagios 这三个工具的对100个节点的部署设计的信息流
  • 俄罗斯准备在没有先决条件的情况下与乌克兰进行谈判
  • 白酒瓶“神似”北京第一高楼被判侵权,法院一审判赔45万并停售
  • 四川:全省统一取消普通住宅和非普通住宅标准
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展
  • 现场|贝聿铭上海大展:回到他建筑梦的初始之地
  • 国际观察|伦敦会谈“降级”凸显美国乌克兰政策窘境