如何借助IMU反馈实现Turtlebot3的90度转向并验证精度?
基于IMU反馈实现Turtlebot3 90度左转的方案可行性及代码实现
方案可行性
完全可行。IMU(惯性测量单元)能直接采集机器人的姿态数据,尤其是偏航角(yaw),相比里程计依赖轮子转动计算角度的方式,IMU不受地面打滑、轮子磨损带来的累计误差影响,在短距离转向场景下的姿态反馈精度更高,非常适合用于验证或闭环控制90度转向动作。
Turtlebot3搭载的IMU通常会发布/imu/data话题,输出的sensor_msgs/Imu消息包含姿态四元数,可通过坐标转换工具转为欧拉角,用于角度对比和控制逻辑。
基于IMU的修改代码
以下是将原里程计代码改为IMU反馈的实现,核心改动为订阅话题、消息类型处理:
#!/usr/bin/env python import rospy from sensor_msgs.msg import Imu from tf.transformations import euler_from_quaternion from geometry_msgs.msg import Twist import math roll = pitch = yaw = 0.0 target_deg = 90 # 目标左转90度 kp = 0.5 angle_threshold = math.radians(1) # 角度误差阈值(1度) def imu_callback(msg): global roll, pitch, yaw # 从IMU消息中提取四元数 orientation_q = msg.orientation orientation_list = [orientation_q.x, orientation_q.y, orientation_q.z, orientation_q.w] # 四元数转欧拉角(roll, pitch, yaw) (roll, pitch, yaw) = euler_from_quaternion(orientation_list) rospy.init_node('turtlebot3_rotate_with_imu') # 订阅IMU话题,替代原里程计话题 sub = rospy.Subscriber('/imu/data', Imu, imu_callback) pub = rospy.Publisher('cmd_vel', Twist, queue_size=1) rate = rospy.Rate(10) cmd_vel = Twist() # 获取初始yaw作为基准,避免绝对角度漂移影响 initial_yaw = None while initial_yaw is None and not rospy.is_shutdown(): rate.sleep() initial_yaw = yaw target_yaw = initial_yaw + math.radians(target_deg) # 处理角度环绕(比如从350度转到10度,实际只需转20度) if target_yaw > math.pi: target_yaw -= 2 * math.pi elif target_yaw < -math.pi: target_yaw += 2 * math.pi while not rospy.is_shutdown(): # 计算当前yaw与目标yaw的差值,处理环绕问题 angle_diff = target_yaw - yaw if angle_diff > math.pi: angle_diff -= 2 * math.pi elif angle_diff < -math.pi: angle_diff += 2 * math.pi # 当误差小于阈值时停止转动 if abs(angle_diff) < angle_threshold: cmd_vel.angular.z = 0.0 pub.publish(cmd_vel) rospy.loginfo("已完成90度左转,当前角度误差:%.2f度", math.degrees(abs(angle_diff))) break else: cmd_vel.angular.z = kp * angle_diff pub.publish(cmd_vel) rospy.loginfo(f"目标角度:{target_deg}度,当前相对角度:{math.degrees(yaw - initial_yaw):.2f}度") rate.sleep()
关键说明
- 初始角度基准:代码中记录了初始yaw值,计算相对转向角度,避免IMU绝对角度漂移带来的影响。
- 角度环绕处理:解决欧拉角在±π处的跳变问题,确保转向逻辑正确。
- 阈值停止:设置角度误差阈值,当误差足够小时停止转动,避免机器人来回震荡。
- IMU校准:使用前建议先对Turtlebot3的IMU进行校准,减少初始误差,校准命令为
roslaunch turtlebot3_bringup turtlebot3_robot.launch后执行rosservice call /imu/gyro/bias/start。
内容的提问来源于stack exchange,提问作者loveson vashikaran
相关产品推荐
相关产品推荐

