2016-07-29 67 views
4

我正在使用PyQt4和Python 2.7构建的GUI,它为运行ROS Indigo的Clearpath Husky启动各种演示。 GUI在launching navigation demos之间切换并可视化我的物理机器人。要做到这一点,它必须在本地ROS上启动演示和在我的哈士奇上启动ROS。当在两个不同的ROS实例之间切换时,我需要能够为每个操作系统“发送”devel/setup.bash,以便正确构建包并且可视化Rviz内部的赫斯基不会中断(与TF帧错误,如“没有tf数据。实际的错误:修正了Frame [odom]不存在“并且RobotModel”URDF Model无法解析“)。在我的.bashrc中,如果我输入Husky的setup.bash,那么可视化效果很好,直到我尝试运行一个本地演示。这也反过来发生;而采购本地setup.bash将运行本地演示就好了,赫斯基的可视化工作就会中断。在PyQt4 GUI中采购bash文件

有没有一种方法可以使用python的子进程(或另一种替代方法)在GUI的实例中获取适当的devel/setup.bash,以便可视化不会中断?

+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,这将在一个子shell执行cmd 。然后,cmd包含. <shell_setup_script>; <command>,它在执行命令之前获取设置脚本。请注意0​​文件取代了.bash,因为Popen可能会使用通用的POSIX shell。