轮毂电机参数辨识
模型设计
轮毂电机型号为MF9025,类型为直流无刷电机(BLDC),为了得到轮毂电机附带轮子包胶的转动惯量以及阻尼系数,构建对地面负载转矩的估算算法,故需要对轮子进行参数辨识。
电机运动方程为
$$
T_l - T_e = J \frac{d w_c}{dt} + B w_c
$$
其中$T_l$为电机输出转矩,$T_e$为负载转矩,J为轮子转动惯量,$w_c$为轮子运动角速度,B为运动阻尼系数。
将轮子腾空处理,认为$T_e = 0$
对方程两端进行拉普拉斯变换转换为频域有
$$
T_l(s) = JsW_c(s) + BW_c(s)
$$
即
$$
\frac{W_c(s)}{T_l(s)} = \frac{1}{Js + B}
$$
使用以下代码记录每一次的反馈力矩以及反馈角速度,并使用Ozone(或者Jscope)导出对应的数据(w,T),注意发送力矩时,由于是空载,不要输入过大的力矩,否则会使转速达到最大导致饱和。
t_ = GetDeltaTtoNow(&last_cnt);
wheels_torque[identify_id] = 0.25f * arm_sin_f32(t_);
//更新w,T信息反馈
for (int i = 0; i < 2; i++)
{
w[i + 1] = w[i];
T[i + 1] = T[i];
}
w[0] = Wheels_Motor.decoded_msgs[identify_id].rotate_speed;
T[0] = Wheels_Motor.decoded_msgs[identify_id].current * MF9025_TORQUE_CURRENT_RATIO;
WheelCurrentPack(&wheels, wheels_torque);
WheelCanSend(&wheels);
Ozone导出来的数据是以分号分隔的数据,故需要对数据进行分割,可使用数据栏中的分列功能实现数据分离。
最终生成的数据如下图所示:
打开Matlab,利用以下语句读取csv文件
csvread('1.csv',1,0); % 1,0 表示从第二行第一列开始读
打开System Identification工具箱,导入输入变量与输出变量数据
导入后点击Time plot可以看到导入的数据
在operation - select range 中,将数据集划分为训练集和测试集(图中绿色为训练集,红色为测试集)
仅将测试集点亮,点击estimate,选择传递函数进行参数辨识,由需要辨识的传递函数的形式,将极点数设置为1,零点数设置为0.
最终拟合度为88.56%,一般大于85%认为拟合有效
将测试集拉入validation Data中,点击Model output可以看到测试集和拟合模型的比较关系。
最终传递函数为
$$
\frac{W_c(s)}{T_l(s)} = \frac{1}{\frac{1}{2750}s + \frac{10.67}{2750}}
$$
故
$$
J = \frac{1}{2750} = 0.0003636
$$
$$
B = \frac{10.67}{2750} = 0.00388
$$
负载转矩实时估算
由
$$
T_l - T_e = J \frac{d w_c}{dt} + B w_c
$$
可得
$$
T_e = T_l - J \frac{d w_c}{dt} - B w_c
$$
当估计负载转矩小于一定阈值时,认为轮子腾空或者打滑,此时应让轮子停转。
$$
T_e < \epsilon
$$