|
@@ -11,6 +11,8 @@
|
|
|
20210913:为增加两轮平衡车模式优化代码.
|
|
|
20220927:将电机编码器计数的参数获取改为一个参数motor_encoder_cnt,直接为
|
|
|
CHANGE模式四倍频的总计数1320个,不使用减速比和编码器分辨率参数.
|
|
|
+ 20220929:删除在init函数中,发送清除编码器计数值操作,因为上下位机建立通信时,
|
|
|
+ 会自动的将下位机程序初始化,编码器计数值自然为0.
|
|
|
"""
|
|
|
import os,rospy,roslib
|
|
|
import dynamic_reconfigure.client
|
|
@@ -19,7 +21,6 @@ from math import sin, cos, pi
|
|
|
from std_msgs.msg import Int32
|
|
|
from nav_msgs.msg import Odometry
|
|
|
from geometry_msgs.msg import Quaternion,Twist
|
|
|
-from tf.broadcaster import TransformBroadcaster
|
|
|
from ros_arduino_python.balance_mode import BalanceMode
|
|
|
|
|
|
|
|
@@ -67,9 +68,6 @@ class BaseController:
|
|
|
self.accel_limit = rospy.get_param('~motor_accel_limit', 0.1)
|
|
|
self.max_accel = self.accel_limit*self.ticks_per_meter
|
|
|
|
|
|
- now = rospy.Time.now()
|
|
|
- self.old_time = now # time for determining dx/dy
|
|
|
-
|
|
|
#用于保存读取的电机编码器计数值
|
|
|
self.enc_A = 0
|
|
|
self.enc_B = 0
|
|
@@ -83,7 +81,9 @@ class BaseController:
|
|
|
|
|
|
self.v_des_AWheel = 0 #计算出来应该发送的脉冲数
|
|
|
self.v_des_BWheel = 0
|
|
|
-
|
|
|
+
|
|
|
+ now = rospy.Time.now()
|
|
|
+ self.old_time = now
|
|
|
self.last_cmd_time = now
|
|
|
|
|
|
#设置订阅控制移动话题的回调函数
|
|
@@ -93,15 +93,8 @@ class BaseController:
|
|
|
if self.isBalance:
|
|
|
self.balanceControl = BalanceMode()
|
|
|
|
|
|
- #初始化时,将电机编码器计数值清零
|
|
|
- if self.use_serial:
|
|
|
- self.arduino.reset_encoders()
|
|
|
- else:
|
|
|
- self.arduino.i2c_reset_encoders()
|
|
|
-
|
|
|
- #配置用于里程计信息发布
|
|
|
+ #配置用于里程计信息发布和里程计坐标变换
|
|
|
self.odomPub = rospy.Publisher(self.odom_name, Odometry, queue_size=5)
|
|
|
- self.odomBroadcaster = TransformBroadcaster()
|
|
|
|
|
|
#增加用于调试PID参数的发布者
|
|
|
if self.debugPID:
|
|
@@ -117,7 +110,6 @@ class BaseController:
|
|
|
self.AWheel_Kd = pid_params['AWheel_Kd']
|
|
|
self.AWheel_Ki = pid_params['AWheel_Ki']
|
|
|
self.AWheel_Ko = pid_params['AWheel_Ko']
|
|
|
-
|
|
|
self.BWheel_Kp = pid_params['BWheel_Kp']
|
|
|
self.BWheel_Kd = pid_params['BWheel_Kd']
|
|
|
self.BWheel_Ki = pid_params['BWheel_Ki']
|
|
@@ -144,8 +136,8 @@ class BaseController:
|
|
|
|
|
|
return int(pwmA), int(pwmB)
|
|
|
|
|
|
- #底盘运动控制的主循环,执行频率由arduino_node中的频率决定,默认100hz
|
|
|
- def poll(self):
|
|
|
+ #底盘运动控制的主循环,执行频率由arduino_node中的频率决定
|
|
|
+ def main_poll(self):
|
|
|
#发送调试pid参数的数据
|
|
|
self.send_debug_pid()
|
|
|
|
|
@@ -171,17 +163,19 @@ class BaseController:
|
|
|
if aWheel_enc == 0 and bWheel_enc == 0:
|
|
|
self.enc_A = 0
|
|
|
self.enc_B = 0
|
|
|
+ encoder_diff_A = 0
|
|
|
+ encoder_diff_B = 0
|
|
|
if self.isBalance:
|
|
|
self.balanceControl.encoder_integral = 0
|
|
|
self.balanceControl.encoder_lowout = 0
|
|
|
+ else:
|
|
|
+ #计算编码器计数差值,当前值减去上次记录的计数值
|
|
|
+ encoder_diff_A = aWheel_enc - self.enc_A
|
|
|
+ encoder_diff_B = bWheel_enc - self.enc_B
|
|
|
|
|
|
- #计算编码器计数差值,当前值减去上次记录的计数值
|
|
|
- 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
|
|
|
+ #保存当前读取到的最新编码器计数值,用于下次计算
|
|
|
+ self.enc_A = aWheel_enc
|
|
|
+ self.enc_B = bWheel_enc
|
|
|
|
|
|
#是否开启平衡车模式,在控制周期内计算控制电机的pwm值
|
|
|
if self.isBalance:
|
|
@@ -317,7 +311,7 @@ class BaseController:
|
|
|
self.v_des_BWheel = int(vB * self.ticks_per_meter / self.PID_rate)
|
|
|
#rospy.loginfo("cmdCallback(): A v_des:"+str(self.v_des_AWheel)+",B v_des:"+str(self.v_des_BWheel))
|
|
|
|
|
|
- #用于调试电机PID参数
|
|
|
+ #通过topic发布用于调试电机的各项PID参数
|
|
|
def send_debug_pid(self):
|
|
|
if self.debugPID:
|
|
|
try:
|