轮毂电机参数辨识


轮毂电机参数辨识

模型设计

轮毂电机型号为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
$$


文章作者: 闲梦溪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 闲梦溪 !