运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例

[复制链接]

7

主题

25

帖子

306

积分

二氧化硅

Rank: 2

积分
306
楼主
查看: 1359回复: 0 发表于 2024-2-28 18:03:21   只看该作者
本帖最后由 无名创新 于 2024-2-28 18:04 编辑

运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例(2023年10月28日).pdf.pdf (279.18 KB, 下载次数: 3)


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 n=4;
    if(flight_subtask_cnt[n]==0)
    {
        basic_auto_flight_support();//基本飞行支持软件
        flight_subtask_cnt[n]=1;
        execute_time_ms[n]=10000/flight_subtask_delta;//子任务执行时间
        //向前移动100cm
        Horizontal_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;//子任务执行时间
            //向右移动100cm
            Horizontal_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;//子任务执行时间
            //向后移动100cm
            Horizontal_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;//子任务执行时间
            //向左移动100cm
            Horizontal_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 n=13;
    Vector3f target_position;
    float x=0,y=0,z=0;  
    if(flight_subtask_cnt[n]==0)//起飞点作为第一个悬停点
    {
        basic_auto_flight_support();//基本飞行支持软件
        user_setpoint_generate();//生成航点
            
        //记录下初始起点位置,实际项目中可设置为某一基准原点
        //base_position.x=VIO_SINS.Position[_EAST];
        //base_position.y=VIO_SINS.Position[_NORTH];
        base_position.z=First_Working_Height;//第一作业高度
        
        x=base_position.x;
        y=base_position.y;
        z=First_Working_Height;
        target_position.x=x;
        target_position.y=y;
        target_position.z=z;
        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;
                //航点计数器清0
                flight_global_cnt2[n]=0;
                return ;               
            }
               
            uin**_t current_num=constrain_int32(flight_global_cnt2[n],0,user_setpoint_max-1);//限幅防溢出
            if(user_setpoint_valid_flag[current_num]==true)//如果当前的航点有效,就设置目标航点进入下一线程
            {
                x=nav_setpoint[current_num][0];
                y=nav_setpoint[current_num][1];
                z=nav_setpoint[current_num][2];
                target_position.x=base_position.x+x;//水平位置期望为起飞后基准位置+位置X偏移
                target_position.y=base_position.y+y;//水平位置期望为起飞后基准位置+位置Y偏移
                target_position.z=z;
                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*5ms=0.05s满足
        {
            float dis_cm=pythagorous3(OpticalFlow_Pos_Ctrl_Err.x,OpticalFlow_Pos_Ctrl_Err.y,Total_Controller.Height_Position_Control.Err);
            if(dis_cm<=user_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;
            //航点计数器清0
            flight_global_cnt2[n]=0;            
        }
    }
    else if(flight_subtask_cnt[n]==3)//执行航点完毕后,原地下降,可以根据实际需要,自写更多的飞行任务
    {
        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_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] 的值不在上述列出的范围内,则执行基本飞行支持。

整体来说,该函数负责控制无人机执行一系列灭火任务,包括巡逻、火源检测、色块对准、高度控制、释放灭火包、记录火源位置、以及恢复到巡逻高度等任务。它根据子任务计数器的值来管理不同任务阶段,并根据条件判断是否满足任务完成的条件。一旦任务完成,它将转移到下一个任务阶段或子任务。

快速回复 返回顶部 返回列表