Monojit Sarkar
Monojit Sarkar

Reputation: 717

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

I would like to publish velocities for my ARDrone using /cmd_vel topic using the below python script. But it does nothing. It does not publish the required information. What is wrong in the below code?

#!/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()

Upvotes: 1

Views: 511

Answers (1)

BTables
BTables

Reputation: 4823

This does actually do something, however it's probably not noticeable. This is because it only publishes something once when the object is created. If you would like you publish periodically you should use a main run loop like so:

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()

Upvotes: 2

Related Questions