代码解读四 文件名“Ano_AttCtrl.c”

2023-05-16

这部分是关于匿名串级PID的,我觉得有需要的同学可以直接移植,不需要自己写了,确实有点麻烦,基本上代码里面都注释的很清楚了,且由于本人水平有限,所以也不是都很懂,只能做到这里了。

#include "Ano_AttCtrl.h"
#include "Ano_Imu.h"
#include "Drv_icm20602.h"
#include "Ano_MagProcess.h"
#include "Drv_spl06.h"
#include "Ano_MotionCal.h"
#include "Ano_FlightCtrl.h"
#include "Ano_LocCtrl.h"
#include "Ano_MotorCtrl.h"




/*

在这里需要纠正一个概念,基于C语言实现的PID输出就是反馈,而基于控制系统实现的PID最终输出是作用于电机上的
即输出跟反馈并无直接联系
匿名”Ano_Pid.c“文件中PID函数有几个重要的入口参数,
期望值,反馈值,最后在结构体指针里面还有输出值。在这里,遥控器打杆值作为期望,
姿态解算测得的欧拉角作为反馈,经过PID最终输出一个不断接近我们期望的值,
通过PWM驱动电机,同时姿态改变,不断进行上述过程直至最后稳定。

*/




//1->内环即角速度环
//2->外环即角度环



//经过查看这些变量的定义发现,其是来源于”Ano_Pid.h“中的结构体,再滑到下面看到有好多个”Ano_Pid.c“
//中PID函数的引用,不难想到定义这些变量是为了给下面PID函数调用提供初始化,事实上确实是这样
//但是”Ano_Pid.c“中的PID函数除了这两个比较重要的参数外,还有PID的期望值和反馈值也很重要
//到"Ano_AttCtrl.h"中查看,果然可以看到定义有包含有期望值和反馈值的结构体,

//角度环控制参数
_PID_arg_st arg_2[VEC_RPY] ; 

//角速度环控制参数
_PID_arg_st arg_1[VEC_RPY] ;


//角度环控制数据
_PID_val_st val_2[VEC_RPY];

//角速度环控制数据
_PID_val_st val_1[VEC_RPY];


/************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************/


//PIT ROW YAW 各有一套PID吗?
//初始化为下面调用”Ano_Pid.c“中的PID函数做准备
/*角度环PID参数初始化*/
void Att_2level_PID_Init()
{
	arg_2[ROL].kp = Ano_Parame.set.pid_att_2level[ROL][KP];
	arg_2[ROL].ki = Ano_Parame.set.pid_att_2level[ROL][KI];
	arg_2[ROL].kd_ex = Ano_Parame.set.pid_att_2level[ROL][KD];
	arg_2[ROL].kd_fb = Ano_Parame.set.pid_att_2level[ROL][KD];
	arg_2[ROL].k_ff = 0.0f;
	
	arg_2[PIT].kp = Ano_Parame.set.pid_att_2level[PIT][KP];
	arg_2[PIT].ki = Ano_Parame.set.pid_att_2level[PIT][KI];
	arg_2[PIT].kd_ex = Ano_Parame.set.pid_att_2level[PIT][KD];
	arg_2[PIT].kd_fb = Ano_Parame.set.pid_att_2level[PIT][KD];
	arg_2[PIT].k_ff = 0.0f;

	arg_2[YAW].kp = Ano_Parame.set.pid_att_2level[YAW][KP];
	arg_2[YAW].ki = Ano_Parame.set.pid_att_2level[YAW][KI];
	arg_2[YAW].kd_ex = Ano_Parame.set.pid_att_2level[YAW][KD];
	arg_2[YAW].kd_fb = Ano_Parame.set.pid_att_2level[YAW][KD];
	arg_2[YAW].k_ff = 0.0f;		
}


/*
姿态角速率部分控制参数

arg_1_kp:调整角速度响应速度,不震荡的前提下,尽量越高越好。

震荡时,可以降低arg_1_kp,增大arg_1_kd。

若增大arg_1_kd已经不能抑制震荡,需要将kp和kd同时减小。
*/
#define CTRL_1_KI_START 0.0f





/************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************/



/*角速度环PID参数初始化*/
void Att_1level_PID_Init()
{
	arg_1[ROL].kp = Ano_Parame.set.pid_att_1level[ROL][KP];
	arg_1[ROL].ki = Ano_Parame.set.pid_att_1level[ROL][KI];
	arg_1[ROL].kd_ex = 0.005f   ;
	arg_1[ROL].kd_fb = Ano_Parame.set.pid_att_1level[ROL][KD];
	arg_1[ROL].k_ff = 0.0f;
	
	arg_1[PIT].kp = Ano_Parame.set.pid_att_1level[PIT][KP];
	arg_1[PIT].ki = Ano_Parame.set.pid_att_1level[PIT][KI];
	arg_1[PIT].kd_ex = 0.005f   ;
	arg_1[PIT].kd_fb = Ano_Parame.set.pid_att_1level[PIT][KD];
	arg_1[PIT].k_ff = 0.0f;

	arg_1[YAW].kp = Ano_Parame.set.pid_att_1level[YAW][KP];
	arg_1[YAW].ki = Ano_Parame.set.pid_att_1level[YAW][KI];
	arg_1[YAW].kd_ex = 0.00f   ;
	arg_1[YAW].kd_fb = Ano_Parame.set.pid_att_1level[YAW][KD];
	arg_1[YAW].k_ff = 0.00f;	
	
#if (MOTOR_ESC_TYPE == 2)
	#define DIFF_GAIN 0.3f
//	arg_1[ROL].kd_ex = arg_1[ROL].kd_ex *DIFF_GAIN;
//	arg_1[PIT].kd_ex = arg_1[PIT].kd_ex *DIFF_GAIN;
	arg_1[ROL].kd_fb = arg_1[ROL].kd_fb *DIFF_GAIN;
	arg_1[PIT].kd_fb = arg_1[PIT].kd_fb *DIFF_GAIN;
#elif (MOTOR_ESC_TYPE == 1)
	#define DIFF_GAIN 1.0f
//	arg_1[ROL].kd_ex = arg_1[ROL].kd_ex *DIFF_GAIN;
//	arg_1[PIT].kd_ex = arg_1[PIT].kd_ex *DIFF_GAIN;
	arg_1[ROL].kd_fb = arg_1[ROL].kd_fb *DIFF_GAIN;
	arg_1[PIT].kd_fb = arg_1[PIT].kd_fb *DIFF_GAIN;
#endif
}

//为什么要单独把KI拿出来?不懂?
//设置角速度环的Ki
void Set_Att_1level_Ki(u8 mode)
{
	if(mode == 0)
	{
		arg_1[ROL].ki = arg_1[PIT].ki = 0;
	}
	else if(mode == 1)
	{
		arg_1[ROL].ki = Ano_Parame.set.pid_att_1level[ROL][KI];
		arg_1[PIT].ki = Ano_Parame.set.pid_att_1level[PIT][KI];
	}
	else 
	{
		arg_1[ROL].ki = arg_1[PIT].ki = CTRL_1_KI_START;
	}
}


//设置角度环的Ki
void Set_Att_2level_Ki(u8 mode)
{
	if(mode == 0)
	{
		arg_2[ROL].ki = arg_2[PIT].ki = 0;
	}
	else
	{
		arg_2[ROL].ki = Ano_Parame.set.pid_att_2level[ROL][KI];
		arg_2[PIT].ki = Ano_Parame.set.pid_att_2level[PIT][KI];
	}
}


//重要结构体
_att_2l_ct_st att_2l_ct;

static s32 max_yaw_speed,set_yaw_av_tmp;

#define POS_V_DAMPING 0.02f
static float exp_rol_tmp,exp_pit_tmp;
	




/************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************/

/*角度环控制*/
void Att_2level_Ctrl(float dT_s,s16 *CH_N)
{
	
	/*积分微调*/
	exp_rol_tmp = - loc_ctrl_1.out[Y];
	exp_pit_tmp = - loc_ctrl_1.out[X];
	
	if(ABS(exp_rol_tmp + att_2l_ct.exp_rol_adj) < 5)
	{
		att_2l_ct.exp_rol_adj += 0.1f *exp_rol_tmp *dT_s;
		att_2l_ct.exp_rol_adj = LIMIT(att_2l_ct.exp_rol_adj,-1,1);
	}
	
	if(ABS(exp_pit_tmp + att_2l_ct.exp_pit_adj) < 5)
	{
		att_2l_ct.exp_pit_adj += 0.1f *exp_pit_tmp *dT_s;
		att_2l_ct.exp_pit_adj = LIMIT(att_2l_ct.exp_pit_adj,-1,1);
	}
	
	
	
	//外环控制 
	//正负参考ANO坐标参考方向     
	//得出期望欧拉角,但是没有yaw
	//按理来说应该就是摇杆量转换为的欧拉角
	att_2l_ct.exp_rol =cvPid_y.pit_out+exp_rol_tmp + att_2l_ct.exp_rol_adj + POS_V_DAMPING *imu_data.h_acc[Y];
	att_2l_ct.exp_pit =cvPid_x.rol_out+exp_pit_tmp + att_2l_ct.exp_pit_adj + POS_V_DAMPING *imu_data.h_acc[X];
	
	/*期望角度限幅*/
	att_2l_ct.exp_rol = LIMIT(att_2l_ct.exp_rol,-MAX_ANGLE,MAX_ANGLE);
	att_2l_ct.exp_pit = LIMIT(att_2l_ct.exp_pit,-MAX_ANGLE,MAX_ANGLE);
	

	
	//下面一堆都是关于Yaw的处理,虽然看起来比较麻烦,但是我们可以采取和上面一样的方法分析即假设Yaw角
	//就是直接来源于遥控的打杆量,省去中间过程,使用ADT来进行理解,不管他怎么处理,最终输出必然是期待的Yaw
/****************************************************************************************************/
	
	
	if(flag.speed_mode == 3)
	{
		max_yaw_speed = MAX_SPEED_YAW;
	}
	else if(flag.speed_mode == 2 )
	{
		max_yaw_speed = 280;
	}
	else 
	{
		max_yaw_speed = 200;
	}
	/*摇杆量转换为YAW期望角速度*/
	att_1l_ct.set_yaw_speed = (s32)(0.0023f *my_deadzone(CH_N[CH_YAW],0,65) *max_yaw_speed);
	/*最大YAW角速度限幅*/
	set_yaw_av_tmp = LIMIT(att_1l_ct.set_yaw_speed ,-max_yaw_speed,max_yaw_speed);
	
	/*没有起飞,复位*/
	if(flag.taking_off==0)//if(flag.locking)
	{
		att_2l_ct.exp_rol = att_2l_ct.exp_pit = set_yaw_av_tmp = 0;
		att_2l_ct.exp_yaw = att_2l_ct.fb_yaw;
	}
	
	/*设置期望YAW角度*/
	att_2l_ct.exp_yaw += set_yaw_av_tmp *dT_s;
	/*限制为+-180度*/
	if(att_2l_ct.exp_yaw<-180) att_2l_ct.exp_yaw += 360;
	else if(att_2l_ct.exp_yaw>180) att_2l_ct.exp_yaw -= 360;	
	
	/*计算YAW角度误差*/
	att_2l_ct.yaw_err = (att_2l_ct.exp_yaw - att_2l_ct.fb_yaw);
	/*限制为+-180度*/
	if(att_2l_ct.yaw_err<-180) att_2l_ct.yaw_err += 360;
	else if(att_2l_ct.yaw_err>180) att_2l_ct.yaw_err -= 360;
	
	/*限制误差增大*/
	if(att_2l_ct.yaw_err>90)
	{
		if(set_yaw_av_tmp>0)
		{
			set_yaw_av_tmp = 0;
		}
	}
	else if(att_2l_ct.yaw_err<-90)
	{
		if(set_yaw_av_tmp<0)
		{
			set_yaw_av_tmp = 0;
		}
	}

	
/****************************************************************************************************/
	
	
		//imu测量值作为反馈
		att_2l_ct.fb_yaw = imu_data.yaw ;
		att_2l_ct.fb_rol = (imu_data.rol ) ;
		att_2l_ct.fb_pit = (imu_data.pit ) ;
			
	//为什么有这么多PID?
	//这个PID实现的是什么过程?输入期望,则输出就会慢慢向着我期望的方向变化,最终稳定
	//那么这个输入是什么?遥控器各个通道的打杆值,对应于 Pitch Row Yaw Thr的输出,
	//意思是我遥控器打到多少,代表我想要多少,然后PID会输出这样一个值,驱动电机
	//因此一个通道对应于一套PID
	//以遥控器的四通道为例 1-4分别是副翼,升降,油门,方向,
	//而滚转角->副翼 俯仰角->升降 偏航角->方向,油门没有对应的欧拉角,直接控制PWM输出
	//不难回答上述问题
	PID_calculate( dT_s,            						//周期(单位:秒)
										0 ,					//前馈值
										att_2l_ct.exp_rol ,	//期望值(设定值)
										att_2l_ct.fb_rol ,	//反馈值()
										&arg_2[ROL],	    //PID参数结构体
										&val_2[ROL],	  	//PID数据结构体
	                  5,//积分误差限幅
										5 *flag.taking_off			//integration limit,积分限幅
										 )	;
										
	PID_calculate( dT_s,            						//周期(单位:秒)
										0 ,					//前馈值
										att_2l_ct.exp_pit ,	//期望值(设定值)
										att_2l_ct.fb_pit ,	//反馈值()
										&arg_2[PIT],	    //PID参数结构体
										&val_2[PIT],  		//PID数据结构体
	                  5,//积分误差限幅
										5 *flag.taking_off		//integration limit,积分限幅
										 )	;
	
	PID_calculate( 						dT_s,           	 //周期(单位:秒)
										0 ,					 //前馈值
										att_2l_ct.yaw_err ,	 //期望值(设定值)
										0 ,					 //反馈值()
										&arg_2[YAW],  		 //PID参数结构体
										&val_2[YAW],		 //PID数据结构体
	                  5,//积分误差限幅
										5 *flag.taking_off			//integration limit,积分限幅
										 )	;


}

_att_1l_ct_st att_1l_ct;
static float ct_val[4];


  //经过PID,基本能够达到我们的期望值,至于能否快速且误差极小的达到就是另外一回事了
  //涉及到PID调参,先实现原理,再进行调参





  //如果你看懂了上面关于外环的分析,那么下面的内环也是同样的道理
  //最终目的就是调用”Ano_Pid.c“中的PID函数,输入最重要的两个参数期望值和反馈值
  //最终达到我们想要的效果,其他的步骤都是为了达到这个目标所做的必要的准备
  //比如需要将期望摇杆量转化为欧拉角,需要对期望值进行限幅处理等等
/************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************/
/*角速度环控制*/
void Att_1level_Ctrl(float dT_s)
{
	改变控制参数任务(最小控制周期内)
	ctrl_parameter_change_task();
	

		/*期望角速度赋值*/
	  //内环的输入即为外环的输出,不考虑单位
		 for(u8 i = 0;i<3;i++)
		{
			att_1l_ct.exp_angular_velocity[i] = val_2[i].out;// val_2[i].out;//
		}
	
		/*期望角速度限幅*/
		att_1l_ct.exp_angular_velocity[ROL] = LIMIT(att_1l_ct.exp_angular_velocity[ROL],-MAX_ROLLING_SPEED,MAX_ROLLING_SPEED);
		att_1l_ct.exp_angular_velocity[PIT] = LIMIT(att_1l_ct.exp_angular_velocity[PIT],-MAX_ROLLING_SPEED,MAX_ROLLING_SPEED);


	/*反馈角速度赋值*/
	//直接就是陀螺仪测得的值
	att_1l_ct.fb_angular_velocity[ROL] =  sensor.Gyro_deg[X];
	att_1l_ct.fb_angular_velocity[PIT] = -sensor.Gyro_deg[Y];
	att_1l_ct.fb_angular_velocity[YAW] = -sensor.Gyro_deg[Z];
	

	/*PID计算*/									 
 for(u8 i = 0;i<3;i++)
 {
		PID_calculate(·				    dT_s,          		    //周期(单位:秒)
										0,						//前馈值
										att_1l_ct.exp_angular_velocity[i],				//期望值(设定值)
										att_1l_ct.fb_angular_velocity[i],			//反馈值()
										&arg_1[i],				 //PID参数结构体
										&val_1[i],				 //PID数据结构体
                     					200,					 //积分误差限幅
										CTRL_1_INTE_LIM *flag.taking_off			//integration limit,积分幅度限幅
										 )	; 
 
	
	 //内环最终输出值,即将要作用于电机上的值
	 ct_val[i] = (val_1[i].out);
 }
										 

	/*赋值,最终比例调节*/
	mc.ct_val_rol =                   FINAL_P *ct_val[ROL];
	mc.ct_val_pit = X_PROPORTION_X_Y *FINAL_P *ct_val[PIT];
	mc.ct_val_yaw =                   FINAL_P *ct_val[YAW];
 
	/*输出量限幅*/
 //最终得到的值即将用于电机控制
 //串级PID到此结束
	mc.ct_val_rol = LIMIT(mc.ct_val_rol,-1000,1000);
	mc.ct_val_pit = LIMIT(mc.ct_val_pit,-1000,1000);
	mc.ct_val_yaw = LIMIT(mc.ct_val_yaw,-400,400);	
}

_rolling_flag_st rolling_flag;


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码解读四 文件名“Ano_AttCtrl.c” 的相关文章

  • 互联网知识点整理

    软件测试知识点 数据库知识点 计算机网络知识点 数据结构知识点 C 43 43 知识点整理 JAVA知识点整理
  • 导出TensorBoard中的所有数据并平滑处理

    点击此处 tensorboard平滑曲线代码
  • RL论文数据图绘制

    rl plotter 强化学习论文里的训练曲线是用什么画的 xff1f 如何计算相关变量
  • 强化学习之美

    强化学习作为一门灵感来源于心理学中的行为主义理论的学科 xff0c 其内容涉及概率论 统计学 逼近论 凸分析 计算复杂性理论 运筹学等多学科知识 xff0c 难度之大 xff0c 门槛之高 xff0c 导致其发展速度特别缓慢 随着近年来以
  • 直线型一阶倒立摆2---建模

    三 直线型一阶倒立摆模型建立 一级倒立摆系统是一个不稳定的系统 xff0c 需要对其进行机理建模 在研究过程中 xff0c 应忽略空气摩擦 等 xff0c 而后可将倒立摆系统进行抽象化 xff0c 认为其由小车和匀质刚性杆两部分组成并对这两
  • 可用性和可靠性的区别

    首先 xff0c 这两个属性都是质量 xff08 可维护性 xff09 的一部分 按照书上的定义 xff0c 可靠性 xff08 reliability xff09 xff1a 在规格时间间隔内和规定条件下 xff0c 系统或部件执行所要求
  • 直线型一阶倒立摆3---控制器设计

    四 控制器设计 如前文所述 xff0c 倒立摆状态空间方程表明系统能够被控制 被观测 倒立摆或者其它受控系统达到受控稳定状态 xff0c 其实质上是指系统的各状态量收敛至一目标稳定值 对于状态空间描述而言 xff0c 系统矩阵A的特征值为负
  • Centos7 关闭防火墙

    Centos7 关闭防火墙 CentOS 7 0默认使用的是firewall作为防火墙 xff0c 使用iptables必须重新设置一下 1 直接关闭防火墙 systemctl stop firewalld service 停止firewa
  • 485无线通信/数传模块_zigbee模块_RS485转ZigBee_顺舟智能

    一 概述 顺舟智能 SZ02系列 ZigBee无线串口通信设备 xff08 485无线通信 数传设备 xff09 xff0c 采用了加强型的ZigBee无线技术 xff0c 集成了符合 ZIGBEE协议的射频收发器和微处理器 xff0c 符
  • 华清远见嵌入式学院学员实践项目案例介绍一

    基于GPRS的远程安防监控系统 1 项目背景 随着现代电力电子技术和微电子技术的迅猛发展 xff0c 自动化 xff0c 智能化程度的不断的提高 xff0c 家居安防技术正在不断发展 传统的家居安防系统已经越来越不能满足现代人的需求 消费者
  • Ubuntu 20.04.05安装ceres-1.14.0

    1 安装Ceres1 14 0 链接 Ubuntu20 04安装Ceres1 14 0 3 cmake编译ceres遇到的问题 xff08 1 xff09 TBB 问题描述 xff1a Did not find Intel TBB libr

随机推荐

  • ubuntu18.04 安装编译ceres-solver-1.14.0 编译错误

    在Ubuntu18 04 安装Ceres solver 1 14 0 xff0c make时出现了98 Built target bundle adjuster xff0c ecipe for target examples CMakeFi
  • ls-remote -h -t git://github.com/adobe-webplatform/eve.git

    npm WARN deprecated bfj node4 64 5 3 1 Switch to the bfj package for fixes and new features npm WARN deprecated nomnom 6
  • 数据可视化图表插件调研:Echarts、Highcharts、G2、D3

    目前常用于前端网页数据可视化实现的图表插件主要有四款 xff1a Echarts Highcharts G2 D3 xff0c 开发一些产品工具的时候可能会集成这些开源的可视化插件 xff08 这里Highcharts不开源 xff09 1
  • 31岁转行的我

    2011年从一所普通二本师范大学毕业后先后从事了两年的教育工作 xff0c 但都没有挣到钱 xff0c 12年从深圳回到西安 xff0c 参加了几次公务员和事业单位的招考 xff0c 几次因0 1分的微小差距与国家饭碗擦肩而过 后来决定不再
  • git submodule 如何同步更新

    摘要 xff1a git submodule 更新之后 xff0c 如果在父仓库里直接调用 git submodule update init recursive 会发现 子模块的代码不会更新 初学者会很迷惑 xff0c 怎么能把子模块更新
  • egret 入门 初试

    整理的文章 白鹭引擎入门 趁着今天周六 xff0c 把苹果放下一边先 今天早上一醒来就装上了js编辑神器Webstorm xff0c 最近也开始关注了一些移动方面的 js 前端框架 如 谷歌的Angularjs 和 fackbook 的Re
  • Ubuntu 18之vnc连接不上问题(已解决)

    在配置vnc时所以的准备动作已经准备好了 xff0c 该配的文件也配好了 xff0c 但就是一直连接不上 在主机端报time out的错误 xff0c 后来查百度得知vncserver xff1a 1对应5901端口 xff0c 2就是59
  • Matlab R2019a Win64位 迅雷下载链接

    鉴于百度云和PanDownload各种限速 xff0c 所以我特意寻了迅雷磁力链接供大家下载 实在是因为百度云下载只有50 k s xff0c 而迅雷下载5 m s啊 Matlab R2019a Win64位 链接内容包括Matlab和Ca
  • 力扣K神图解算法数据结构解析08

    力扣K神图解算法数据结构点这里 八 位运算 剑指15 xff0c 二进制中1的个数 class Solution public int hammingWeight uint32 t n int cnt 61 0 for int i 61 0
  • 吴军老师《给中学生/大学生的书单》----Yohao整理

    2018 7 27记录 span class hljs code 给中学生的书单 span 一 文学类 18本 span class hljs code 1 金庸和琼瑶各一本 长篇的比短篇的好 span span class hljs co
  • 北航2系921 2021考研历年真题及参考答案(2020-2004)

    需要自取 百度网盘 提取码 xff1a iwbg 关于2020北航921试题 相信大家都听说了 xff0c 2020年的921试题整体难度较2019年小 2019考完后 xff0c 群里面怨声载道 xff0c 信号10年没考电路题了怎么就今
  • 姿态解算

    姿态解算全过程 关于这方面 xff0c 姿态计算的理解大致需要经过以下几个步骤 1 秦永元的 惯性导航 xff0c 不但十分基础而且写的也十分好 xff0c 适合入门 但是并不是所有章节都是需要看的 xff0c 其中1 2节 9 2节和9
  • 匿名飞控代码解读汇总

    由于本人临近毕业 xff0c 所做的毕设是有关无人机方面的 xff0c 所使用的也是匿名的飞控 lt 资料包 20171217 gt xff0c 所以首先需要读懂匿名代码然后才能增加自己的功能 xff0c 临近毕业还有两个月左右 xff0c
  • 融合磁力计的Mahony互补滤波算法

    https blog csdn net qq 21842557 article details 50993809 上面博客有关于磁力计的详细解释 xff0c 不过由于本人资质愚钝 xff0c 至今还不是完全理解 不过思想大致和加速度计差不多
  • 代码解读一 文件名“ANO_Imu.c”

    我把这个文件的所有代码贴上来了 xff0c 供大家参考 xff0c 由于本人水平有限 xff0c 且匿名代码注释比较少 xff0c 所以很多也不是很懂 xff0c 实在是一些莫名的定义太多了 xff0c 什么w x y z h之类的 xff
  • 每周学一点 egret(2): EgretConversion 工具转换ts

    今晚无聊试了一下wing的格式化和这个转换工具 开始的时候我尝试手写翻译 xff0c 发现这一款转换也比较简单 所以尝试做了一下转换 对于如果文件名是中文 要小心一点 总是出现怪怪的 转换后 xff0c 没有直接跳转到对于的目录去 如果加上
  • 代码解读二 文件名“Ano_Math.c”

    这里面都是一些关于数学函数的骚操作 xff0c 既然不使用math h xff0c 那么至少说明这里面的数学函数调用不应比math h里面的函数慢 下面贴出代码 xff0c 简要做了个注释 xff0c 看看就行 至于怎么做的 xff0c 有
  • 关于单级PID及串级PID

    简单记录下我在学习PID过程中遇到的困难及解决方法 xff0c 希望能对大家有所帮助 1 首先 xff0c 关于PID这块理论知识必须非常清楚 xff0c 能够自行推导公式 xff0c 包括位置式PID公式和增量式PID公式 2 实现位置式
  • 代码解读三 文件名“Ano_Pid.c”

    关于PID这部分匿名代码里面有很多 xff0c 此文件是最基础的即单级PID的实现 xff0c 后面的关于速度和角速度环的串级PID及高度和高度速度环的串级PID都是以此为基础的 xff0c 所以此文件内容务必搞懂 C COPYRIGHT
  • 代码解读四 文件名“Ano_AttCtrl.c”

    这部分是关于匿名串级PID的 xff0c 我觉得有需要的同学可以直接移植 xff0c 不需要自己写了 xff0c 确实有点麻烦 xff0c 基本上代码里面都注释的很清楚了 xff0c 且由于本人水平有限 xff0c 所以也不是都很懂 xff