我正在开发一个用PyQt4和Python2.7构建的GUI,它为运行ROS的Clearpath Husky启动各种演示。图形界面在发射导航演示和可视化我的物理机器人之间切换。要做到这一点,它必须在本地ROS上启动演示和在我的Husky上启动ROS之间切换。在两个不同的ROS实例之间切换时,我需要能够为每个操作系统“源”devel/setup.bash,以便正确构建包,并且可视化Rviz内部的Husky ( TF框架的错误,如“无tf数据。实际错误:固定帧odom不存在”和RobotModel "URDF模型解析失败“)。在我的.bashrc中,如果我获取Husky的setup.bash,那么在我尝试运行一个本地演示之前,可视化是很好的。反之亦然;当获取本地setup.bash将运行本地演示时,哈士奇的可视化中断了。
是否有一种方法可以使用python的子流程(或另一种替代)来在GUI实例中获取适当的devel/setup.bash,从而使可视化不会中断?
发布于 2016-07-30 16:31:58
是的,在执行所需的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,它将在子subshell中执行cmd。然后,cmd包含在执行命令之前来源于安装脚本的. <shell_setup_script>; <command>。请注意,.sh文件是来源于Popen,而不是.bash,因为Popen很可能使用通用POSIX。
https://stackoverflow.com/questions/38665664
复制相似问题