|
@@ -147,6 +147,7 @@ class BaseController:
|
|
|
self.arduino.i2c_update_pid(self.AWheel_Kp, self.AWheel_Kd, self.AWheel_Ki, self.AWheel_Ko,
|
|
|
self.BWheel_Kp, self.BWheel_Kd, self.BWheel_Ki, self.BWheel_Ko,)
|
|
|
|
|
|
+ #对电机pwm进行限幅,保持其正负号
|
|
|
def pwm_ctrl(self, pwmA, pwmB):
|
|
|
if pwmA > 255:
|
|
|
pwmA = 255
|
|
@@ -160,7 +161,7 @@ class BaseController:
|
|
|
|
|
|
return int(pwmA), int(pwmB)
|
|
|
|
|
|
- #底盘运动控制的主循环,执行频率由arduino_node中的频率决定,默认50hz
|
|
|
+ #底盘运动控制的主循环,执行频率由arduino_node中的频率决定,默认100hz
|
|
|
def poll(self):
|
|
|
#发送调试pid参数的数据
|
|
|
self.send_debug_pid()
|
|
@@ -183,10 +184,6 @@ class BaseController:
|
|
|
return
|
|
|
#rospy.loginfo("Encoder A:B=" + str(aWheel_enc) + ":" + str(bWheel_enc))
|
|
|
|
|
|
- #计算编码器计数差值,当前值减去上次的计数值
|
|
|
- encoder_diff_A = aWheel_enc - self.enc_A
|
|
|
- encoder_diff_B = bWheel_enc - self.enc_B
|
|
|
-
|
|
|
#当读取到最新的编码器计数为0,说明下位机已经将计数清零,那上位机保存的上一次编码器计数也得清零
|
|
|
if aWheel_enc == 0 and bWheel_enc == 0:
|
|
|
self.enc_A = 0
|
|
@@ -195,6 +192,14 @@ class BaseController:
|
|
|
self.balanceControl.encoder_integral = 0
|
|
|
self.balanceControl.encoder_lowout = 0
|
|
|
|
|
|
+ #计算编码器计数差值,当前值减去上次记录的计数值
|
|
|
+ encoder_diff_A = aWheel_enc - self.enc_A
|
|
|
+ encoder_diff_B = bWheel_enc - self.enc_B
|
|
|
+
|
|
|
+ #保存当前编码器计数值,用于下次计算
|
|
|
+ self.enc_A = aWheel_enc
|
|
|
+ self.enc_B = bWheel_enc
|
|
|
+
|
|
|
#是否开启平衡车模式,在控制周期内计算控制电机的pwm值
|
|
|
if self.isBalance:
|
|
|
#计算小车当前的倾角,用于直立环和判断小车是否倒下
|
|
@@ -202,7 +207,8 @@ class BaseController:
|
|
|
|
|
|
#启动直立环控制,PD控制器,控制pitch角度和角速度
|
|
|
stand_pwm = self.balanceControl.keepBalance(pitch_err)
|
|
|
-
|
|
|
+ #stand_pwm = 0
|
|
|
+
|
|
|
#启动速度环控制,PI控制器
|
|
|
#speed_pwm = self.balanceControl.keepVelocity(encoder_diff_A, encoder_diff_B, self.target_speed)
|
|
|
speed_pwm = 0
|
|
@@ -211,13 +217,13 @@ class BaseController:
|
|
|
turn_pwm = 0
|
|
|
|
|
|
#计算最终发送给电机的pwm
|
|
|
- pwm_A_tmp = -(stand_pwm + speed_pwm - turn_pwm)
|
|
|
+ pwm_A_tmp = stand_pwm + speed_pwm - turn_pwm
|
|
|
pwm_B_tmp = stand_pwm + speed_pwm + turn_pwm
|
|
|
|
|
|
#将计算得到的pwm值进行限幅,最大pwm值为255,保持正负号
|
|
|
pwm_A, pwm_B = self.pwm_ctrl(pwm_A_tmp, pwm_B_tmp)
|
|
|
pwm_A, pwm_B = self.balanceControl.checkIfDown(pitch_err, pwm_A, pwm_B)
|
|
|
- #rospy.loginfo("pwm_A:pwm_B= " + str(pwm_A) + " : " + str(pwm_B))
|
|
|
+
|
|
|
if self.use_serial:
|
|
|
self.arduino.pwm_drive(pwm_A, pwm_B)
|
|
|
else:
|
|
@@ -227,10 +233,6 @@ class BaseController:
|
|
|
dist_A = encoder_diff_A/self.ticks_per_meter
|
|
|
dist_B = encoder_diff_B/self.ticks_per_meter
|
|
|
|
|
|
- #保存当前编码器计数值,用于下次计算
|
|
|
- self.enc_A = aWheel_enc
|
|
|
- self.enc_B = bWheel_enc
|
|
|
-
|
|
|
time_now = rospy.Time.now()
|
|
|
dt = time_now - self.old_time
|
|
|
self.old_time = time_now
|
|
@@ -325,8 +327,8 @@ class BaseController:
|
|
|
th = req.angular.z #z轴转动角速度rad/s
|
|
|
|
|
|
#两轮小车逆运动学模型,计算得到左右电机转速
|
|
|
- vA = -(x + 0.5*self.wheel_track*th)
|
|
|
- vB = (x - 0.5*self.wheel_track*th)
|
|
|
+ vA = x + 0.5*self.wheel_track*th
|
|
|
+ vB = x - 0.5*self.wheel_track*th
|
|
|
|
|
|
self.v_des_AWheel = int(vA * self.ticks_per_meter / self.PID_rate)
|
|
|
self.v_des_BWheel = int(vB * self.ticks_per_meter / self.PID_rate)
|