平衡小车直立环详解

1、当小车不平衡时是这样的

 为了让小车静止在中立位置我们给小车一个外力,使得它与合 力的方向相反,那么就可以让小车回复到平衡位置了。小车的动力来自与底部的 两个车轮,这个外力只能由车轮给出,小车作变速运动时,车体自然会受到一个力的作用。

2、我们给小车一个加速度

对小车进行受力分析𝐹 = 𝑚𝑔𝑠𝑖𝑛𝜃 − 𝑚𝑎𝑐𝑜𝑠𝜃,若𝜃很小,那么可以认为 𝑠𝑖𝑛𝜃 = 𝜃,𝑐𝑜𝑠𝜃 = 1,有𝐹 = 𝑚𝑔𝑠𝑖𝑛𝜃 − 𝑚𝑎𝑐𝑜𝑠𝜃 = 𝑚𝑔𝜃 − 𝑚𝑎,假设a=𝑘1𝜃,那么𝐹 =𝑚𝑔𝜃 − 𝑚𝑘1𝜃。当𝑘1 > 𝑔时,回复力 F 的方向就与倾斜方向相反了,此时小车会回复到平衡的位置。如果小车不能准

3、确地到达中立位并稳定下来,那么小车会一直做往复运动。直到找到合适的位置才会停下。所以为了减少平衡的时间,我们增加了额外的阻尼力(来减小K1带来的影响),增加的阻尼力大小与角速度(𝜃')成正比,方向相反,比例系数设为𝑘2

 

所以𝐹 = 𝑚𝑔𝜃 − 𝑚𝑘1𝜃 − 𝑚𝑘2𝜃' = 𝑚𝑔𝜃 − 𝑚(𝑘1𝜃 + 𝑘2𝜃'),𝜃'是角度的微分, 即角速度。所以要给小车的力为F1=𝑚(𝑘1𝜃 + 𝑘2𝜃'),ma=𝑚(𝑘1𝜃 + 𝑘2𝜃'),可得小车加速度控制算法:𝑎 = 𝑘1𝜃 + 𝑘2𝜃'。给小车一个加速度 a,只要保证𝑘1 > 𝑔,𝑘2 > 0 就可以令小车保持在平衡位置。

4、如何控制小车的加速度呢?电机的转速是通过改变在其上的驱动电压大小来实现的(即PWM值)

5、𝑎 = 𝑘1𝜃 + 𝑘2𝜃',我们解释一下变量,a就是我们要求的值(PWM值),𝜃(角度差)=我们所期望的角度(这里为90度)-当前的角度值,𝜃'(角速度)我们可以从MPU6050中获得,𝑘1和𝑘2是我们要调节的参数。

6、我们通过获得的PWM值来调节转速

7、下面是代码部分:

### 平衡小车PID控制中的直立和速度公式 对于平衡小车(Balance Scooter),其控制系统通常采用双闭结构来实现稳定性和运动控制。外负责保持车身姿态的稳定性,即直立控制;内则用于调节电机的速度输出。 #### 直立控制(角度控制) 为了维持车辆处于垂直位置,在设计控制器时会引入比例积分微分(PID)算法处理倾斜角误差θe(t),该误差由陀螺仪传感器测得的实际倾角θactual减去期望设定值θdesired得出: \[ u_{\theta}(t)=K_p \cdot e_\theta (t)+ K_i \int_0^te_\theta (\tau)d\tau + K_d \frac{de_\theta}{dt} \] 其中\(u_{\theta}\)(t)表示作用于系统的力矩指令信号[^1]。 #### 速度控制 针对前进方向上的移动需求,则需构建另一个独立运作却相互关联的速度反馈回路。此节同样运用PID策略计算加减速命令vcmd: \[ v_{cmd}=Kp_v(e_v)+Ki_v\sum e_v+Kd_v(\Delta e_v/\Delta t)\] 这里ev代表目标行驶速率Vtarget同当前检测到的真实瞬时速度Vmeasured之间的偏差量[^2]。 ```python def pid_controller(error, prev_error, integral, kp, ki, kd): """ A simple implementation of a PID controller. :param error: Current error value :param prev_error: Previous error value used to calculate derivative term :param integral: Accumulated sum of errors over time for the integral component :param kp: Proportional gain coefficient :param ki: Integral gain coefficient :param kd: Derivative gain coefficient :return: Control signal output from the PID algorithm """ # Calculate proportional term p_out = kp * error # Update and limit integral term within reasonable bounds integral += error i_out = max(min(integral * ki,-MAX_INTEGRAL), MAX_INTEGRAL) d_out = kd*(error-prev_error)/DELTA_T return p_out+i_out+d_out,p_out,i_out,d_out,integral # Example usage with placeholder values kp_theta=1.2;ki_theta=.7;kd_theta=.5; kp_speed=2.0;ki_speed=0.8;kd_speed=0.3; angle_setpoint=0.0 # Desired angle in radians speed_setpoint=1.0 # m/s desired forward velocity current_angle=-0.1 # radian measurement from IMU sensor current_velocity=0.9 #m/s measured by encoder or other means prev_angle_error=0.0 integral_angle_sum=0.0 prev_speed_error=0.0 integral_speed_sum=0.0 torque_command,speed_command=pid_controller(current_angle-angle_setpoint, prev_angle_error, integral_angle_sum,kp_theta,ki_theta,kd_theta)[0],\ pid_controller(current_velocity-speed_setpoint, prev_speed_error, integral_speed_sum,kp_speed,ki_speed,kd_speed)[0] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值