我搜索了一下知道nav_msgs/path工具好像可以实现,我也正好加载了这个包:

import nav_msgs.msg

我想知道如何发布这个话题并订阅,目前的发布话题订阅话题命令如下:

turtle_vel = rospy.Publisher('/tb3_0/cmd_vel', geometry_msgs.msg.Twist, queue_size=1)
rospy.Subscriber('/tb3_0/odom', nav_msgs.msg.Odometry, Trans_robot_pose) # 获取位姿信息

以下是main函数:

if __name__ == '__main__':
rospy.init_node('item1')
turtle_vel = rospy.Publisher('/tb3_0/cmd_vel', geometry_msgs.msg.Twist, queue_size=1)
rate = rospy.Rate(10.0)
while not rospy.is_shutdown():
msg = geometry_msgs.msg.Twist()
(roll, pitch, yaw) = euler_from_quaternion([x_o,y_o,z_o,w_o]) # 将四元数转化为roll, pitch, yaw
if yaw < 0:
yaw = yaw + 2 * math.pi
X_t = X_sim
Y_t = Y_sim
D_err = math.sqrt(math.pow((X_t - x), 2) + math.pow((Y_t - y), 2))
# 判断坐标象限
if (Y_t - y) == 0 and (X_t - x) > 0:
yaw_t = 0
if (Y_t - y) > 0 and (X_t - x) > 0:
yaw_t = math.atan((Y_t - y) / (X_t - x))
if (Y_t - y) > 0 and (X_t - x) == 0:
yaw_t = 0.5 * math.pi
if (Y_t - y) > 0 and (X_t - x) < 0:
yaw_t = math.atan((Y_t - y) / (X_t - x)) + math.pi
if (Y_t - y) == 0 and (X_t - x) < 0:
yaw_t = math.pi
if (Y_t - y) < 0 and (X_t - x) < 0:
yaw_t = math.atan((Y_t - y) / (X_t - x)) + math.pi
if (Y_t - y) < 0 and (X_t - x) == 0:
yaw_t = 1.5 * math.pi
if (Y_t - y) < 0 and (X_t - x) > 0:
yaw_t = math.atan((Y_t - y) / (X_t - x)) + 2 * math.pi
Theta_err = yaw_t - yaw
if Theta_err < -math.pi:
Theta_err = Theta_err + 2 * math.pi
if Theta_err > math.pi:
Theta_err = Theta_err - 2 * math.pi
# 目前先只使用最简单的比例控制
yaw_a=yaw*180/math.pi
yaw_t_a=yaw_t*180/math.pi
angular_speed = 0.7 * Theta_err
print(abs(yaw-yaw_t),yaw,yaw_t,x,y)

if abs(yaw-yaw_t)<0.05:
liner_speed=0.08*D_err
angular_speed=0.0
print(liner_speed,angular_speed)
msg.linear.x = liner_speed
msg.angular.z = angular_speed
liner_speed_old = liner_speed
angular_speed_old = angular_speed
turtle_vel.publish(msg) # 发布运动指令
rospy.Subscriber('/tb3_0/odom', nav_msgs.msg.Odometry, Trans_robot_pose) # 获取位姿信息
rate.sleep()
rospy.spin()