2016-07-29 1 views
4

Я работаю над графическим интерфейсом, созданным с помощью PyQt4 и Python 2.7, который запускает различные демоверсии для Clearpath Husky, работающих под управлением ROS Indigo. Графический интерфейс переключается между launching navigation demos и визуализирует мой физический робот. Для этого он должен переключаться между запусками демонстраций на локальном ROS и ROS на моем Husky. При переключении между двумя разными экземплярами ROS мне нужно иметь возможность «генерировать» файл devel/setup.bash для каждой ОС, чтобы пакеты были построены правильно и визуализация Husky внутри Rviz не прерывалась (ошибки с фреймами TF, например, Нет данных tf. Фактическая ошибка: Fixed Frame [odom] не существует »и с RobotModel« Модель URDF не смогла разобрать »). В моем .bashrc, если я источник setup.bash Husky, визуализация работает нормально, пока я не попытаюсь запустить локальную демонстрацию. Это также происходит наоборот; в то время как поиск локального setup.bash будет запускать локальные демонстрации просто отлично, визуализация Husky нарушается.Файл Sourcing bash внутри PyQt4 GUI

Есть ли способ использовать подпроцесс python (или другую альтернативу) для источника соответствующего девела/setup.bash в экземпляре GUI, чтобы визуализация не нарушилась?

+0

Помог ли мой ответ для вас? –

+0

Да, это отлично поработало! – dicegame

ответ

2

Да, это должно быть достаточно, чтобы источник сценарий установки непосредственно перед выполнением команды ROS вы хотите, например:

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

Как вы видите, shell=True используется, который будет выполнять cmd в субоболочке , Затем cmd содержит . <shell_setup_script>; <command>, который запускает скрипт установки перед выполнением команды. Обратите внимание, что файл .sh используется вместо .bash, поскольку общая оболочка POSIX, скорее всего, будет использоваться Popen.