我的 python 脚本没有向 ROS 中的鹦鹉无人机发布速度命令

My python script does not publish velocity command to parrot drone in ROS

我想使用下面的 python 脚本使用 /cmd_vel 主题发布我的 ARDrone 的速度。但它什么都不做。它不会发布所需的信息。 下面的代码有什么问题?

#!/usr/bin/env python3

import numpy as np
import rospy
from geometry_msgs.msg import Twist

class KeyboardControl:
    def __init__(self):
        rospy.init_node('Script_controlling_ARDrone', anonymous=False)
        publisher = rospy.Publisher('/cmd_vel', Twist, queue_size=1)

        twist = Twist()
        twist.linear.x = 0
        twist.linear.y = 0
        twist.linear.z = -1
        twist.angular.x = 0
        twist.angular.y = 0
        twist.angular.z = 0.5

        publisher.publish(twist)


def main():
    try:
        kc = KeyboardControl()
        rospy.spin()
    except KeyboardInterrupt:
        rospy.loginfo("Shutting down")

if __name__ == '__main__':
    main()

这确实起到了一定的作用,但可能并不引人注意。这是因为它只在创建对象时发布一次。如果你想定期发布,你应该使用主 运行 循环,如下所示:

import numpy as np
import rospy
from geometry_msgs.msg import Twist

class KeyboardControl:
    def __init__(self):
        rospy.init_node('Script_controlling_ARDrone', anonymous=False)
        self.pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
        self.rate = rospy.Rate(10) #10Hz


def main():
    try:
        kc = KeyboardControl()
        twist = Twist()
        twist.linear.x = 0
        twist.linear.y = 0
        twist.linear.z = -1
        twist.angular.x = 0
        twist.angular.y = 0
        twist.angular.z = 0.5
        while not rospy.is_shutdown():
            #Do any needed edits to the twist message here
            kc.pub.publish(twist)
            kc.rate.sleep()
    except KeyboardInterrupt:
        rospy.loginfo("Shutting down")

if __name__ == '__main__':
    main()