Skip to main content
 首页 » 编程设计

php之当由 PHP 作为进程生成时,找不到 ROS catkin_init_workspace

2024年08月25日24jiqing9006

让我详细说明一下:我正在尝试从 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 执行此操作,但无济于事。 我的理解是我需要正确设置环境变量。

做

export | 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?

请您参考如下方法:

如您所知,source/opt/ros/indigo/setup.bash 必须提前调用,否则您的环境无法找到 ROS 命令。

当您在 PHP 中执行此操作时,我猜您在调用 proc_open("catkin_init_workspace", ...)?
通过这样做,环境可能只为这个单个调用设置,并且直到您在另一个 proc_open-call 中运行 catkin_init_workspace 时才会保留它。

可能的解决方案

我现在不能在这里测试这个(没有安装 PHP),但下面应该可以工作:

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

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