Терминальная команда в пакете ROS не выполняется

У меня есть небольшая проблема с узлом ROS, даже если я думаю, что это в основном проблема кода C ++.
Что я хочу сделать, это использовать скрипт, который работает в терминале (Ubuntu 14.04) в узле ROS.
Я делаю это с помощью system() код команды языка C ++.
Этот скрипт должен разработать файл .txt, хранящийся локально на моем ПК; Когда я использую скрипт обычным способом командной строки, очевидно, что мне нужно сначала перейти в каталог, где находится мой скрипт, а затем я запускаю скрипт.
Чтобы ответить на это на моем узле, я использую 2 system() экземпляры, чтобы перейти к каталогу, а затем запустить скрипт.
Проблема в том, что кажется, что узел «не может видеть» команду, которая говорит ему перейти к правильному каталогу, поэтому все, что я могу получить, это сообщение об ошибке: не могу прочитать текстовый файл.
Единственный способ правильно запустить скрипт — это запустить узел после того, как я вручную перейду к каталогу, в котором он находится.
Я публикую код ниже, возможно, я пишу что-то плохое или есть другая проблема, которую я не вижу, так как я нуб в мире ROS и кодирования в целом. Заранее спасибо, я знаю, что, возможно, это глупый вопрос!

Marco

Вот это код:

int main(int argc, char **argv)
{

ros::init(argc, argv, "heart_rate_monitor");ros::NodeHandle n;

system("cd ~/home/marco/catkin_ws/src/heart_rate_monitor");
system("get_hrv -R test.txt");exit(0);return 0;
}

Примечание: я пробовал также без ~.

РЕДАКТИРОВАТЬ: теперь кажется, что работает правильно, вот код:

int main(int argc, char **argv)
{

ros::init(argc, argv, "heart_rate_monitor");ros::NodeHandle n;

chdir("/home/marco/catkin_ws/src/heart_rate_monitor");

system("get_hrv -R test.txt >doc.txt");exit(0);return 0;
}

0

Решение

использование chdir сменить каталог. Система создаст новую оболочку и выполнит команду cd. Пожалуйста, обратитесь к этот пост переполнения стека для получения дополнительной информации.

0

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

Как отметил нео, первый system вызов меняет текущий каталог system вызов, но это не влияет на текущий каталог родителя (т. е. вашего узла).

Но, если я могу, вы должны попытаться решить это по-другому. Помимо жесткого кодирования неверного пути, вы, как правило, не должны предполагать, что имеете доступ к исходной папке во время выполнения (например, если вы выполняете установку, источник может находиться где угодно). Вместо:

  • поместить дополнительные данные в новый каталог (например, «данные»)
  • добавить цель установки
  • получить путь выполнения к вашему пакету, используя ros::package::getPath('your_package_name') и используйте полный путь + «/data/test.txt» в вашем системном вызове
0