首页 > 解决方案 > Python 中的 Rostopic pub 等效项

问题描述

我正在使用模拟的 bebop2 这些是我用来运行模拟的命令。

sphinx /opt/parrot-sphinx/usr/share/sphinx/drones/bebop2.drone

roslaunch bebop_driver bebop_node.launch ip:=10.202.0.1

在这种情况下, bebop_driver是订阅者,bebop_commander是发布者(参见下面的代码)

我一直在使用:

rostopic pub -r 10 cmd_vel geometry_msgs/Twist  '{linear:  {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}'

为了成功发布到cmd_vel主题。我需要使用 Python 脚本将相同的消息发布到同一个主题,但到目前为止我还不能。

这是我正在尝试使用的 Python 脚本:

#!/usr/bin/env python

import rospy

from geometry_msgs.msg import Twist

import sys

rospy.init_node("bebop_commander")
movement_publisher= rospy.Publisher('cmd_vel', Twist , queue_size=10)
movement_cmd = Twist()

speed = float(sys.argv[1])
time = float(sys.argv[2])

print ("Adelante")

if speed != "" and speed > 0 : 

    print ("Velocidad =" , speed , "m/s")

else:

    print ("Falta parametro de velocidad o el valor es incorrecto")

if time != "" and time > 0 :

    print ("Tiempo = ",time, "s")

else:

    print ("Falta parametro de tiempo o el valor es incorrecto")

if time != "" and time > 0 : 


   movement_cmd.linear.x = 0
   movement_cmd.linear.y = 0
   movement_cmd.linear.z = 0 
   movement_cmd.angular.x = 0 
   movement_cmd.angular.y = 0               
   movement_cmd.angular.z = 0 

   movement_publisher.publish(movement_msg)

   print ("Publishing")

rospy.spin()

标签: pythonbashubuntuubuntu-16.04ros

解决方案


您的代码中几乎没有错误/建议:

  • 您没有检查用户是否实际上在开始时输入了所有参数,即文件名、速度和时间。在这里尝试使用以下代码:

    if len(sys.argv)>2:
       speed = float(sys.argv[1])
       time = float(sys.argv[2]) 
    else:
       print("one or more arguments missing!!")
    
  • 没有必要,speed != ""一旦time != ""你检查了len(sys.argv)>2条件。
  • 你在movement_msg里面传递一个未知变量movement_publisher.publish()。请检查以下行:

    movement_publisher.publish(movement_msg)
    

    应该是movement_cmd

修改后的代码(已测试):

文件名:test_publisher.py

import rospy
from geometry_msgs.msg import Twist
import sys

rospy.init_node("bebop_commander")
movement_publisher= rospy.Publisher('cmd_vel', Twist , queue_size=10)
movement_cmd = Twist()

if len(sys.argv)>2:
    speed = float(sys.argv[1])
    time = float(sys.argv[2])  
    print("Adelante")
    if speed > 0.0:
        print("Velocidad =" , speed , "m/s")      
    else:
        print("Falta parametro de velocidad o el valor es incorrecto") 
    if time > 0.0:
        print ("Tiempo = ",time, "s")
        movement_cmd.linear.x = 0
        movement_cmd.linear.y = 0
        movement_cmd.linear.z = 0
        movement_cmd.angular.x = 0
        movement_cmd.angular.y = 0              
        movement_cmd.angular.z = 0
        movement_publisher.publish(movement_cmd)
        print ("Publishing")
        rospy.spin()      
    else:
        print ("Falta parametro de tiempo o el valor es incorrecto")     
else:
    print('one or more argument is missing!!')

注意:不要忘记将文件复制test_publisher.pyscripts目录并通过以下方式使其可执行chmod +x test_publisher.py

输出:

(终端 1):运行roscore命令。您必须roscore运行才能使ROS节点进行通信。

在此处输入图像描述

(终端 2):运行publisher带有参数的 python 文件。

在此处输入图像描述

(3号航站楼):查询rostopic信息

在此处输入图像描述


推荐阅读