ROS Python中如何使用Twist()控制小海龟旋转两次绘制两个不同圆形
问题原因分析
- 你的代码中两个发布者均向同一个
/turtle1/cmd_vel话题发布消息,且两次publish调用传入的都是move_cmd_1,全程没有发布过角速度为-1的move_cmd参数,因此只会执行同一种圆周运动。 - 小海龟的运动控制节点只会读取
/turtle1/cmd_vel话题的最新消息,同时发布两个不同指令时只有后到的消息会生效,创建多个同话题发布者属于冗余操作,完全无法实现先后运行两种运动的需求。 - 你当前的逻辑是在10.5秒内反复发布同一种运动指令,没有做时间分段来切换不同的Twist参数,自然无法绘制两个不同的圆。
修正方案
你只需要使用单个发布者,分两个时间窗口分别发布不同的Twist指令即可,参考修正后的代码如下:
import rospy from geometry_msgs.msg import Twist if __name__ == '__main__': rospy.init_node('turtle_two_circles', anonymous=True) # 仅需单个发布者即可 pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) # 定义两种运动参数 move_cmd1 = Twist() move_cmd1.linear.x = 1.0 move_cmd1.angular.z = -1.0 # 顺时针画圆 move_cmd2 = Twist() move_cmd2.linear.x = 1.0 move_cmd2.angular.z = 1.0 # 逆时针画圆 # 先画第一个圆,持续5秒 start_time = rospy.Time.now() while rospy.Time.now() < start_time + rospy.Duration.from_sec(5) and not rospy.is_shutdown(): pub.publish(move_cmd1) rate.sleep() # 再画第二个圆,持续5秒 start_time = rospy.Time.now() while rospy.Time.now() < start_time + rospy.Duration.from_sec(5) and not rospy.is_shutdown(): pub.publish(move_cmd2) rate.sleep() # 运行完后发送停止指令让小海龟停下 pub.publish(Twist())
代码说明
- 拆分了两个独立的时间循环,前5秒发送顺时针圆周运动指令,第一个圆绘制完成后切换为逆时针指令再运行5秒,就会得到两个转向相反的圆
- 最后加了空的Twist消息发布,避免程序结束后小海龟还在持续运动
- 加入了
rospy.is_shutdown()判断,避免节点被终止时循环报错
内容的提问来源于stack exchange,提问作者akhil0_0
相关产品推荐
相关产品推荐

