ROS包中的终端命令未执行

时间:2016-11-11 11:08:48

标签: c++ ubuntu terminal ros gnome-terminal

我对ROS节点有一点问题,即使我认为它主要是一个C ++代码问题。 我想要做的是使用在ROS节点内的终端(Ubuntu 14.04)中运行的脚本。 我正在使用C ++语言的system()命令代码执行此操作。 这个脚本必须详细说明我的PC本地存储的.txt文件;当我通过普通的命令行方法使用脚本时,显然我必须先导航到我的脚本所在的目录,然后启动脚本。 要在我的节点上回复此问题,我使用2 system()个实例导航到该目录,然后运行该脚本。 问题是,似乎节点“看不到”命令告诉它导航到正确的目录,因此,我只能得到一个错误说:无法读取文本文件。 正确启动脚本的唯一方法是在手动导航到脚本所在的目录后启动节点。 我发布下面的代码,也许我写的东西很糟糕,或者还有另一个我看不到的问题,因为我是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;
}

注意:我也试过没有〜。

编辑:现在它似乎正常运行,这里是代码:

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;
}

2 个答案:

答案 0 :(得分:0)

使用chdir更改目录。系统将创建一个新shell并执行cd命令。有关更多信息,请参阅this堆栈溢出帖子。

答案 1 :(得分:0)

正如neo指出的那样,第一个system电话正在改变system电话的当前目录,但它不会影响父母(即您的节点)当前目录。

但是,如果可以的话,你应该尝试以不同的方式解决这个问题。除了硬编码路径错误之外,您通常不应该假设在运行时访问源文件夹(例如,如果您进行安装,源可以在任何地方)。代替:

  • 将其他数据放入新目录(例如'数据')
  • 添加安装目标
  • 使用ros::package::getPath('your_package_name')检索包的运行时路径,并使用完整路径+" /data/test.txt"在您的系统调用中