Ausführen eines Scriptes direkt aus dem Quellcode



  • Hallo,

    im Rahmen meiner Abschlussarbeit soll ich eine Robotersteuerung mit ROS entwickeln. Ziel ist es, einen Schwenkkopf über das Internet zu steuern und via Webcam ein Livebild darzustellen. So weit so gut 🙂

    Ich arbeite Schritt für Schritt und entwickel ein Programm, welches Anfangs mit einfachen Funktionen funktionert und immer weiter entwickelt werden soll.

    Der Roboter wird unter Ubuntu mit einem Konsolenbefehl gestartet, dort werden auch die "Koordinaten" eingegeben zu denen der Roboter fahren soll. (Er kann quasi Horizontal und Vertikal ausgerichtet werden)

    Dies geschieht mit folgendem Befehl:

    ROS_NAMESPACE=ptu rosrun flir_ptu_driver cmd_angles Wert1 Wert2
    

    Im ersten Schritt habe ich ein C++ Programm geschrieben, was per Konsolenbefehl die beiden Werte einliest und dann per "System" Befehl einfach an die Konsole übergibt.

    befehl << "ROS_NAMESPACE=ptu rosrun flir_ptu_driver cmd_angles " << a <<" "<< b;     
    system(befehl.str().c_str());
    

    Das Funktioniert auch wunderbar. Der Roboter bewegt sich und ich bin glücklich. Nun kommen wir zu meinem Problem. Im besten Fall soll das ganze irgendwann per Joystick bewegt, aber auf jeden Fall per Knopfdruck. Dies erfordert ein Kontinuirliches einlesen der Werte. Setze ich das ganze Programm in eine Schleife, kann ich zwar jederzeit die Werte annehmen, nur leider erfolgt keine Übergabe der Werte nach dem ersten mal.

    Ich habe das Problem damit begründet, dass das Programm (wenn der o.g. Befehl direkt aus der Konsole aufgerufen wird) auch erst manuell beendet werden muss.

    Nun kommen wir zu meinem Problem: Das Script welches die Werte annimmt und weiterleitet ist in Python geschrieben und lautet:

    import rospy
    import sys
    import time
    
    from sensor_msgs.msg import JointState
    
    def set_angles(pan, tilt):
        pub = rospy.Publisher("ptu/cmd", JointState)
        time.sleep(0.5)
    
        js = JointState()
        js.name = [ "ptu_pan", "ptu_tilt" ]
        js.velocity = [ 0.6, 0.6 ]
        js.position = [ pan, tilt ]
        pub.publish(js)
    
    if __name__ == '__main__':
        rospy.init_node('ptu_cmd_angles')
        set_angles(
                float(sys.argv[1]),
                float(sys.argv[2]))
    

    Gibt es irgendeine möglichkeit, direkt aus dem Programm die Werte einzulesen und zu übergeben, also quasi die Kommunikation über die Konsole zu übergehen?

    Das ist mein erstes Programmierprojekt, was über die normalen Vorlesungsinhalte hinaus geht und ich bin über jede Hilfe dankbar! Weiterhin stehe ich für weitere nachfragen natürlich zur verfügung 🙂 👍



  • Das ist viel Text aber wenig nützliche Information.

    system startet keine Konsole.

    cppreference.com schrieb:

    Calls the host environment's command processor (/bin/sh, cmd.exe, command.com) with the parameter command. Returns an implementation-defined value (usually the value that the invoked program returns).

    D.h. also, das Kommando wird einmal ausgeführt. Das kann man problemlos in eine Schleife packen.

    Wo ist also das Problem?

    Grundsätzlich stellt sich natürlich die Frage, warum du C++ statt Python benutzt, wenn du doch nur Pythonskripte aufrufst.


Log in to reply