第八,九,十天:陀螺仪姿态解算

本文围绕使用陀螺仪控制小车展开,一是尝试让小车在跷跷板上平衡,通过读取爬坡角度控制小车行进,但未成功;二是实现小车旋转偏移回正,先实现不动摇杆时自动回正,后探讨摇杆控制行进中受外力自动回正,给出不同思路及代码实现,还提及官方例程思路。

目录

一:使用陀螺仪读取爬坡角度,试图在跷跷板上面平衡

二:使用陀螺仪进行旋转偏移的回正

0.目标:

1.先实现不动摇杆时的自动回正

2.之后实现摇杆控制小车行进过程中踢一脚能够进行自动回正并继续受摇杆控制


一:使用陀螺仪读取爬坡角度,试图在跷跷板上面平衡

1.往只有陀螺仪的工程里面移植进入遥控器,CAN通信的对应文件,并添加好对应路径,同时配置好CubeMX。

2.读取INS_angle[1]的值,使得小车可以自行爬坡。

如果是在mian.c里面开的线程,记得先在上面声明一下INS_task里面的INS_angle:

extern fp32 INS_angle[3];      //euler angle, unit rad.欧拉角,单位: rad

然后可以通过判断INS_angle[1]的值是否为0来决定小车是否向前或后退,同时倾斜角度越大,动力应越大:

 if(INS_angle[1]!=0)
 {
        set_angle[0]=INS_angle[1]*500;
        set_angle[1]=INS_angle[1]*500;
        set_angle[2]=INS_angle[1]*500;
        set_angle[3]=INS_angle[1]*500;                
        current_angle[0]=PID_calc(&PID_angle[0],motor_data[0].speed_rpm,-set_angle[0]); //1
                              current_angle[1]=PID_calc(&PID_angle[1],motor_data[1].speed_rpm,set_angle[1]); //2
                       current_angle[2]=PID_calc(&PID_angle[2],motor_data[2].speed_rpm,set_angle[2]); //3
        current_angle[3]=PID_calc(&PID_angle[3],motor_data[3].speed_rpm,-set_angle[3]);//4           
                            can_cmd_motor(&hcan1,0x200,current_angle[0],current_angle[1],current_angle[2],current_angle[3]);        
  } 

 值得注意的是,INS_angle[1]的值为负数时对应的转速和电流也会相应为负,所以轮子会自动实现不同方向的转动。

但最后未能实现小车在跷跷板上平衡,小车总是无法及时修正。

PS;当然也可以使用串行PID的方法去控制小车,外环PID是输入角度输出转速,内环PID是输入转速得到电流,最后发送给电机。

二:使用陀螺仪进行旋转偏移的回正

0.目标:

通过陀螺仪实现小车偏航自稳,通过读取陀螺仪数据使小车能当在偏航角(yaw)非0时通过自旋进行yaw轴归中,实现偏航角度闭环控制

1.先实现不动摇杆时的自动回正

最简单的做法是通过判断INS_angle[0]的值是否为0来进行自动回正,和判断INS_angle[1]来试图在跷跷板上面平衡的方法类似:

//When INS_angle[0] is bigger than 0, spin right 
//But in the computer, the variable of INS_angle[0] can't be 0.00 ,because the float can't be 0.00 
if(INS_angle[0]>2)
{
	set_angle[0]=INS_angle[0]*50;
	set_angle[1]=INS_angle[0]*50;
	set_angle[2]=INS_angle[0]*50;
	set_angle[3]=INS_angle[0]*50;				
				        
    current_angle[0]=PID_calc(&PID_angle[0],motor_data[0].speed_rpm,set_angle[0]); 
				 
    current_angle[1]=PID_calc(&PID_angle[1],motor_data[1].speed_rpm,set_angle[1]); 
				 
    current_angle[2]=PID_calc(&PID_angle[2],motor_data[2].speed_rpm,set_angle[2]); 
				 
    current_angle[3]=PID_calc(&PID_angle[3],motor_data[3].speed_rpm,set_angle[3]); 			
				 
can_cmd_motor(&hcan1,0x200,current_angle[0],current_angle[1],current_angle[2],current_angle[3]);				
}
else if(INS_angle[0]<-2)//When INS_angle[0] is bigger than 0, spin left 
{
	set_angle[0]=INS_angle[0]*50;
	set_angle[1]=INS_angle[0]*50;
	set_angle[2]=INS_angle[0]*50;
	set_angle[3]=INS_angle[0]*50;				
	current_angle[0]=PID_calc(&PID_angle[0],motor_data[0].speed_rpm,-set_angle[0]); 
    current_angle[1]=PID_calc(&PID_angle[1],motor_data[1].speed_rpm,-set_angle[1]); 
	current_angle[2]=PID_calc(&PID_angle[2],motor_data[2].speed_rpm,-set_angle[2]); 
	current_angle[3]=PID_calc(&PID_angle[3],motor_data[3].spee
内容概要:本文详细介绍了一套基于STM32与MPU6050的自平衡小车系统设计方案,重点讲了卡尔曼滤波法在姿态中的应用,以及如何通过PID控制实现小车的动态平衡。系统采用STM32F103作为主控芯片,结合MPU6050六轴传感器进行姿态数据采集,利用卡尔曼滤波融合加速度计和陀螺仪数据,提升角度估精度,并通过多环PID控制器(角度环、速度环、转向环)实现精准运动控制。同时,系统集成编码器反馈、电机驱动、安全保护机制和实时监控功能,具备完整的闭环控制能力。文中还提供了硬件配置、各模块驱动代码实现及系统调试方法,具有很强的工程实践指导意义。; 适合人群:具备嵌入式C语言基础、熟悉STM32开发环境,对传感器融合与自动控制感兴趣的初学者或电子类专业学生,以及从事智能小车、机器人开发的工程师;特别适合有1-2年开发经验的技术人员进行项目实践与深入学习。; 使用场景及目标:①掌握卡尔曼滤波在姿态中的原理与代码实现;②理多环PID控制结构及其在平衡控制中的应用;③完成从传感器数据采集、滤波处理、控制法到电机驱动的完整闭环系统搭建;④应用于教学实验、课程设计、竞赛项目或科研原型开发。; 阅读建议:建议读者结合硬件平台边学边练,按照文档模块顺序逐步实现各功能单元,重点关注卡尔曼滤波与PID控制部分的代码逻辑与参数调优,同时利用提供的诊断函数进行系统调试,以加深对控制系统的整体理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值