在PyQt4 GUI中查找bash文件

在PyQt4 GUI中查找bash文件,bash,python-2.7,subprocess,pyqt4,ros,Bash,Python 2.7,Subprocess,Pyqt4,Ros,我正在开发一个使用PyQt4和Python2.7构建的GUI,它为运行的RosIndigo启动了各种演示。图形用户界面在虚拟和可视化我的物理机器人之间切换。要做到这一点,它必须在本地ROS和我的哈士奇上的ROS之间切换。在两个不同的ROS实例之间切换时,我需要能够为每个操作系统“源”devel/setup.bash,以便正确构建包,并且可视化Rviz中的Husky不会中断(TF帧错误,如“无TF数据。实际错误:固定帧[odom]不存在”和RobotModel错误“URDF Model无法解析”)

我正在开发一个使用PyQt4和Python2.7构建的GUI,它为运行的RosIndigo启动了各种演示。图形用户界面在虚拟和可视化我的物理机器人之间切换。要做到这一点,它必须在本地ROS和我的哈士奇上的ROS之间切换。在两个不同的ROS实例之间切换时,我需要能够为每个操作系统“源”devel/setup.bash,以便正确构建包,并且可视化Rviz中的Husky不会中断(TF帧错误,如“无TF数据。实际错误:固定帧[odom]不存在”和RobotModel错误“URDF Model无法解析”). 在我的.bashrc中,如果我为Husky的setup.bash提供源代码,那么在我尝试运行本地演示之前,可视化效果很好。反之亦然;虽然寻源本地setup.bash可以很好地运行本地演示,但Husky的可视化功能中断了


是否有一种方法可以使用python的子进程(或另一种替代方法)在GUI实例中找到合适的devel/setup.bash,这样可视化就不会中断?

是的,在执行所需的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
,它将在子shell中执行
cmd
。然后,
cmd
包含
在执行命令之前,它将生成安装脚本。请注意,
.sh
文件的来源不是
.bash
,因为Popen可能会使用通用POSIX shell。

我的答案对您有用吗?是的,很有用,谢谢!