不执行 ROS 包中的终端命令
Terminal command in a ROS package is not executed
我的 ROS 节点有点问题,即使我认为它主要是 C++ 代码问题。
我想要做的是在 ROS 节点内的终端 (Ubuntu 14.04) 中使用 运行s 的脚本。
我正在使用 C++ 语言的 system()
命令代码来执行此操作。
这个脚本必须详细说明一个 .txt 文件本地存储在我的 PC 上;当我通过普通命令行方法使用脚本时,显然我必须首先导航到脚本所在的目录,然后启动脚本。
为了在我的节点上回复这个,我使用 2 system()
个实例导航到目录,然后导航到 运行 脚本。
问题是节点 "cannot see" 似乎是告诉它导航到正确目录的命令,因此,我所能得到的只是一条错误消息:无法读取文本文件。
正确启动脚本的唯一方法是在我手动导航到脚本所在的目录后启动节点。
我在下面发布代码,也许我写的东西不好或者还有另一个我看不到的问题,因为我是 ROS 和一般编码领域的菜鸟。提前谢谢你,我知道这可能是个愚蠢的问题!
马可
这是代码:
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;
}
注意:我也尝试过不带 ~ 。
编辑:现在看来 运行ning 正确,这里是代码:
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
更改目录。系统会新建一个shell并执行cd命令。请参阅 this 堆栈溢出 post 了解更多信息。
正如 neo 指出的那样,第一个 system
调用正在更改 system
调用的当前目录,但它不会影响父级(即您的节点)的当前目录。
但是,如果可以的话,你应该尝试以不同的方式解决这个问题。除了硬编码路径错误之外,您通常不应该假设在运行时可以访问源文件夹(例如,如果您进行安装,源可能在任何地方)。相反:
- 将其他数据放入新目录(例如 'data')
- 添加安装目标
- 使用
ros::package::getPath('your_package_name')
检索包的运行时路径并在系统调用中使用完整路径+“/data/test.txt”
我的 ROS 节点有点问题,即使我认为它主要是 C++ 代码问题。
我想要做的是在 ROS 节点内的终端 (Ubuntu 14.04) 中使用 运行s 的脚本。
我正在使用 C++ 语言的 system()
命令代码来执行此操作。
这个脚本必须详细说明一个 .txt 文件本地存储在我的 PC 上;当我通过普通命令行方法使用脚本时,显然我必须首先导航到脚本所在的目录,然后启动脚本。
为了在我的节点上回复这个,我使用 2 system()
个实例导航到目录,然后导航到 运行 脚本。
问题是节点 "cannot see" 似乎是告诉它导航到正确目录的命令,因此,我所能得到的只是一条错误消息:无法读取文本文件。
正确启动脚本的唯一方法是在我手动导航到脚本所在的目录后启动节点。
我在下面发布代码,也许我写的东西不好或者还有另一个我看不到的问题,因为我是 ROS 和一般编码领域的菜鸟。提前谢谢你,我知道这可能是个愚蠢的问题!
马可
这是代码:
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;
}
注意:我也尝试过不带 ~ 。
编辑:现在看来 运行ning 正确,这里是代码:
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
更改目录。系统会新建一个shell并执行cd命令。请参阅 this 堆栈溢出 post 了解更多信息。
正如 neo 指出的那样,第一个 system
调用正在更改 system
调用的当前目录,但它不会影响父级(即您的节点)的当前目录。
但是,如果可以的话,你应该尝试以不同的方式解决这个问题。除了硬编码路径错误之外,您通常不应该假设在运行时可以访问源文件夹(例如,如果您进行安装,源可能在任何地方)。相反:
- 将其他数据放入新目录(例如 'data')
- 添加安装目标
- 使用
ros::package::getPath('your_package_name')
检索包的运行时路径并在系统调用中使用完整路径+“/data/test.txt”