У меня есть небольшая проблема с узлом 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;
}
использование chdir
сменить каталог. Система создаст новую оболочку и выполнит команду cd. Пожалуйста, обратитесь к этот пост переполнения стека для получения дополнительной информации.
Как отметил нео, первый system
вызов меняет текущий каталог system
вызов, но это не влияет на текущий каталог родителя (т. е. вашего узла).
Но, если я могу, вы должны попытаться решить это по-другому. Помимо жесткого кодирования неверного пути, вы, как правило, не должны предполагать, что имеете доступ к исходной папке во время выполнения (например, если вы выполняете установку, источник может находиться где угодно). Вместо:
ros::package::getPath('your_package_name')
и используйте полный путь + «/data/test.txt» в вашем системном вызове