首先将问题简化为二维平面倒立摆问题,以下为小车的模型图:
下面采用隔离法,分别对轮子部分及杆件部分进行分析,以下为轮子单独受力图:
以下为杆件单独受力图:
根据小车模型首先进行运动学分析,下面为轮子的速度分析:
对杆件速度分析有:
在进行加速度分析轮子有:
而杆件的加速度分析结果如下:
根据上面的分析结果列写方程如下:
V c x = V A − ω m l s i n θ V_{cx}=V_A-\omega _m l sin\theta Vcx=VA−ωmlsinθ
− ω m r = V A -\omega _m r =V_A −ωmr=VA
− d ω m d t r = d V A d t -\frac{d\omega _m}{dt} r =\frac{dV_A}{dt} −dtdωmr=dtdVA
根据小车模型受力图进行动力学分析,对轮子列写受力方程如下:
x : − f + F x ′ = M a A x:-f+F_x'=Ma_A x:−f+Fx′=MaA
y : N + F y ′ − M g = 0 y:N+F_y'-Mg=0 y:N+Fy′−Mg=0
对轮子列写力矩方程如下:
对A点:
r为轮子半径。
M M − f r = J M d ω M d t M_M-fr=J_M\frac{d\omega _M}{dt} MM−fr=JMdtdωM
对O点:
− F x ′ r + M M = J M d ω M d t -F_x'r+M_M=J_M\frac{d\omega_M}{dt} −Fx′r+MM=JMdtdωM
对杆件受力列写方程如下:
x : F x = m a C x = m d 2 x c d t 2 x:F_x=ma_{Cx}=m\frac{d^2x_c}{dt^2} x:Fx=maCx=mdt2d2xc
y : F y − m g = m a C y y:F_y-mg=ma_{Cy} y:Fy−mg=maCy
对杆件列写力矩方程如下:
对A点:
− m g l c o s θ = J m d ω m d t -mglcos\theta=Jm\frac{d\omega_m}{dt} −mglcosθ=Jmdtdωm
对C点:
F x l s i n θ − F y l c o s θ = J m d ω m d t F_xlsin\theta-F_ylcos\theta=J_m\frac{d\omega _m}{dt} Fxlsinθ−Fylcosθ=Jmdtdωm
另外由轮子与杆件之间的相互作用力有:
x : F x = − F x ′ x:F_x=-F_x' x:Fx=−Fx′
y : F y = − F y ′ y:F_y=-F_y' y:Fy=−Fy′
化简合并以上运动学、动力学方程有以下结果:
m d x c 2 d t 2 r + M M = − J M r d x A 2 d t 2 m\frac{dx_c^2}{dt^2}r+M_M=-\frac{J_M}{r}\frac{dx_A^2}{dt^2} mdt2dxc2r+MM=−rJMdt2dxA2
x c − x A = l c o s θ x_c-x_A=lcos\theta xc−xA=lcosθ
− m g l c o s θ = J m d θ 2 d t 2 -mglcos\theta=Jm\frac{d\theta^2}{dt^2} −mglcosθ=Jmdt2dθ2
以上结果使用进行线性化处理并拉式变换得到:
θ ( s ) U ( s ) = m g s 2 + J m l 2 − J M r 2 M g s 4 + l s 3 − s 2 − s \frac{\theta(s)}{U(s)}=\frac{mgs^2+\frac{J_m}{l^2}-\frac{J_M}{r^2}}{Mgs^4+ls^3-s^2-s} U(s)θ(s)=Mgs4+ls3−s2−smgs2+l2Jm−r2JM
实际系统测量参数为:
符号 | 物理意义 | 参数 |
---|---|---|
M | 轮子质量 | 1.215kg |
m | 杆件质量 | 0.403kg |
l | 轮子质心到杆件质心距离 | 3.24cm |
J_M | 轮子转动惯量 | 0.0023kg·m^2 |
J_m | 杆件转动惯量 | 0.0109kg·m^2 |
g | 当地重力加速度 | 9.8m/s^2 |
r | 轮子半径 | 5cm |
θ ( s ) U ( s ) = 3.95 s 2 + 9.46 11.91 s 4 + 3.24 s 3 − s 2 − s \frac{\theta(s)}{U(s)}=\frac{3.95s^2+9.46}{11.91s^4+3.24s^3-s^2-s} U(s)θ(s)=11.91s4+3.24s3−s2−s3.95s2+9.46
使用matlab的pzmap函数绘制原系统零极点如下:
可以看出以上系统不稳定所以需要设计PID控制器如下:
未调参时原系统阶跃响应:
调参后系统阶跃响应
可以看到系统经过PID调节后稳定,下面我们通过实物进一步验证我们的模型。
车体: 3mm层板
轮毂: 2mm层板
树莓派3b+ X1
L298N电机驱动模块 X1
MPU-6050模块(三轴陀螺仪+三轴加速度) X1
电机、小轮 X2 对
18650锂电池 X2
40cm母对母杜邦线若干、电源线、船形开关
下载系统Raspbian系统和安装工具NOOBS (NewOut Of Box System)。 下载地址
a. 将下载的系统文件解压后的镜像文件xxx-raspbian-jessie.img"拷贝进SD卡根目录。
**b. **将NOOBS 解压后的NOOBS_v1_9_1文件夹中的所有文件拷贝到SD卡根目录,注意要进入NOOBS_v1_9_1文件夹拷贝里面的所有文件,而不是直接拷贝文件夹。
c. 将SD卡装入树莓派。找个带HDMI接口的显示器,如果没有就买个HDMI转VGA的转接线使用常见VGA接口显示器作为树莓派的屏幕,连上USB鼠标键盘,一切就绪。连上电源线通电后树莓派将自动进入安装程序,稍等一会就系统就装好了,默认登录到图形界面。
**网络设置: **树莓派3b+自带无限网卡,可直接连接右上角的WLAN,若连接校园网,需使用浏览器任意打开一个网站,待跳出账号登陆界面后输入账号密码。
**更换国内镜像源: **树莓派系统安装后默认使用国外的镜像源,因为墙的原因,所以在安装模块的时候速度非常慢,因此需要将镜像源换成国内的。
首先确认自己的树莓派系统版本,可使用命令:
lsb_release -a
注意Codename后面的版本名称(stretch/jessis)
( 我的版本是stretch,若是其他版本可自行查询修改命令 )
更改镜像源(清华镜像源)
执行如下语句,编辑/etc/apt/sources.list
文件。
$ sudo nano /etc/apt/sources.list
用**#**注释掉原文内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
( CTRL+O 确认并存盘CTRL+X 退出,如不确定是否保存成功,可以再次打开查看 )
执行如下语句,编辑/etc/apt/sources.list.d/raspi.list
文件。
$ sudo nano /etc/apt/sources.list.d/raspi.list
用**#**注释掉原文内容,用以下内容取代:
deb http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
deb-src http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
( 请采用相同方法保存 )
编辑镜像站后,请使用$ sudo apt-get update
命令,更新软件源列表。
常用镜像站汇总
$ sudo apt-get install libi2c-dev
$ sudo nano /etc/modules
在该文件中添加代码:
`i2c-bcm2708 `
i2c-dev
$ sudo raspi-config
点击Internationalisation Options ,使I2C模块enabled,并重启树莓派。
开机后确认I2C是否正常启动
$ lsmod |grep i2c
i2c_dev 6027 0
i2c_bcm2708 4990 0
$sudo apt-get install git-core
$ cd
$ git clone git://git.drogon.net/wiringPi
$ cdwiringPi
$ sudo ./build
$ sudo apt-get install i2c-tools
$ sudo i2cdetect -y 1
若看到
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — 68 — — — — — — —
70: — — — — — — — —
则树莓派已正常识别MPU6050了,之后尝试读取加速度计数据:
$ cd
$ git clone https://github.com/wennycooper/mpu6050_in_c.git
$ cd mpu6050_in_c
$ cat README.md
按照说明进行编译,并执行
$ gcc -o mpu6050_accl ./mpu6050_accl.c -lwiringPi -lpthread -lm
$ gcc -o mpu6050_gyro ./mpu6050_gyro.c -lwiringPi -lpthread -lm
$ sudo ./mpu6050_accl
可看到X, Y, Z三轴加速度数据,可尝试将MPU6050各向反转,观察数据变化。
再读取陀螺仪数据:
$ sudo ./mpu6050_gyro
可以看到X, Y, Z三轴的角速度。
执行如下命令:
$ sudo apt-get install codeblocks
完整代码见底部工程文件链接:
extern float angle_adj;
float PID_adjust(float err,PID *p)
{
float Global_X_Measure=0.0f;
p->ERROR=err;
// p->ERROR=a*p->ERROR+(1.0f-a)*p->ERROR_LAST;
p->Integral+=p->ERROR;
// if(fabs(err)>2.0f)p->Integral=0;
Global_X_Measure= p->Kp * p->ERROR
+p->Ki * p->Integral
+p->Kd *( p->ERROR-p->ERROR_LAST) ;
p->ERROR_LAST=p->ERROR;
return Global_X_Measure;
}
[视频链接]https://pan.baidu.com/s/15WGSO0U7v27B9zIaILNTqA
[代码工程]https://github.com/STARK1117/Standcar.git
[CSDN博客]https://blog.csdn.net/ZHANGHAO1117/article/details/86472201