dic*_*ame 5 bash subprocess pyqt4 python-2.7 ros
我正在开发一个用 PyQt4 和 Python 2.7 构建的 GUI,它为运行 ROS Indigo的Clearpath Husky启动各种演示。GUI 在启动导航演示之间切换并可视化我的物理机器人。为此,它必须在本地 ROS 上的演示和我的 Husky 上的 ROS 之间切换。在两个不同的 ROS 实例之间切换时,我需要能够为每个操作系统“获取”devel/setup.bash 以便正确构建包并且在 Rviz 中可视化 Husky 不会中断(TF 帧错误,例如“没有 tf 数据。实际错误:固定框架 [odom] 不存在”和 RobotModel“URDF 模型解析失败”)。在我的 .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)
Run Code Online (Sandbox Code Playgroud)
如您所见,shell=True使用了 ,它将cmd在子 shell 中执行。然后,cmd包含. <shell_setup_script>; <command>执行命令之前安装脚本的来源。请注意,该.sh文件是源文件,而不是.bash因为 Popen 可能使用通用 POSIX shell。