四轴飞控总结2:结构体与数据类型2

//LSM6DSL
void processlsm6dslAccGyro(const uint8_t *buffer)
{

	int16_t gx1 = (((int16_t) buffer[1]) << 8) | buffer[0];
	int16_t gy1 = -((((int16_t) buffer[3]) << 8) | buffer[2]);
	int16_t gz1 = (((int16_t) buffer[5]) << 8) | buffer[4];
	int16_t ax1 = (((int16_t) buffer[7]) << 8) | buffer[6];
	int16_t ay1 = -((((int16_t) buffer[9]) << 8) | buffer[8]);
	int16_t az1 = (((int16_t) buffer[11]) << 8) | buffer[10];
	

	
	accRaw1.x = ax1;/*用于传到上位机*/
	accRaw1.y = ay1;
	accRaw1.z = az1;
	gyroRaw1.x = gx1;
	gyroRaw1.y = gy1;
	gyroRaw1.z = gz1;
	
	gyroBiasFound1 = processGyroBias1(gx1, gy1, gz1, &gyroBias1);
	
	if (gyroBiasFound1)
	{
		processAccScale(ax1, ay1, az1);	
		
	}
	
	sensors1.gyro.x = -(gx1 - gyroBias1.x)* SENSORS_DEG_PER_LSB_CFG_LSM;	
	sensors1.gyro.y =  (gy1 - gyroBias1.y)* SENSORS_DEG_PER_LSB_CFG_LSM;
	sensors1.gyro.z =  (gz1 - gyroBias1.z)* SENSORS_DEG_PER_LSB_CFG_LSM;

	applyAxis3fLpf(gyroLpf1, &sensors1.gyro);	

	sensors1.acc.x = -(ax1) * SENSORS_G_PER_LSB_CFG / accScale;	/ g(9.8m/s^2)*/
	sensors1.acc.y =  (ay1) * SENSORS_G_PER_LSB_CFG / accScale;	
	sensors1.acc.z =  (az1) * SENSORS_G_PER_LSB_CFG / accScale;

	applyAxis3fLpf(accLpf1, &sensors1.acc);
	
	LDS_a[0] = accRaw1.x;
	LDS_a[1] = accRaw1.y;
	LDS_a[2] = accRaw1.z;
	
	LDS_g[0] = gyroRaw1.x;
    LDS_g[1] = gyroRaw1.y;
	LDS_g[2] = gyroRaw1.z;
}

 sensors1.gyro.x 
 sensors1.gyro.y 
 sensors1.gyro.z

QUESTION:

LSM6DSL

sensors1.gyro.x 
sensors1.gyro.y 
sensors1.gyro.z出来的数据不对

思考:sensors1.gyro.x与(gx1 - gyroBias1.x)有关,实时值正确,说明gyroBias1.x有问题。

gyroBias1.x是由

gyroBiasFound = processGyroBias(gx, gy, gz, &gyroBias);

//计算陀螺方差得出的。

进入的值为gyro的实时值gyroRaw1,出来为结构体指针gyroBiasOut,

所以赋值为gyroBiasOut->x=(*gyroBiasOut).x。

static bool processGyroBias1(int16_t gx1, int16_t gy1, int16_t gz1, Axis3f *gyroBiasOut1)
{
	sensorsAddBiasValue(&gyroBiasRunning1, gx1, gy1, gz1);

	if (!gyroBiasRunning1.isBiasValueFound)
	{
		sensorsFindBiasValue1(&gyroBiasRunning1);
	}

	gyroBiasOut1->x = gyroBiasRunning.bias.x;
	gyroBiasOut1->y = gyroBiasRunning.bias.y;
	gyroBiasOut1->z = gyroBiasRunning.bias.z;

	return gyroBiasRunning1.isBiasValueFound;
}

processGyroBias()函数先进入sensorsAddBiasValue()

gx/gy/gz进入sensorsAddBiasValue(),将其值储存在指针Axis3i16*  bufHead中,并且累加。

如果bias储存在bufHead中的值大于1024个,那么buffer满了,重新计数。

static void sensorsAddBiasValue(BiasObj* bias, int16_t x, int16_t y, int16_t z)
{
	bias->bufHead->x = x;
	bias->bufHead->y = y;
	bias->bufHead->z = z;
	bias->bufHead++;

	if (bias->bufHead >= &bias->buffer[SENSORS_NBR_OF_BIAS_SAMPLES])
	{
		bias->bufHead = bias->buffer;
		bias->isBufferFilled = true;
	}
}

 如果gyroBiasRunning.isBiasValueFound没被找到,我们需要计算方差和平均值。sensorsFindBiasValue(&gyroBiasRunning);出来的是gyroBiasRunning.bais.x

来找出偏置值

static bool sensorsFindBiasValue1(BiasObj* bias)
{
	bool foundbias = false;

	if (bias->isBufferFilled)
	{
		
		Axis3f mean;
		Axis3f variance;
		sensorsCalculateVarianceAndMean1(bias, &variance, &mean);

		if (variance.x < GYRO_VARIANCE_BASE && variance.y < GYRO_VARIANCE_BASE && variance.z < GYRO_VARIANCE_BASE)
		{
			bias->bias.x = mean.x;
			bias->bias.y = mean.y;
			bias->bias.z = mean.z;
			foundbias = true;
			bias->isBiasValueFound= true;
		}else
			bias->isBufferFilled=false;
	}
	return foundbias;
}

//计算方差和平均值。 

sensorsCalculateVarianceAndMean(BiasObj* bias, Axis3f* varOut, Axis3f* meanOut)
进入的是gyroBiasRunning.bais.x,出来的是方差和平均值,看计算出来的方差是否小于40000,小于的话将平均值赋给gyroBiasRunning.bais.x,输出gyrobias(平均值)

int64_t sum[3] = {0};
int64_t sumsq[3] = {0};
static void sensorsCalculateVarianceAndMean1(BiasObj* bias1, Axis3f* varOut1, Axis3f* meanOut1)
{
	u32 i;
	//int64_t sum[3] = {0};
	//int64_t sumsq[3] = {0};

	for (i = 0; i < SENSORS_NBR_OF_BIAS_SAMPLES; i++)
	{
		sum1[0] += bias1->buffer[i].x;
		sum1[1] += bias1->buffer[i].y;
		sum1[2] += bias1->buffer[i].z;
		sumsq1[0] += bias1->buffer[i].x * bias1->buffer[i].x;
		sumsq1[1] += bias1->buffer[i].y * bias1->buffer[i].y;
		sumsq1[2] += bias1->buffer[i].z * bias1->buffer[i].z;
	}

	varOut1->x = (sumsq1[0] - ((int64_t)sum1[0] * sum1[0]) / SENSORS_NBR_OF_BIAS_SAMPLES);
	varOut1->y = (sumsq1[1] - ((int64_t)sum1[1] * sum1[1]) / SENSORS_NBR_OF_BIAS_SAMPLES);
	varOut1->z = (sumsq1[2] - ((int64_t)sum1[2] * sum1[2]) / SENSORS_NBR_OF_BIAS_SAMPLES);

	meanOut1->x = (float)sum1[0] / SENSORS_NBR_OF_BIAS_SAMPLES;
	meanOut1->y = (float)sum1[1] / SENSORS_NBR_OF_BIAS_SAMPLES;
	meanOut1->z = (float)sum1[2] / SENSORS_NBR_OF_BIAS_SAMPLES;
}

QUESTION :

1.是将int64_t sum[3] = {0};int64_t sumsq[3] = {0};定义成了全局变量的原因?

还是计算出的平均值方差混掉了?

答:gyro的数据混乱的原因是因为int64_t sum[3] = {0};int64_t sumsq[3] = {0};被定义成了全局变量,重复使用,导致计算的方差和平均值是错误的。

 

 

sum2方案

gyroBiasFound1 = processGyroBias1(gx1, gy1, gz1, &gyroBias1);//新 重新定义一个函数来找偏置

sensorsAddBiasValue(&gyroBiasRunning1, gx1, gy1, gz1);//不变 调用的sensorsAddBiasValue()不用变

sensorsFindBiasValue(&gyroBiasRunning1);

//不变 调用的sensorsFindBiasValue()不用变,直接使用

sensorsCalculateVarianceAndMean(bias, &variance, &mean);//不变

 

或者 

sum方案

gyroBiasFound1 = processGyroBias1(gx1, gy1, gz1, &gyroBias1);//新  重新定义一个函数来找偏置

sensorsAddBiasValue(&gyroBiasRunning1, gx1, gy1, gz1);//不变  调用的sensorsAddBiasValue()不用变

sensorsFindBiasValue1(&gyroBiasRunning1);//新   重新定义一个函数来找偏置,然后再重新定义函数找方差和平均值

sensorsCalculateVarianceAndMean1(bias, &variance, &mean);//新

2.我们将

static void sensorsCalculateVarianceAndMean1(BiasObj* bias1, Axis3f* varOut1, Axis3f* meanOut1)

改为

static void sensorsCalculateVarianceAndMean1(BiasObj* bias, Axis3f* varOut1, Axis3f* meanOut1)

可以输出对的数据吗?

答:不可以,在sum为全局变量的前提下必须重新定义一个bias1来区分进入函数的值。

3.将xxxx1()里的bias全部调用成bias1,是否依旧可以出来值?

答:可以,但是最复杂,没必要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值