You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:09:03