2016-07-29 39 views
4

Ich arbeite an einer GUI mit PyQt4 und Python 2.7 erstellt, die verschiedene Demos für eine Clearpath Husky mit ROS Indigo startet. Die GUI wechselt zwischen launching navigation demos und visualisiert meinen physischen Roboter. Um dies zu tun, muss man zwischen Demos auf einem lokalen ROS und dem ROS auf meinem Husky wechseln. Wenn ich zwischen den zwei verschiedenen ROS-Instanzen umschalte, muss ich die devel/setup.bash für jedes Betriebssystem "quellen" können, damit die Pakete korrekt gebaut werden und das Husky in Rviz nicht sichtbar wird (Fehler bei TF-Frames wie " Keine tf Daten. Aktueller Fehler: Fixed Frame [odom] existiert nicht "und mit RobotModel" URDF Model konnte nicht parsen "). In meinem .bashrc, wenn ich die Husky-Setup.bash Quelle, die Visualisierung funktioniert gut, bis ich versuche, eine lokale Demo zu laufen. Dies geschieht auch umgekehrt. während die lokale setup.bash die lokalen Demos in Ordnung bringt, bricht die Husky-Visualisierung.Sourcing Bash-Datei in PyQt4 GUI

Gibt es eine Möglichkeit, den Python-Subprozess (oder eine andere Alternative) zu verwenden, um die entsprechende devel/setup.bash innerhalb der GUI-Instanz zu finden, so dass die Visualisierung nicht bricht?

+0

Hat meine Antwort für Sie funktioniert? –

+0

Ja, das hat super funktioniert, danke! – dicegame

Antwort

2

Ja, sollte es ausreichen, um das Setup-Skript zur Quelle kurz vor dem ROS Befehl ausführen Sie zum Beispiel wollen:

#!/usr/bin/env python 

from subprocess import Popen, PIPE 

shell_setup_script = "/some/path/to/workspace/devel/setup.sh" 
command = "echo $ROS_PACKAGE_PATH" 
cmd = ". %s; %s" % (shell_setup_script, command) 

output = Popen(cmd, stdout=PIPE, shell=True).communicate()[0] 
print(output) 

Wie Sie sehen, shell=True verwendet wird, die die cmd in einer Subshell ausführt . Dann enthält cmd. <shell_setup_script>; <command>, die das Setup-Skript vor dem Ausführen des Befehls eingibt. Bitte beachten Sie, dass die Datei .sh anstelle von .bash bezogen wird, da die generische POSIX-Shell wahrscheinlich von Popen verwendet wird.