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

【开源飞控】调试

项目场景:

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);
}
http://www.xdnf.cn/news/2147.html

相关文章:

  • 统计定界子数组的数组
  • 下垂控制属于构网型控制技术
  • pytest 技术总结
  • CCF CSP 第30次(2023.05)(4_电力网络_C++)
  • Fedora 43 计划移除所有 GNOME X11 相关软件包
  • Android 13 接入 MediaSession 详细文档
  • 机器学习——朴素贝叶斯法运用
  • 网络攻防第一~四集
  • T型三电平逆变器的SPWM线电压 线与中点电压有几种电平
  • 关闭网桥的STP,解决RHEL10上qemu使用u-boot加载uImage自动加载失败的问题
  • 驱动汽车供应链数字化转型的标杆解决方案:全星研发项目管理APQP软件系统:
  • DP主站转485操作流程
  • vuePress开发和使用
  • WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁
  • 如何轻松将RS232转为Profibus DP,提升PLC效率?
  • ClickHouse查询执行与优化
  • 数据过滤器
  • 阿里云域名智能解析至国内外AWS的合规化部署指南
  • Windows11系统中GIT下载
  • 系统架构设计中的DSSA方法:理论、实践与行业深度应用
  • 【SwitchyOmega安装教程】
  • 【Token系列】01 | Token不是词:GPT如何切分语言的最小单元
  • 思科路由器重分发(RIP动态路由+静态路由)
  • 强化学习:高级策略梯度理论与优化方法
  • react的fiber 用法
  • 6.1腾讯技术岗2025面试趋势前瞻:大模型、云原生与安全隐私新动向
  • 重定向和语言级缓冲区【Linux操作系统】
  • 用python写一个相机选型的简易程序
  • RTMP 协议解析 1
  • Linux0.11内存管理:相关代码