匿名飞控STM32版代码整理之Ano_Imu.c

2023-05-16

一、ANO_Imu.c文件
/******************** © COPYRIGHT 2016 ANO Tech ***************************

  • 作者 :匿名科创
  • 文件名 :ANO_IMU.c
  • 描述 :姿态解算函数
  • 官网 :www.anotc.com
  • 淘宝 :anotc.taobao.com
  • 技术Q群 :190169595
    *****************************************************************************/
    #include “Ano_Imu.h”
    #include “Ano_Math.h”
    #include “Ano_Filter.h”
    #include “Ano_DT.h”
    //#include “ANO_RC.h”

//世界坐标平面XY转平面航向坐标XY
void w2h_2d_trans(float w[VEC_XYZ],float ref_ax[VEC_XYZ],float h[VEC_XYZ])
{
h[X] = w[X] * ref_ax[X] + w[Y] *ref_ax[Y];
h[Y] = w[X] *(-ref_ax[Y]) + w[Y] *ref_ax[X];

}
//平面航向坐标XY转世界坐标平面XY
void h2w_2d_trans(float h[VEC_XYZ],float ref_ax[VEC_XYZ],float w[VEC_XYZ])
{
w[X] = h[X] *ref_ax[X] + h[Y] *(-ref_ax[Y]);
w[Y] = h[X] *ref_ax[Y] + h[Y] * ref_ax[X];

}

//载体坐标 转 世界坐标(ANO约定等同与地理坐标)
float att_matrix[3][3]; //必须由姿态解算算出该矩阵
void a2w_3d_trans(float a[VEC_XYZ],float w[VEC_XYZ])
{
for(u8 i = 0;i<3;i++)
{
float temp = 0;
for(u8 j = 0;j<3;j++)
{

			temp += a[j] *att_matrix[i][j];
		}
		w[i] = temp;
	}

}

//float mag_yaw_calculate(float dT,float mag_val[VEC_XYZ],float g_z_vec[VEC_XYZ],float h_mag_val[VEC_XYZ])//
//{

// vec_3dh_transition(g_z_vec, mag_val, h_mag_val);

// return (fast_atan2(h_mag_val[Y], h_mag_val[X]) *57.3f) ;//
//}

#define USE_MAG
#define USE_LENGTH_LIM

static float vec_err[VEC_XYZ];
static float vec_err_i[VEC_XYZ];
static float q0q1,q0q2,q1q1,q1q3,q2q2,q2q3,q3q3,q1q2,q0q3;//q0q0,
static float mag_yaw_err,mag_err_dot_prudoct,mag_val_f[VEC_XYZ];
static float imu_reset_val;

static u16 reset_cnt;

_imu_st imu_data = {1,0,0,0,//单位四元数
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
0,0,0};

_imu_state_st imu_state = {1,1,1,1,1,1,1,1};//状态结构体:陀螺仪的p、i,磁力计的p obs_en等等

static float mag_2d_w_vec[2][2] = {{1,0},{1,0}};//地理坐标中,水平面磁场方向恒为南北 (1,0) mag_2d_w_vec[0][0]={1,0} mag_2d_w_vec[0][1]={1,0}

float imu_test[3];

//在文件Ano_FlightDataCal.c被调用

//惯性测量单元数据更新(惯性测量单元:陀螺仪、加速度计、磁力计)

//dT:采样周期 *state:imu(惯性测量单元)状态结构体指针(实际传入的是&imu_state)
//gyr[VEC_XYZ]:陀螺仪xyz方向的数据 acc[VEC_XYZ]:加速度计xyz方向的数据
//mag_val[VEC_XYZ]:磁力计xyz方向的数据 *imu:imu结构体指针(实际传入的是&imu_data)

//姿态更新
void IMU_update(float dT,_imu_state_st *state,float gyr[VEC_XYZ], s32 acc[VEC_XYZ],s16 mag_val[VEC_XYZ],_imu_st *imu)
{
// const float kp = 0.2f,ki = 0.001f;
// const float kmp = 0.1f;

static float kp_use = 0,ki_use = 0,mkp_use = 0;

float acc_norm_l,acc_norm_l_recip,q_norm_l;
	
float acc_norm[VEC_XYZ];

float d_angle[VEC_XYZ];

// q0q0 = imu->w * imu->w;

	q0q1 = imu->w * imu->x;
	q0q2 = imu->w * imu->y;
	q1q1 = imu->x * imu->x;
	q1q3 = imu->x * imu->z;
	q2q2 = imu->y * imu->y;
	q2q3 = imu->y * imu->z;
	q3q3 = imu->z * imu->z;
	q1q2 = imu->x * imu->y;
	q0q3 = imu->w * imu->z;

//obs_en始终为0---------------------obs机体-----------------------------------------------------
	if(state->obs_en)
	{
		//计算机体坐标下的运动加速度观测量。坐标系为北西天
		for(u8 i = 0;i<3;i++)
		{
			s32 temp = 0;
			for(u8 j = 0;j<3;j++)
			{
				
				temp += imu->obs_acc_w[j] * att_matrix[j][i];//t[i][j] 转置为 t[j][i]
			}
			imu->obs_acc_a[i] = temp;//机体坐标系下的IMU  acc_a[i]的值
			
			imu->gra_acc[i] = acc[i] - imu->obs_acc_a[i]; // 地理坐标系下的 acc[i]=加速度计测量的值 - 机体坐标系下的值
		}
	}
	//只执行下面的----------------------------------------------------------------------
	else
	{
		for(u8 i = 0;i<3;i++)
		{			
			imu->gra_acc[i] = acc[i];//把加速度计的测量值保存在指针里面gra_acc
			//%%%地理坐标系下的加速度值等于加速度计测量的加速度值
		}
	}
//把加速度计的测量值平方和再开根号,再倒数,并保存
	acc_norm_l_recip = my_sqrt_reciprocal(my_pow(imu->gra_acc[X]) + my_pow(imu->gra_acc[Y]) + my_pow(imu->gra_acc[Z]));
	
	acc_norm_l = safe_div(1,acc_norm_l_recip,0);//再求倒数--->结果就是加速度计的测量值的平方和开根号
	
	// 加速度计的读数,单位化。
	for(u8 i = 0;i<3;i++)
	{ 
		acc_norm[i] = imu->gra_acc[i] *acc_norm_l_recip;
	}

	

	
// 载体坐标下的x方向向量,单位化---->  单位化的旋转矩阵Rcb 与向量(1 0 0)的转置  相乘的结果
att_matrix[0][0] = imu->x_vec[X] = 1 - (2*q2q2 + 2*q3q3);
att_matrix[0][1] = imu->x_vec[Y] = 2*q1q2 - 2*q0q3;
att_matrix[0][2] = imu->x_vec[Z] = 2*q1q3 + 2*q0q2;
	
// 载体坐标下的y方向向量,单位----->单位化的旋转矩阵Rcb 与向量(0 1 0)的转置  相乘的结果
att_matrix[1][0] = imu->y_vec[X] = 2*q1q2 + 2*q0q3;
att_matrix[1][1] = imu->y_vec[Y] = 1 - (2*q1q1 + 2*q3q3);
att_matrix[1][2] = imu->y_vec[Z] = 2*q2q3 - 2*q0q1;
	
// 载体坐标下的z方向向量(等效重力向量、重力加速度向量),单位化。---->单位化的旋转矩阵Rcb 与向量(0 0 1)的转置  相乘的结果
att_matrix[2][0] = imu->z_vec[X] = 2*q1q3 - 2*q0q2;
att_matrix[2][1] = imu->z_vec[Y] = 2*q2q3 + 2*q0q1;
att_matrix[2][2] = imu->z_vec[Z] = 1 - (2*q1q1 + 2*q2q2);
	
	//以上就把旋转矩阵求解出来了att_matrix[][]
	
//水平面方向单位向量   将水平坐标系的x,y平方和,开根号 并求倒数   reciprocal:倒数的
float hx_vec_reci = my_sqrt_reciprocal(my_pow(att_matrix[0][0]) + my_pow(att_matrix[1][0]));
imu->hx_vec[X] = att_matrix[0][0] *hx_vec_reci;
imu->hx_vec[Y] = att_matrix[1][0] *hx_vec_reci;

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

// 计算载体坐标下的运动加速度。
	for(u8 i = 0;i<3;i++)
	{
		imu->a_acc[i] = (s32)(acc[i] - 981 * imu->z_vec[i]);//将加速度计测量的数据减去(载体坐标系下)z轴方向向量
		
		//载体坐标系下的加速度 = 加速度计测量的加速度值 - 载体重力加速度在Z轴上的分量
	}
	

	//计算世界坐标下的运动加速度。坐标系为北西天-----------------原理就是:旋转矩阵(机体转世界)乘上机体下的加速度
	for(u8 i = 0;i<3;i++)
	{
		s32 temp = 0;
		for(u8 j = 0;j<3;j++)
		{
			
			temp += imu->a_acc[j] *att_matrix[i][j];//
		}
		imu->w_acc[i] = temp; //世界坐标系下的加速度值
	}
	
	w2h_2d_trans(imu->w_acc,imu_data.hx_vec,imu->h_acc);//将世界坐标系的运动加速度转换成水平面的运动加速度---------这是作甚么
	
	
// >>>>>>>>>>>>>>> 加速度计读取的单位方向 与 重力加速度单位方向的差值 = 两个方向的叉乘<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	
vec_err[X] =  (acc_norm[Y] * imu->z_vec[Z] - imu->z_vec[Y] * acc_norm[Z]);
vec_err[Y] = -(acc_norm[X] * imu->z_vec[Z] - imu->z_vec[X] * acc_norm[Z]);
vec_err[Z] = -(acc_norm[Y] * imu->z_vec[X] - imu->z_vec[Y] * acc_norm[X]);

#ifdef USE_MAG

	//电子罗盘赋值为float矢量
	for(u8 i = 0;i<3;i++)
	{
		mag_val_f[i] = (float)mag_val[i];
	}	
		
	if(!(mag_val[X] ==0 && mag_val[Y] == 0 && mag_val[Z] == 0))//当磁力计的三维坐标有值时,就开始对磁力计的数据进行处理
	{
		//把载体坐标下的罗盘数据转换到世界坐标系下
		a2w_3d_trans(mag_val_f,imu->w_mag);
		
		//将磁力计数据 平方和->开根号->倒数   
		float l_re_tmp = my_sqrt_reciprocal(my_pow(imu->w_mag[0]) + my_pow(imu->w_mag[1]));
		
		//将磁力计的数值归一化成方向向量   
		mag_2d_w_vec[1][0] = imu->w_mag[0] * l_re_tmp;//
		mag_2d_w_vec[1][1] = imu->w_mag[1] * l_re_tmp;
		
		//计算南北朝向方向向量的误差,地理坐标中,水平面磁场方向向量应恒为南北 (1,0)
		//mag_2d_w_vec[1]:磁力计的测量数据归一化后的值-----实际值
		//mag_2d_w_vec[0]:(1,0)----------------------------理论值
		
		//两者叉乘可以得出磁力计数据的方向与实际方向的偏差----------------偏差值
		
		mag_yaw_err = vec_2_cross_product(mag_2d_w_vec[1],mag_2d_w_vec[0]);
		
		//计算南北朝向向量点乘,判断同向或反向
		mag_err_dot_prudoct = vec_2_dot_product(mag_2d_w_vec[1],mag_2d_w_vec[0]);
		
		//若反向,直接给最大误差
		if(mag_err_dot_prudoct<0)
		{
			mag_yaw_err = my_sign(mag_yaw_err) *1.0f;//最大误差是1
		}			
		//
		
	}

#endif

	for(u8 i = 0;i<3;i++)
	{

//没有定义USE_EST_DEADZONE
#ifdef USE_EST_DEADZONE //故不进来
if(state->G_reset == 0 && state->obs_en == 0)
{
vec_err[i] = my_deadzone(vec_err[i],0,imu->gacc_deadzone[i]);
}
#endif
//定义了USE_LENGTH_LIM

#ifdef USE_LENGTH_LIM //限幅

		if(acc_norm_l>1060 || acc_norm_l<900)//当加速度值过大或者过小,就忽略加速度计的误差,即设为0
		{
			vec_err[X] = vec_err[Y] = vec_err[Z] = 0;
		}

#endif

		//误差积分
	vec_err_i[i] +=  LIMIT(vec_err[i],-0.1f,0.1f) *dT *ki_use;//加速度计的误差累计,且乘上了积分常数

	
// 构造增量旋转(含融合纠正)。	 
//    d_angle[X] = (gyr[X] + (vec_err[X]  + vec_err_i[X]) * kp_use - mag_yaw_err *imu->z_vec[X] *kmp_use *RAD_PER_DEG) * dT / 2 ;
//    d_angle[Y] = (gyr[Y] + (vec_err[Y]  + vec_err_i[Y]) * kp_use - mag_yaw_err *imu->z_vec[Y] *kmp_use *RAD_PER_DEG) * dT / 2 ;
//    d_angle[Z] = (gyr[Z] + (vec_err[Z]  + vec_err_i[Z]) * kp_use - mag_yaw_err *imu->z_vec[Z] *kmp_use *RAD_PER_DEG) * dT / 2 ;

#ifdef USE_MAG
//用叉积误差来做PI修正陀螺仪零偏,即抵消陀螺仪读数中的偏移量
//用加速度计方向的偏差PI 和 磁力计偏航方向的偏差P 来修正陀螺仪的角速度 = d_angle[i]
d_angle[i] = (gyr[i] + (vec_err[i] + vec_err_i[i]) * kp_use + mag_yaw_err *imu->z_vec[i] *mkp_use) * dT / 2 ;
#else
d_angle[i] = (gyr[i] + (vec_err[i] + vec_err_i[i]) * kp_use ) * dT / 2 ; //不进入这里
#endif
}

//*********************************** 姿态更新 *********************************************************************
	
	//基于四元数的姿态解算的互补滤波算法
imu->w = imu->w            - imu->x*d_angle[X] - imu->y*d_angle[Y] - imu->z*d_angle[Z];
imu->x = imu->w*d_angle[X] + imu->x            + imu->y*d_angle[Z] - imu->z*d_angle[Y];
imu->y = imu->w*d_angle[Y] - imu->x*d_angle[Z] + imu->y            + imu->z*d_angle[X];
imu->z = imu->w*d_angle[Z] + imu->x*d_angle[Y] - imu->y*d_angle[X] + imu->z;
	
	//四元数规范化(单位化)
	q_norm_l = my_sqrt_reciprocal(imu->w*imu->w + imu->x*imu->x + imu->y*imu->y + imu->z*imu->z);
imu->w *= q_norm_l;
imu->x *= q_norm_l;
imu->y *= q_norm_l;
imu->z *= q_norm_l;
	
	//*********************************** 更新结束 ***********************************************************************  

/修正开关 正常情况下各个修正开关都是打开的,在开头可以看出///
#ifdef USE_MAG
if(state->M_fix_en==0)//磁力计修正开关=0
{
mkp_use = 0;//比例P常数 = 0
state->M_reset = 0;//罗盘清除复位标记
}
else//磁力计修正开关=1
{
if(state->M_reset)//罗盘修正复位
{
//通过增量进行对准
mkp_use = 10.0f;//修正复位
if(mag_yaw_err != 0 && ABS(mag_yaw_err)<0.01f)
{
state->M_reset = 0;//误差小于2的时候,清除复位标记
}
}
else //罗盘修正不复位
{
mkp_use = state->mkp; //正常修正
}
}
#endif

	if(state->G_fix_en==0)//重力方向修正开关=0
	{
		kp_use = 0;//不修正
	}
	else
	{
		if(state->G_reset == 0)//正常修正
		{			
			kp_use = state->gkp;
			ki_use = state->gki;
		}
		else//快速修正,通过增量进行对准
		{
			kp_use = 10.0f;
			ki_use = 0.0f;

// imu->est_speed_w[X] = imu->est_speed_w[Y] = 0;
// imu->est_acc_w[X] = imu->est_acc_w[Y] = 0;
// imu->est_acc_h[X] = imu->est_acc_h[Y] =0;

			//计算静态误差是否缩小

// imu_reset_val += (ABS(vec_err[X]) + ABS(vec_err[Y])) *1000 *dT;
// imu_reset_val -= 0.01f;
imu_reset_val = (ABS(vec_err[X]) + ABS(vec_err[Y]));

			imu_reset_val = LIMIT(imu_reset_val,0,1.0f);
			
			if((imu_reset_val < 0.02f) && (state->M_reset == 0))//加速度计水平误差绝对值之和过小,且磁力计的修正开关=0---------相当于重力修正开关没必要打开
			{
				//计时							
				reset_cnt += 2;
				if(reset_cnt>400)//如果计时到了一定值,效果还是很好并且磁力计修正开关关掉时,那就不用重力修正了
				{									//如果加速度计的误差小,但是磁力计的修正开关还是打开的,那重力修正开关就会继续打开
					reset_cnt = 0;
					state->G_reset = 0;//已经对准,清除复位标记
				}
			}
			else
			{
				reset_cnt = 0;
			}
		}
	}

}

static float t_temp;
//计算欧拉角
void calculate_RPY()
{
///输出姿态角///

	t_temp = LIMIT(1 - my_pow(att_matrix[2][0]),0,1);
	
	//imu_data.pit = asin(2*q1q3 - 2*q0q2)*57.30f;

	if(ABS(imu_data.z_vec[Z])>0.05f)//避免奇点的运算
	{
		imu_data.pit =  fast_atan2(att_matrix[2][0],my_sqrt(t_temp))*57.30f;
		imu_data.rol =  fast_atan2(att_matrix[2][1], att_matrix[2][2])*57.30f; 
		imu_data.yaw = -fast_atan2(att_matrix[1][0], att_matrix[0][0])*57.30f; 
	}

}

总结:该文件就只做了两件事:1、姿态更新 2、将姿态阵解算出姿态角
具体说明:
1、姿态更新
首先我们可以通过参考书知道姿态更新的方程式,就是与角速度有关。
对于角速度的测量主要依靠陀螺仪的数据,但它是有误差的,在这段代码中使用了加速度计和磁力计来修正陀螺仪的误差。修正完后根据更新式求出更新后的姿态阵。
2、由姿态阵解算出姿态角,可以直接根据公式求解出。

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

匿名飞控STM32版代码整理之Ano_Imu.c 的相关文章

  • Python 通过ImageDraw.rectangle 画矩形框

    目录 1 函数讲解2 示例代码3 补充cv2 rectangle 1 函数讲解 源代码如下 xff1a ImageDraw rectangle xy fill 61 None outline 61 None width 61 1 主要的参数
  • 基于迁移深度学习的遥感图像场景分类

    前述 根据语义特征对遥感图像场景进行分类是一项具有挑战性的任务 因为遥感图像场景的类内变化较大 xff0c 而类间变化有时却较小 不同的物体会以不同的尺度和方向出现在同一类场景中 xff0c 而同样的物体也可能出现在不同的场景里 理论上 x
  • reStructuredText文档图片表格等自动编号以及名称修改

    number figures 61 True numfig 61 True numfig secnum depth 61 1 numfig format 61 39 figure 39 39 图 s 39 39 code block 39
  • Robocup 2D仿真足球机器人环境搭建(Ubuntu 16.04)

    现在很多高校的学生都在搞RoboCup2D仿真足球机器人 xff0c 而平台的搭建便是一大问题 本人也在搭建环境中遇到各种奇奇怪怪的问题 xff0c 有些找了许多网页 xff0c 下面是我对环境搭建 中遇到的问题以及解决方法的总结 希望能帮
  • Robocup 2D仿真足球机器人环境搭建快速搭建

    虽然之前已经写了Robocup 2D仿真足球机器人环境搭建 xff0c 但是后面我找到了更快搭建环境的方法 而且现在很多团队都是在agent底层代码的基础上编写的 之前的方法配置的环境运行agent球队代码会出现错误 通过找资料得知是有些软
  • Robocup 2D新手导读(入门总结)

    目前 xff0c 我们团队接触Robocup 2D比赛也有好几个月了 xff0c 不得不说 这个比赛也有一定难度 尤其是对于第一次接触这个比赛的我们来 说 下面是我的一些总结 xff0c 希望能够帮助你们 1 Robocup 2D的比赛基本
  • Robocup 2D比赛代码导读(agent底层代码指导)

    相信刚开始接触Robocup 2D比赛的萌新 xff0c 都清楚agent的代码看起来是很痛苦的 xff0c 而且不知道从何看起 我个人观点看代码先看bhv和role这部分的代码 bhv行为动作的类的代码涉及到球员的进攻 跑位 防守 铲球等
  • python爬虫接单-资料总结

    相信看到我这篇文章的朋友们 xff0c 都是奔着赚钱来的 当初我也是冲着爬虫接单 可以赚钱 xff0c 一下就报了个将近3000元的爬虫班 python爬虫确实可以接单赚钱 后来学会了之后就迫不及待地加入了接单行列 也确实赚了一些 希望这篇
  • 爬虫Scrapy框架的介绍与使用

    Scrapy Scrapy介绍 爬取网站数据 xff0c 提取结构数据而编写的爬虫应用框架 Scrapy工作流程图 Scrapy命令 span class token number 1 span 创建Scrapy项目 scrapy star
  • 太难为我了,为了这份P7岗offer,我承受了7轮面试

    前言 今年的大环境非常差 xff0c 互联网企业裁员的现象比往年更严重了 xff0c 可今年刚好是我的第一个 五年计划 截止的时间点 xff0c 说什么也不能够耽搁了 xff0c 所以早早准备的跳槽也在疫情好转之后开始进行了 但是 xff0
  • 云计算与大数据概论第五周

    对于 大数据 xff08 Big data xff09 研究机构Gartner给出了这样的定义 大数据 是需要新处理模式才能具有更强的决策力 洞察发现力和流程优化能力来适应海量 高增长率和多样化的信息资产 麦肯锡全球研究所给出的定义是 xf
  • 【hadoop_读写流程】

    14 hadoop 补充 xff1a 解决 linux 网卡丢失问题 xff1a service NetworkManager stop chkconfig NetworkManager off 重启网络 systemctl restart
  • 半监督学习

    半监督学习 xff1a 在训练阶段结合了大量未标记的数据和少量标签数据 与使用所有标签数据的模型相比 xff0c 使用训练集的训练模型在训练时更为准确 xff0c 而且训练成本更低 如何综合利用已标签例子和未标签例子 xff0c 是半监督学
  • [控制原理基础]浅谈PID算法

    一 PID使用背景 当今的自动控制技术都是基于反馈的概念 即一个In Loop闭环的理论 xff0c 反馈理论的要素包括三个部分 xff1a 测量 比较和执行 测量关心的变量 xff0c 与期望值相比较 xff0c 用这个误差纠正调节控制系
  • 解决Github下载慢的问题!

    从GitHub上下载文件对于国内的我们简直太痛苦了 xff0c 下载了半天稳定在了8kb s 于是我开始寻找解决的方法 xff0c 最开是的方法是去查github com网站的IP xff0c 然后将IP添加到hosts文件里 xff0c
  • [Pix:地面站Mission Planner常见故障和处理方法]

    连接飞控的MP软件以后 xff0c 观察飞行数据界面 xff08 简称HUD xff09 以下为常见错误 xff1a RC not calibrated 未校正遥控器 xff0c 需要校正遥控器Compass not calibrated
  • Pixhawk指示灯的含义

    飞控的指示灯含义 xff1a 红灯与蓝灯交替闪烁 xff1a 系统初始化蓝灯闪烁 xff1a 飞控锁定状态 xff0c GPS正在搜星状态 黄灯连闪两次 xff1a 系统拒绝解锁 xff0c 提示错误 绿灯闪烁 xff1a 飞控锁定状态 x
  • 转载:Pixhawk无人机扩展教程--树莓派安装Dronekit及读取飞控数据

    寻找了一段时间 xff0c 发现Dronekit Python可以实现脱离遥控器来控制无人机 xff0c 找到了一些较好的教程 xff0c 但是中间也踩了一些坑 先转载一下教程 xff0c 遇到的哪些坑以后再写 这里
  • 转载:Pixhawk无人机扩展教程--使用Dronekit编写一个控制程序

    跳转 xff1a 详细教程
  • SQL执行错误#1251.从数据库的响应:

    问题 xff1a 使用 MySQL Font 连接数据库时 xff0c 显示如下错误 xff1a 解决方法 xff1a 使用管理员身份运行命令提示符 xff08 win 43 R 然后输入 cmd xff0c 进入到MySQL的bin目录中

随机推荐

  • 使用 Whisper AI 领先游戏:最佳和免费的语音到文本 AI

    Whisper AI 是一种语音识别和转录软件 xff0c 它使用人工智能 AI 将口头语言转换为书面文本 它旨在通过消除手动转录语音内容的需要来帮助个人和企业节省时间并提高工作效率 在下文中 xff0c 您将学习如何使用 Whisper
  • ROS的卸载与安装【血泪总结!亲测有效】

    前言 xff1a 每一版ROS都有其对应版本的Ubuntu版本 xff0c 切记不可随便装 查看ubuntu版本 xff1a 在命令行输入lsb release a 本文以Ubuntu18 04 xff0c 安装ROS melodic版本为
  • 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了 xff0c 各种的期末大作业 xff0c 后台管理也是很多地方需要用到的 xff0c 为了方便大家能快速上手 xff0c 快速搭建一个简单的后台管理 xff0c 我花了两天时间整理了一下 我会从0开始介绍 xff0c 从
  • 深度学习在遥感图像场景分类中的4种应用方式

    1 Directly using the features extracted from the pretrained CNNs 直接利用matconvnet工具箱中的在Imagnet数据集上训练好的各种深度学习网路模型 xff08 全连接
  • CentOs(Linux) 中 使用Prometheus 监控 k8s集群(集群部署)

    CentOs Linux 中 使用Prometheus 监控 k8s集群 xff08 集群部署 xff09 一 master node节点环境部署 所有node节点下载监控所需镜像 span class token comment dock
  • STM32好找工作,所以学linux终究是错付了吗?

    01 话 题 经常有大学生同学纠结 xff1a 我到底是学STM32还是学嵌入式linux 这个问题很多人都会有自己的看法 xff0c 今天我试着从多个角度 xff0c 把我了解到的事实讲一下 xff0c 希望对大家有所启发 STM32 0
  • http请求返回405 (Method Not Allowed)

    一 问题描述 使用post请求json文件中的数据时 xff0c 返回报错405 Method Not Allowed 二 解决方法 由post请求改为get请求 xff0c 请求静态资源时用get请求 xff1b 原因 xff1a 使用p
  • python一次替换多个字符串

    https blog csdn net liuchengzimozigreat article details 85339372 utm medium 61 distribute pc relevant none task blog Blo
  • JavaScript中获取对象属性的几种方法举例及其说明

    首先我们有这样一个对象 xff1a span class token keyword var span o span class token operator 61 span span class token punctuation spa
  • 【国信长天蓝桥杯】⑤ STM32G431 UART串口收发数据,串口通信示例代码,串口使用步骤,printf重定向

    摘要 本文章基于国信长天M4开发板 xff0c 讲述了STM32G431 串口通信的使用步骤 xff0c 希望对大家有帮助 M4开发板 串口引脚 由上图可以看出 xff0c DAP Link的串口连接在芯片的PA9和PA10引脚 查阅芯片资
  • 基于神经网络的Matlab车牌识别设计

    基于神经网络的Matlab车牌识别设计 1 题目的主要研究内容2 流程介绍3 详细介绍3 1 图像预处理3 2 车牌预处理3 3 字符分割3 4 车牌识别 4 识别结果 1 题目的主要研究内容 使用MATLAB将采集到的图像信息读入 xff
  • 网络编程--01--socket简介--套接字

    socket 套接字 什么是Socket 在计算机通信领域 xff0c socket 被翻译为 套接字 xff0c 它是计算机之间进行通信的一种约定或一种方式 通过 socket 这种约定 xff0c 一台计算机可以接收其他计算机的数据 x
  • 使用strtok函数和split函数来分割字符串

    使用 strtok 函数可以比较方便地实现字符串分割 具体来说 xff0c 可以将 strtok 函数看作一个状态机 xff0c 它会记录当前扫描到的字符串位置 xff0c 并根据指定的分隔符将其分割成多个子字符串 xff0c 并返回分割后
  • vagrant安装docker

    卸载系统之前的docker sudo yum remove docker docker client docker client latest docker common docker latest docker latest logrot
  • 图像识别的未来:机遇与挑战并存

    识别图像对人类来说是件极容易的事情 xff0c 但是对机器而言 xff0c 这也经历了漫长岁月 在计算机视觉领域 xff0c 图像识别这几年的发展突飞猛进 例如 xff0c 在PASCAL VOC物体检测基准测试中 xff0c 检测器的性能
  • 在Ubuntu中通过CV_bridge更改OpenCV版本

    由于最近一个demo使用的OpenCV版本高于Ubuntu1804melodic自带的OpenCV3 2版本 xff0c 需要调节OpenCV的版本 1 安装OpenCV 下载地址 xff1a Releases OpenCV选择自己需要的版
  • LQR控制算法的浅析

    目录 前言 一 知识点补充 1 拉格朗日乘子法 2 积分中值定理 3 向前欧拉法 xff0c 向后欧拉法 xff0c 中点欧拉法 4 向量的导数 5 矩阵求逆引理 记住就好 xff0c 推导见链接 二 连续时间下的LQR推导 1 系统状态方
  • Linux网络编程【UDP】

    文章目录 UDP C S 通信TCP和UDP对C S 通信相关函数recvfrom xff08 accept 43 read xff09 sendto xff08 connect 43 write xff09 bind UDP 服务代码参考
  • C语言结构体对齐

    计算机内存是以字节 xff08 Byte xff09 为单位划分的 xff0c 理论上CPU可以访问任意编号的字节 xff0c 但实际情况并非如此 cpu一次能读取多少内存要看数据总线是多少位 xff0c 如果是16位 xff0c 则一次只
  • 匿名飞控STM32版代码整理之Ano_Imu.c

    一 ANO Imu c文件 COPYRIGHT 2016 ANO Tech 作者 xff1a 匿名科创文件名 xff1a ANO IMU c描述 xff1a 姿态解算函数官网 xff1a www anotc com淘宝 xff1a anot