Как передать параметры с плавающей точкой argv в другой скрипт? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь запустить простой скрипт с именем test, используя python test в терминале, чтобы вызвать два других скрипта.

Это скрипт, который я запускаю

#!/usr/bin/env python

import sys
import rospy
import subprocess
import time

from geometry_msgs.msg import Twist
from std_msgs.msg import Empty

subprocess.call("./takeoff_sim")

time.sleep(2)

subprocess.call("./forward_sim" + sys.argv[5.0] + sys.argv[2.0])

Но я получаю следующую ошибку:

Traceback (most recent call last):
  File "test", line 15, in <module>
    subprocess.call(["./forward_sim"] + sys.argv[5.0] + sys.argv[2.0])
TypeError: list indices must be integers, not float

В этом случае оба аргумента должны быть плавающими, поэтому я не могу просто изменить их на int 0.5 должен быть первым аргументом, а 2.0 -второй.Вот скрипт forward_sim:

#!/usr/bin/env python
import sys
import rospy
from geometry_msgs.msg import Twist

def commander(speed, time):
    movement_publisher = rospy.Publisher('cmd_vel', Twist , queue_size=10)
    rospy.init_node("bebop_commander") #Use log_level=rospy.DEBUG to see debug messages
    rate = rospy.Rate(20) # 20hz
    counter = 0.0
    movement_cmd = Twist()

    while not rospy.is_shutdown():
        movement_cmd.linear.x = speed
        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
        rospy.logdebug("Publishing")
    counter += 0.05
        movement_publisher.publish(movement_cmd)
        rate.sleep()
        if counter >= time:
        break

if __name__ == '__main__':
    speed = float(sys.argv[0])
    time = float(sys.argv[1])


rospy.logdebug("Adelante") # Use rospy.logdebug() for debug messages.
print("Adelante")

if speed > 0:
        rospy.logdebug("Velocidad = %s m/s", speed)
    print("Velocidad =",speed," m/s",)
else:
        raise ValueError("Falta parametro de velocidad o el valor es incorrecto")

if time > 0 :
        rospy.logdebug("Tiempo = %s s", time)
    print("Tiempo =" ,time, " s")
else:
        raise ValueError("Falta parametro de tiempo o el valor es incorrecto")

try:
    commander(speed, time)
except rospy.ROSInterruptException:
    pass

1 Ответ

2 голосов
/ 28 июня 2019

sys.argv только для получения аргументов. Чтобы передать значения в качестве аргументов другому сценарию, вам нужно только преобразовать их в строки и добавить их непосредственно в командную строку.

subprocess.call(["./forward_sim", str(5.0), str(2.0)])

Когда другой скрипт получает их, он должен преобразовать каждую строку обратно в число с плавающей точкой:

# This is forward_sim

arg1 = float(sys.argv[1])
arg2 = float(sys.argv[2])

Обратите внимание, что sys.argv[0] - это имя самого скрипта, а не первый аргумент.

...