电赛初体验:挑战、曲折与自省——2024TI杯省赛H题经历分享

机缘

       笔者队伍都是大一下,第一次参加电赛。在发布题目后,进入选题思考时间,一眼相中了控制类的三道题,小车成本最低,确定题目便开始搭建我们的小车,初期是构想是前轮舵机控制转向,两个编码电机辅助小车转向。 本文为记录,代码部分几乎没有,成功使用的代码会上传,当日记看分析错误,总结经验。

  1. 第一道题目在测试中出现的问题和解决思路
  2. 第二道题目在测试中出现的问题和解决思路
  3. 第三道题目在测试中出现的问题和解决思路
  4. 第四题没做  🙁
  5. 总结

   1.第一道题目在测试中出现的问题和解决思路

问题重述

地图为一个胶囊形,两端半圆实线,连接半圆的为空白所以半圆接空的为四个点顺时针方向分别为A,B,C,D。要求小车从A跑到B,并鸣响蜂鸣器。

问题分析及解决

我们小车使用的是红外传感器,识别到黑线巡线。没识别到线时,采用的办法是通过mpu6050获取当前角度,再通过舵机矫正车身,使其正对B点行驶。此处的我们遇到的难点,首先是mpu6050获取姿态的问题,第一次测试横滚和俯仰的读数正常,偏转角每次变化后的角度都和变化前的角度一样,移动角度过程中读数变化,却无法在变化后正确显示(第一次采用的方法是直接利用加速度计的读数来计算设备相对于水平面的倾斜角度。这种方法基于一个简单的物理原理:当设备静止或处于匀速直线运动时,加速度计测量到的是重力加速度在各个轴上的分量。)下述即第一次mpu6050所用的代码,后来分析是检测重力加速度在各轴上变化的分量,所以这个方法不能用。

#define MPU6050_ADDRESS		0xD0  



void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_ADDRESS);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(RegAddress);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(Data);
	MyI2C_ReceiveAck();
	MyI2C_Stop();
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_ADDRESS);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(RegAddress);
	                   
	MyI2C_ReceiveAck();
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);
	MyI2C_ReceiveAck();
	Data = MyI2C_ReceiveByte();
	MyI2C_SendAck(1);
	MyI2C_Stop();
	
	return Data;
}

float Mpu6050AccelAngle()
{
		uint8_t DataH, DataL;	
    float accel_agle; 
    float result;
		DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	  DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	  result = (DataH << 8) | DataL;
	  printf("%f,",result);
    //result = (float)MPU6050_ReadReg(dir); 
    accel_agle = (result + 378)/16384; 
    accel_agle = accel_agle*1.2*180/3.14;    
    
    return accel_agle; 
}

void MPU6050_Init(void)
{
	MyI2C_Init();
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);
}

uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}

void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t DataH, DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
}

第二次出现的问题是成功读取姿态,但初始值飘逸,启动初始化完成后,持续加到某个不固定的值后停止,此后(变化后角度-变化前角度)是正常的。但由于这个不固定的值会比较麻烦,我们的舵机转向是通过不断的测,不断地跑,调参使其稳定运行的,为调参的方便,希望找到办法使其初始读数就是0。期间尝试过给他在代码中手动偏移,外接key等待初始化完成读数稳定后手动修正角度使其归零。较为麻烦。后通过查询发现只需要在run_self_test中的地址改成0x03就能完成自检,初始化为0,也不再漂移数值。 这次使用的方法是解算MPU6050数值,通过读取加速度计和陀螺仪的原始数据再进行适当的缩放和转换。

至此姿态问题解决。

剩下的便是一次次测试小车在运行中的角度偏差,慢慢调参,四路红外,任何一路高电平触发后停车并触发蜂鸣器。

2.第二道题目在测试中出现的问题和解决思路

 问题重述

在同样的跑道下,跑过ABCD点,跑到D点时停下,每个点都触发蜂鸣器。

问题分析及解决

在解决本题时主要问题时在巡线转弯时小车的转弯半径过大,运行过程中会导致红外传感器在线外。第二个问题就是在第四个点时停车的逻辑。因为姿态的每个角度都是唯一确定的,通过事先确当小车在最后一个点的角度,并结合红外识别到黑线的模块,能保证最后一处同时满足两个条件停车。为了解决小车转弯半径过大,主要是通过一边电机停转,另一边输出,定轴转动。最后一个问题就是在巡线结束后,驶向D点之前的空白。要让小车尽可能走直线,巡线结束后,自动调整姿态。通过原地定轴调整后再根据提前测的角度进行判断和矫正。

3.第三道题目在测试中出现的问题和解决思路

问题重述

要求轨迹为A-C-B-D,即绕8字,在四点鸣响蜂鸣器,D点停下。

问题分析及解决

在解决该题时,场地无法使用,泡沫板打印的地图,红外传感器无法识别。只能识别黑胶带这种。致使后面在寝室铺设了一个一眼难尽的跑道附上贴图及视频

🙁

 


总结

第一次打电赛,见识到了自己的不足之处诸多,也更清晰明确了自己的进步方向,处理方法有很多,技术愈发局限,思路就越狭窄。

  1. 我认为可贵在这次圆滑处理巡线跑道的经验,调舵机,让舵机自己根据参数圆滑处理等方法可以记在记录中,以便将来参考
  2. 所谓无知者无畏,不是为了开脱,既然一无所知,那就多攒经验,在网络中找到不同的处理思路和方法来堵住自己的嘴。真想多看看其他佬的思路和代码(可以的话我们可以私聊交流)

作者:袋子lk

物联沃分享整理
物联沃-IOTWORD物联网 » 电赛初体验:挑战、曲折与自省——2024TI杯省赛H题经历分享

发表回复