发表于《开源一块飞控SS0》
tmn_A作者
8个月29天前IP:广东
948801
5楼
void controller_data_integrated(void)
{
    if(ins_e_refreshed == 1)
    {
        //姿态直接用惯性导航数据
        memcpy(ind.eular_angle, ins.eular_angle, 12);
        ins_e_refreshed = 0;
    }
    if(ins_v_refreshed == 1)
    {
        //惯导速度更新,预测速度和位置
        for(uint8_t i = 0;i < 3;i++)
        {
            ind.velocity[i] = ind.velocity[i] + (ins.velocity[i] - ins.velocity_last[i]);
        }
        memcpy(ins.velocity_last, ins.velocity, 12);
        //位置预测
        ins.t[0] = HAL_GetTick();
        dt = (ins.t[0]-ins.t[1])/1000.0f;
        ins.t[1] = ins.t[0];
        for(uint8_t i = 0;i < 3;i++)
        {
            ind.position[i] = ind.position[i] + ind.velocity[i]*dt;
        }

        ins_v_refreshed = 0;
    }
    if(esd_h_refreshed == 1)
    {
        //气压传感器高度更新,修正位置项
        esd.dh[0] = (esd.t_p_h[2] - esd.h_0)/100.0f;

        if(fabs(esd.dh[0]-esd.dh[1]) < 5)
        {
            ind.position[2] = ind.position[2] + K_h*(esd.dh[0] - ind.position[2]);
            esd.dh[1] = esd.dh[0];
        }
        esd_h_refreshed = 0;
    }
    if(gps_v_refreshed == 1)
    {
        //GPS速度更新,修正速度项
        gnss.velocity_g[0] = gps.velocity_ground*sinf(gps.angle*3.1415f/180.0f)/3.6f;
        gnss.velocity_g[1] = gps.velocity_ground*cosf(gps.angle*3.1415f/180.0f)/3.6f;

        ind.velocity[0] = ind.velocity[0]+K_gps_vxy*(gnss.velocity_g[0]-ind.velocity[0]);
        ind.velocity[1] = ind.velocity[1]+K_gps_vxy*(gnss.velocity_g[1]-ind.velocity[1]);

        gps_v_refreshed = 0;
    }
    if(gps_p_refreshed == 1)
    {
        //GPS位置更新,修正位置项
        gnss.position[0] = Re*3.1415f*(gps.longitude[0]+gps.longitude[1]/60+gps.longitude[2]/3600-\
                    gnss.longtitude_0[0]-gnss.longtitude_0[1]/60-gnss.longtitude_0[2]/3600)/180;
        gnss.position[1] = Re*3.1415f*(gps.latitude[0]+gps.latitude[1]/60+gps.latitude[2]/3600-\
                    gnss.latitude_0[0]-gnss.latitude_0[1]/60-gnss.latitude_0[2]/3600)/180;   
        gnss.position[2] = gps.altitude - gnss.altitude_0;
        
        ind.position[0] = ind.position[0] + K_gps_pxy*(gnss.position[0] - ind.position[0]);
        ind.position[1] = ind.position[1] + K_gps_pxy*(gnss.position[1] - ind.position[1]);
        ind.position[2] = ind.position[2] + K_gps_pz*(gnss.position[2] - ind.position[2]);

        gps_p_refreshed = 0;
    }
    if(state == WAIT_FOR_MISSION)
    {
        memset(ind.velocity, 0, 12);
        memset(ind.position, 0, 12);
    }
}

最核心的组合导航算法,来自Flight_Controler0的controller.c,就是惯性导航作为预测,每当气压、卫星导航数据到来时进行修正,这里的K全是宏定义,然后基本是蒙的估计的,反正试了很多次,实验效果不错,当然下一代肯定会搞正经的kalman滤波的……这里注意的是速度积分用的不是加速度乘时间,而是惯导回传速度的差分,这样能补偿旋转效应和划桨效应的误差,在高动态下更加准确。

评论
文号 / 948801

百炼成钢
名片专栏发私信
学术分 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' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的