发表于《开源一块飞控SS0》
tmn_A作者
8个月29天前IP:广东
948802
6楼
void controller_check_event(void)
{
    switch(state)
    {
    case WAIT_FOR_MISSION:
        if(NRF24L01P_receive() == 0)
        {
            if(rx_packet[0] == 0xFF)
            {
                tx_packet[0] = 0xFF;
                tx_packet[1] = 0x02;
                printf("MISSION_START:%u\n",NRF24L01P_send());
                state = WAIT_FOR_LAUNCH;
            }
        }
        break;
    case WAIT_FOR_LAUNCH:
        if(modulus(ins.acc)>1.2*g)
        {
            //发射事件
            ind.t0 = HAL_GetTick();
            tx_packet[0] = 0xFF;
            tx_packet[1] = 0x03;
            printf("LAUNCH:%u\n",NRF24L01P_send());
            state = RISE;
        }
        break;
    case RISE:
        //设定硬性时间标准,防止发射后因为震动立刻开伞
        if(ind.velocity[2] < 0 && ind.Delta_t > 500)
        {
            //到轨迹顶端,开伞
            parachute_open();
            tx_packet[0] = 0xFF;
            tx_packet[1] = 0x04;
            printf("PARACHUTE_DEPLOY:%u\n",NRF24L01P_send());
            state = FALL; 
        }
        break;
    case FALL:
        if(fabs(modulus(ins.acc) - g) < DELTA_a && modulus(ins.gyro) < DELTA_g)
        {
            //落地
            tx_packet[0] = 0xFF;
            tx_packet[1] = 0x05;
            printf("LANDING:%u\n",NRF24L01P_send());
            state = BACK_TO_GROUND;
        }
        break;
    default:
        break;
    }
}

这部分是判断火箭状态以及开伞的代码,来自Flight_Controler0的controller.c,用了状态机,可以看状态转移的条件。

评论
文号 / 948802

百炼成钢
名片专栏发私信
学术分 0
总主题 15 帖总回复 172 楼拥有证书:进士 机友 笔友
注册于 2020/08/28 12:52:17最后登录 2026/10/30 21:53:39
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东

个人简介

辰星引力工作室成员,火箭爱好者,嵌入式爱好者,物理爱好者,还有亚雷斯塔克劳利是我老婆。

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的