当PHP生成进程时找不到ROS catkin_init_workspace

时间:2015-05-20 04:53:29

标签: php python environment-variables ros

让我详细说明:我正在尝试从PHP中生成 catkin_init_workspace ,使用 proc_open ,如下所示:

touch( "$dir/stderr.txt" );
chmod( "$dir/stderr.txt", 0755 );
$fp = fopen("$dir/stderr.txt", "w");
fclose($fp);

$descr = array(
                0 => array("pipe", 'r'), // stdin
                1 => array("pipe", 'w'), // stdout
                2 => array("file", "$dir/stderr.txt", "w")to file
              );

$pid = proc_open( "catkin_init_workspace", $descr, $pipes, $dir );

if (!is_resource( $pid) ) 
    throw new Exception ( "`catkin_init_workspace` exec failed");

else if ( is_resource( $pid ) )
{   
    fclose( $pipes[1] );
    $retval = proc_close( $pid );
}

以上代码与CMake,GCC和其他应用程序一起使用。 但是,当我用catkin_init_workspace尝试这个时,我得到:

sh: 1: catkin_init_workspace: not found

现在,据我所知,catkin_init_workspace是一个python脚本:

/opt/ros/indigo/bin/catkin_init_workspace

我尝试使用绝对路径直接调用它,但是没有用。

作为用户,一切正常。但是当我通过www-data执行时,不是Apache2的用户/组设置。

ROS教程解释说我需要通过运行

来设置我的环境变量
source /opt/ros/indigo/setup.bash

在调用proc_open之前,我也试过通过PHP做的,但无济于事。 我的理解是我需要正确设置环境变量。

  

导出| grep ROS

所示:

declare -x ROSLISP_PACKAGE_DIRECTORIES="/home/alex/Projects/ros_ws/devel/share/common-lisp"
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/home/alex/Projects/ros_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
declare -x ROS_TEST_RESULTS_DIR="/home/alex/Projects/ros_ws/build/test_results"

我需要为www-data设置环境变量才能正确调用catkin吗?

如果是这样,我如何作为env数组传递给PHP的proc_open这些变量?

1 个答案:

答案 0 :(得分:3)

正如您已经想到的那样,必须事先调用source /opt/ros/indigo/setup.bash,否则您的环境不会设置为查找ROS命令。

当您在PHP中执行此操作时,我猜您在致电proc_open之前使用了类似额外的execproc_open("catkin_init_workspace", ...)来电或类似的内容? 通过执行此操作,可能仅为此单个调用设置了环境,并且在您在另一个catkin_init_workspace调用中运行proc_open之前不会保留该环境。

可能的解决方案

我现在无法在此测试(没有安装PHP),但以下内容应该有效:

  1. 使用以下内容创建一个简单的bash脚本:

    #!/bin/bash
    source /opt/ros/indigo/setup.bash
    catkin_init_workspace
    
  2. 在PHP中,请调用此脚本而不是catkin_init_workspace