python — ROS catkin_init_workspace не найден, когда порожден как процесс переполнением стека

Позвольте мне уточнить: я пытаюсь породить catkin_init_workspace из PHP, используя 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

Что я также пытался сделать через PHP, прямо перед тем, как вызвать proc_open, но безрезультатно.
Насколько я понимаю, мне нужно правильно настроить переменные среды.

дела

экспорт | 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-данных, чтобы правильно вызывать catkin?

Если да, то как мне передать массив переменных env в proc_open PHP, эти переменные?

2

Решение

Как вы уже поняли, source /opt/ros/indigo/setup.bash должен быть вызван заранее, в противном случае ваша среда не настроена на поиск команд ROS.

Когда вы сделали это в PHP, я думаю, вы использовали что-то вроде дополнительного proc_open или же exec позвоните или что-то подобное, прежде чем позвонить proc_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
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]