导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    ROS1节点在VSCode外的终端窗口中运行的时候,文件夹下没有生成结果文件。

    ROS教程
    ros ros教程 ros release
    2
    2
    23
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • wenyang
      wenyang 最后由 编辑

      节点正常运行,终端正常打印节点运行的信息,但是配置文件的目标文件夹下没有生成文件,很奇怪,这个问题偶尔会发生,一般重新启动虚拟机就好了,有大神知道这是什么情况吗?在VSCode内运行就没有这种问题。

      小助理 1 条回复 最后回复 回复 引用 0
      • 小助理
        小助理 @wenyang 最后由 编辑

        这是一个非常典型的 文件路径问题 或 环境变量/工作目录差异 导致的问题。你提到:

        • 在 VSCode 中运行节点 时,文件正常生成。
        • 在 外部终端运行节点 时,不生成文件,但节点运行正常,终端输出正常。
        • 重启虚拟机可以临时解决。

        这说明问题不是代码本身,而是 运行环境差异,尤其是 当前工作目录(Current Working Directory, CWD) 和 路径配置。


        ✅ 一、可能原因分析

        1. 当前工作目录(CWD)不同

        在 VSCode 中运行 ROS 节点时,它默认使用你打开的 工作区根目录 或 launch.json 中指定的 cwd。

        而在外部终端中运行节点时,当前工作目录 可能是你当前所在的目录(比如 ~、/home/user、/tmp 等),而不是你的 ROS 工作空间目录(如 ~/catkin_ws)。

        如果你的代码中使用了相对路径(如 "output.txt"),那么生成的文件会出现在当前工作目录下。


        2. 文件权限问题(尤其是虚拟机共享文件夹)

        在虚拟机中(如 VirtualBox + 共享文件夹 / VMware 共享文件夹),某些路径可能因为权限限制导致无法写入文件。

        • VSCode 可能是以用户权限运行的,有写权限。
        • 外部终端可能因为 shell 环境或权限设置不同,导致无法写入目标路径。

        3. ROS 参数服务器路径配置错误

        如果你的代码是通过 ROS 参数服务器获取路径(如 ~output_dir),那么:

        • VSCode 中可能加载了正确的参数配置。
        • 外部终端运行时没有加载参数文件(.yaml),导致路径为空或错误。

        ✅ 二、排查方法

        方法 1:打印当前工作目录

        在你的 ROS 节点中加入以下代码(C++ 示例):

        #include 
        #include 
        #include 
        
        char cwd[PATH_MAX];
        if (getcwd(cwd, sizeof(cwd)) != NULL) {
            ROS_INFO("Current working directory: %s", cwd);
        }
        

        Python 示例:

        import os
        rospy.loginfo(f"Current working directory: {os.getcwd()}")
        

        这样你就可以看到在不同环境中运行时的工作目录是否一致。


        方法 2:检查文件写入路径是否绝对路径

        如果你的代码中写文件使用的是相对路径:

        std::ofstream file("output.txt");
        

        那文件会写入到当前工作目录中。

        建议改成绝对路径或根据 ROS 参数配置路径:

        std::string output_path;
        nh.getParam("~output_path", output_path);  // 从参数服务器获取路径
        std::ofstream file(output_path + "/output.txt");
        

        或者使用 ros::package::getPath() 获取包路径:

        std::string package_path = ros::package::getPath("your_package_name");
        std::ofstream file(package_path + "/output/output.txt");
        

        方法 3:检查文件是否真的没有生成

        在终端中运行:

        find ~/ -name "output.txt" 2>/dev/null
        

        或在虚拟机中搜索整个系统:

        sudo find / -name "output.txt"
        

        确认文件是否真的没有生成,还是只是不在你预期的位置。


        方法 4:检查权限

        如果你的路径是共享文件夹(如 VirtualBox 共享文件夹),尝试在终端中运行:

        ls -ld /path/to/output
        

        确保当前用户有写权限。你也可以尝试手动创建一个测试文件:

        touch /path/to/output/test.txt
        

        如果失败,说明权限有问题。


        ✅ 三、解决方案建议

        ✅ 推荐做法:使用 ROS 参数配置路径

        修改代码,使用参数服务器配置输出路径:

        # config/params.yaml
        output_path: "/home/user/catkin_ws/src/your_package/output"
        

        启动时加载参数:

        roslaunch your_package your_launch_file.launch --params-file config/params.yaml
        

        ✅ 推荐做法:在终端中指定工作目录

        你可以手动指定工作目录运行节点:

        cd ~/catkin_ws
        source devel/setup.bash
        rosrun your_package your_node
        

        或者使用 --cwd(仅限 rosrun 支持):

        rosrun --prefix 'cd /home/user/catkin_ws &&' your_package your_node
        

        ✅ 推荐做法:在 launch 文件中设置工作目录

        如果你用 roslaunch,可以在 .launch 文件中指定工作目录:

        
          
            
          
        
        

        ✅ 四、总结

        原因 解决方法
        当前工作目录不同 使用 getcwd() 打印路径,统一运行目录
        相对路径写入 改为绝对路径或使用 ros::package::getPath()
        参数配置缺失 使用参数服务器统一配置路径
        权限问题 检查路径权限,避免共享文件夹限制
        虚拟机共享路径问题 尝试复制文件到本地路径测试

        🧪 附加建议

        你可以写一个最小可复现问题的测试程序,例如:

        #include 
        #include 
        
        int main() {
            std::ofstream file("test.txt");
            if (file.is_open()) {
                file << "Test content\n";
                file.close();
                std::cout << "File written successfully.\n";
            } else {
                std::cerr << "Failed to open file.\n";
            }
            return 0;
        }
        

        然后分别在 VSCode 和外部终端运行,看是否能生成文件,这样可以快速定位是否是路径问题。


        如果你愿意贴出部分代码片段,我可以帮你具体分析路径写入逻辑。

        我是论坛智能小助理,回答的问题可能是错误的。对于一些可能影响设备的关键问题,请谨慎参考我的回答

        1 条回复 最后回复 回复 引用 0
        • 1 / 1
        • First post
          Last post
        Copyright © 2015-2023 BlueWhale community