网站开发的研究计划书,网站做第三方登录,用网站开发角度去开发一个网站,能自己在家做网站吗运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例#xff08;2023年10月28日#xff09;
1、以飞控预设的飞行任务demo中void flight_subtask_1(void)代码为例分析一下变量flight_subtask_cnt的作用#xff1f;
//逆时针转动90度#xff0c;完成后降落
void flight_sub…运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例2023年10月28日
1、以飞控预设的飞行任务demo中void flight_subtask_1(void)代码为例分析一下变量flight_subtask_cnt的作用
//逆时针转动90度完成后降落
void flight_subtask_1(void)
{static uint8_t n 0;if (flight_subtask_cnt[n] 0){Flight.yaw_ctrl_mode COUNTER_CLOCKWISE; // 使用逆时针旋转模式Flight.yaw_ctrl_start 1;Flight.yaw_outer_control_output -90; // 逆时针90度OpticalFlow_Control_Pure(0);Flight_Alt_Hold_Control(ALTHOLD_MANUAL_CTRL, NUL, NUL); // 高度控制flight_subtask_cnt[n] 1;}else if (flight_subtask_cnt[n] 1){Flight.yaw_ctrl_mode COUNTER_CLOCKWISE; // 使用逆时针旋转模式Flight.yaw_outer_control_output 0;OpticalFlow_Control_Pure(0);Flight_Alt_Hold_Control(ALTHOLD_MANUAL_CTRL, NUL, NUL); // 高度控制if (Flight.yaw_ctrl_end 1) flight_subtask_cnt[n] 2; // 执行完毕后切换到下一阶段}else if (flight_subtask_cnt[n] 2){Flight.yaw_ctrl_mode ROTATE; // 恢复正常旋转模式Flight.yaw_outer_control_output RC_Data.rc_rpyt[RC_YAW];OpticalFlow_Control_Pure(0);Flight_Alt_Hold_Control(ALTHOLD_AUTO_VEL_CTRL, NUL, -30); // 高度控制}else{basic_auto_flight_support(); // 基本飞行支持软件}
}
flight_subtask_cnt 是一个数组用于跟踪控制飞行任务的不同阶段。在这段代码中flight_subtask_cnt 的作用是标记当前任务的执行阶段以便适时切换到下一阶段或执行不同的飞行操作。具体作用如下 flight_subtask_cnt 是一个数组索引 n 表示当前任务的编号。不同的任务可以有不同的 n 值从而在代码中区分不同的任务。 初始阶段flight_subtask_cnt[n] 被设置为0表示任务尚未开始执行。 在任务的执行过程中flight_subtask_cnt[n] 的值会随着不同阶段的完成而递增以表示任务的进度。 在代码中通过判断flight_subtask_cnt[n] 的值来确定当前执行哪个任务阶段。例如当 flight_subtask_cnt[n] 的值为1时执行任务的第一个阶段当 flight_subtask_cnt[n] 的值为2时执行任务的第二个阶段依此类推。 当任务的一个阶段完成后会将 flight_subtask_cnt[n] 的值递增以切换到下一个阶段。在任务的最后一个阶段通常会执行相应的操作来结束任务。
总之flight_subtask_cnt 在这段代码中用于管理不同任务的执行阶段以确保无人机在不同任务之间切换并完成各自的任务。
2、以飞控预设的飞行任务demo中void flight_subtask_5(void)代码为例分析一下变量execute_time_ms的作用
//机体坐标系下相对位移,正方形轨迹
//右前上分别对应XYZ正方向
void flight_subtask_5(void)
{ static uint8_t n4;if(flight_subtask_cnt[n]0){basic_auto_flight_support();//基本飞行支持软件flight_subtask_cnt[n]1;execute_time_ms[n]10000/flight_subtask_delta;//子任务执行时间//向前移动100cmHorizontal_Navigation(0,100,0,RELATIVE_MODE,BODY_FRAME);}else if(flight_subtask_cnt[n]1){basic_auto_flight_support();//基本飞行支持软件if(execute_time_ms[n]0) execute_time_ms[n]--;if(execute_time_ms[n]0) {flight_subtask_cnt[n]2;execute_time_ms[n]10000/flight_subtask_delta;//子任务执行时间//向右移动100cmHorizontal_Navigation(100,0,0,RELATIVE_MODE,BODY_FRAME);}}else if(flight_subtask_cnt[n]2){basic_auto_flight_support();//基本飞行支持软件if(execute_time_ms[n]0) execute_time_ms[n]--;if(execute_time_ms[n]0) {flight_subtask_cnt[n]3;execute_time_ms[n]10000/flight_subtask_delta;//子任务执行时间//向后移动100cmHorizontal_Navigation(0,-100,0,RELATIVE_MODE,BODY_FRAME);}}else if(flight_subtask_cnt[n]3){basic_auto_flight_support();//基本飞行支持软件if(execute_time_ms[n]0) execute_time_ms[n]--;if(execute_time_ms[n]0) {flight_subtask_cnt[n]4;execute_time_ms[n]10000/flight_subtask_delta;//子任务执行时间//向左移动100cmHorizontal_Navigation(-100,0,0,RELATIVE_MODE,BODY_FRAME);}}else if(flight_subtask_cnt[n]4){basic_auto_flight_support();//基本飞行支持软件if(execute_time_ms[n]0) execute_time_ms[n]--;if(execute_time_ms[n]0) {flight_subtask_cnt[n]5;execute_time_ms[n]10000/flight_subtask_delta;//子任务执行时间//以下还可以继续增加子任务比如向上移动50cm//Horizontal_Navigation(0,0,50,RELATIVE_FRAME,MAP_FRAME);}}else{basic_auto_flight_support();//基本飞行支持软件}
}execute_time_ms 的作用是用来跟踪每个飞行子任务的执行时间。在这段代码中execute_time_ms 主要用于控制子任务的执行时机和切换到下一个子任务。具体作用如下 execute_time_ms 是一个数组用于记录每个飞行子任务的执行时间。数组的每个元素对应一个子任务索引 n 表示子任务的编号。 在每个子任务的执行过程中execute_time_ms[n] 的值会递减。这个值通常以毫秒为单位每递减1表示经过5毫秒的执行时间。 当 execute_time_ms[n] 的值减少到0时表示当前子任务已经执行了足够的时间需要切换到下一个子任务。 通过检查 execute_time_ms[n] 的值可以确定何时切换到下一个子任务以便按照一定的时间间隔执行不同的飞行动作。 在这段代码中每个子任务执行完成后会将 execute_time_ms[n] 的值重新设置为下一个子任务的执行时间从而继续执行下一个子任务。
总之execute_time_ms 在这段代码中用于控制飞行子任务的执行时机以确保不同的子任务按照一定的时间间隔执行实现多步骤的飞行动作。
3、以飞控预设的飞行任务demo中void Navigation_User_Setpoint(void)代码为例分析一下变量flight_global_cnt和flight_global_cnt2的作用
//用户通过按键自定义输入三维的航点位置无人机依次遍历各个航点最多支持28个航点
void Navigation_User_Setpoint(void)
{static uint8_t n13;Vector3f target_position;float x0,y0,z0; if(flight_subtask_cnt[n]0)//起飞点作为第一个悬停点{basic_auto_flight_support();//基本飞行支持软件user_setpoint_generate();//生成航点//记录下初始起点位置实际项目中可设置为某一基准原点//base_position.xVIO_SINS.Position[_EAST];//base_position.yVIO_SINS.Position[_NORTH];base_position.zFirst_Working_Height;//第一作业高度xbase_position.x;ybase_position.y;zFirst_Working_Height;target_position.xx;target_position.yy;target_position.zz;Horizontal_Navigation(target_position.x,target_position.y,target_position.z,GLOBAL_MODE,MAP_FRAME);flight_subtask_cnt[n]1;flight_global_cnt[n]0;flight_global_cnt2[n]0;execute_time_ms[n]1000/flight_subtask_delta;//子任务执行时间}else if(flight_subtask_cnt[n]1)//起飞之后原定悬停1S后再执行航点任务{basic_auto_flight_support();//基本飞行支持软件if(execute_time_ms[n]0) execute_time_ms[n]--;if(execute_time_ms[n]0)//悬停时间计数器归零悬停任务执行完毕 {//判断所有航点均执行完毕执行下一任务if(flight_global_cnt2[n]user_setpoint_max){flight_subtask_cnt[n]3;//结束航点遍历flight_global_cnt[n]0;execute_time_ms[n]0;//航点计数器清0flight_global_cnt2[n]0;return ; }uint16_t current_numconstrain_int32(flight_global_cnt2[n],0,user_setpoint_max-1);//限幅防溢出if(user_setpoint_valid_flag[current_num]true)//如果当前的航点有效就设置目标航点进入下一线程{xnav_setpoint[current_num][0];ynav_setpoint[current_num][1];znav_setpoint[current_num][2];target_position.xbase_position.xx;//水平位置期望为起飞后基准位置位置X偏移target_position.ybase_position.yy;//水平位置期望为起飞后基准位置位置Y偏移target_position.zz;Horizontal_Navigation(target_position.x,target_position.y,target_position.z,GLOBAL_MODE,MAP_FRAME);flight_subtask_cnt[n]2;flight_global_cnt[n]0;execute_time_ms[n]0; }else//如果当前的航点无效跳过当前航点,继续设置下一航点{//航点计数器自加flight_global_cnt2[n]; }} }else if(flight_subtask_cnt[n]2)//检测起飞点悬停完毕后飞向下一个目标点{basic_auto_flight_support();//基本飞行支持软件 //判断是否到达目标航点位置if(flight_global_cnt[n]user_setpoint_fixed_times)//持续10*5ms0.05s满足{float dis_cmpythagorous3(OpticalFlow_Pos_Ctrl_Err.x,OpticalFlow_Pos_Ctrl_Err.y,Total_Controller.Height_Position_Control.Err);if(dis_cmuser_setpoint_fixed_3d_cm) flight_global_cnt[n];else flight_global_cnt[n]/2;}else//持续10*5ms满足表示到达目标航点位置{flight_subtask_cnt[n]1;flight_global_cnt[n]0;execute_time_ms[n]0; //航点计数器自加flight_global_cnt2[n];}//判断所有航点均执行完毕执行下一任务 if(flight_global_cnt2[n]user_setpoint_max){flight_subtask_cnt[n]3;flight_global_cnt[n]0;execute_time_ms[n]0;//航点计数器清0flight_global_cnt2[n]0; }}else if(flight_subtask_cnt[n]3)//执行航点完毕后原地下降可以根据实际需要自写更多的飞行任务{Flight.yaw_ctrl_modeROTATE;Flight.yaw_outer_control_output RC_Data.rc_rpyt[RC_YAW];OpticalFlow_Control_Pure(0);Flight_Alt_Hold_Control(ALTHOLD_AUTO_VEL_CTRL,NUL,-30);//高度控制 }else{basic_auto_flight_support();//基本飞行支持软件}
}
在上面的代码中flight_global_cnt 和 flight_global_cnt2 用于跟踪和管理飞行任务中的不同阶段和航点遍历。这两个变量的作用如下
flight_global_cnt 的作用 flight_global_cnt 用于跟踪当前子任务的执行状态特别是在检查是否到达目标航点位置时。当飞机正在尝试到达一个目标航点时flight_global_cnt 在特定条件下递增。这个条件可能是满足一定的时间持续条件或距离条件。如果 flight_global_cnt 达到一定的条件例如满足时间或距离条件则表示飞机已经到达目标航点随后可以执行下一个任务或目标。 flight_global_cnt2 的作用 flight_global_cnt2 用于跟踪当前正在执行的航点计数。它保持记录当前飞机已经到达了哪些航点并在执行航点遍历任务时递增。飞机遍历多个航点时它可以确保飞机按照用户设定的航点顺序进行遍历。当所有航点都已经执行完毕时flight_global_cnt2 可能被重置以便开始执行下一个任务或结束任务。
这两个变量是飞行任务管理的重要组成部分用于确保飞机按照预定的轨迹和航点执行飞行任务。flight_global_cnt 和 flight_global_cnt2 通过递增、重置和条件检查协同工作以实现飞机的航点遍历和任务执行。
4、帮我分析一下2023年TI国赛G题发挥部分void Air_Ground_Extinguish_Fire_System_Innovation(void)代码执行的流程
上面的代码是一个函数称为Air_Ground_Extinguish_Fire_System_Innovation该函数用于实现无人机的灭火系统控制。以下是该代码的执行过程 初始化静态局部变量 n用于标识飞行任务的子任务编号。fx 和 fy用于记录火源位置的变量。current_nav_cnt用于记录当前执行的航点编号。target_position用于存储目标位置的三维坐标。x, y, 和 z用于存储临时坐标。 根据子任务计数器 flight_subtask_cnt[n] 执行不同的任务阶段。 阶段 0 ( flight_subtask_cnt[n] 0) 初始化基本飞行支持。控制激光笔点亮。记录初始起点位置。设置飞机的目标位置即巡逻高度。进行水平导航。初始化子任务参数并将子任务计数器 flight_subtask_cnt[n] 更新为 1。 阶段 1 ( flight_subtask_cnt[n] 1) 初始化基本飞行支持。检查是否所有航点均执行完毕。如果所有航点已执行完毕则结束航点遍历准备返航降落。设置当前航点的目标位置进行水平导航。更新子任务参数并将子任务计数器 flight_subtask_cnt[n] 更新为 2。 阶段 2 ( flight_subtask_cnt[n] 2) 初始化基本飞行支持。检查是否到达目标航点位置。如果到达目标航点位置更新子任务参数并将子任务计数器 flight_subtask_cnt[n] 更新为 1。增加当前航点计数器 flight_global_cnt2[n]。 阶段 3 ( flight_subtask_cnt[n] 3) 飞向起飞点正上方进行高度控制。检查是否到达目标航点位置更新子任务参数。 阶段 4 ( flight_subtask_cnt[n] 4) 飞机在原地下降进行高度和姿态控制。 阶段 5 ( flight_subtask_cnt[n] 5) 执行色块对准实现无人机飞至火源上方的动作。检查执行时间条件如果色块对准执行时间到达继续下一个任务。如果到达目标正上方切换到高度控制任务。 阶段 6 ( flight_subtask_cnt[n] 6) 下降到 100cm 高度进行高度控制。放出吊仓。 阶段 7 ( flight_subtask_cnt[n] 7) 悬停 3 秒后抛洒灭火包。控制舵机动作。 阶段 8 ( flight_subtask_cnt[n] 8) 释放灭火包动作后执行动作。更新火源信息坐标数据通过串口发送到小车。 阶段 9 ( flight_subtask_cnt[n] 9) 恢复到 180cm 巡逻高度进行高度控制。如果到达巡逻高度准备返航降落或继续巡逻。 最后一个 else 语句表示如果 flight_subtask_cnt[n] 的值不在上述列出的范围内则执行基本飞行支持。
整体来说该函数负责控制无人机执行一系列灭火任务包括巡逻、火源检测、色块对准、高度控制、释放灭火包、记录火源位置、以及恢复到巡逻高度等任务。它根据子任务计数器的值来管理不同任务阶段并根据条件判断是否满足任务完成的条件。一旦任务完成它将转移到下一个任务阶段或子任务。