You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS2 C++节点获取argv参数、Colcon预编译文件修改及ONNX项目咨询

在ROS2 C++节点中获取argv[1]传递的信息

当然可以,rclcpp::init(argc, argv)仅用于初始化ROS2运行环境,不会消耗或修改argc和argv参数。你可以直接在main函数中判断参数数量,读取argv[1]的值,再传递给节点逻辑使用:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    std::string input_source = "camera"; // 默认使用相机
    if (argc > 1) {
        input_source = argv[1];
    }
    auto node = rclcpp::Node::make_shared("face_recognition_node");
    RCLCPP_INFO(node->get_logger(), "当前输入源: %s", input_source.c_str());
    
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}
Colcon build编译时能否编辑预编译文件

不建议手动编辑Colcon build生成的预编译文件(如CMake自动生成的Makefile、中间目标文件、自动生成的代码等),原因如下:

  • 这类文件是编译系统自动生成的,下次执行colcon build时会被完全覆盖,手动修改的内容会丢失。
  • 手动修改可能破坏编译依赖关系,导致编译失败或程序运行异常。

如果需要调整编译配置,正确做法是修改包内的CMakeLists.txt、package.xml或自定义脚本,再重新执行colcon build,让编译系统自动更新相关文件。

ONNX人脸识别项目实现便捷输入视频文件名(默认用相机)

结合ROS2的参数处理逻辑,在main函数中通过argv判断输入,再配合OpenCV完成视频/相机的切换:

#include "rclcpp/rclcpp.hpp"
#include <opencv2/opencv.hpp>
#include "face_recognizer.hpp" // 你的ONNX人脸识别类头文件

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("face_recognition_node");
    
    cv::VideoCapture cap;
    std::string input_source;
    if (argc > 1) {
        input_source = argv[1];
        cap.open(input_source);
        if (!cap.isOpened()) {
            RCLCPP_ERROR(node->get_logger(), "无法打开视频文件: %s", input_source.c_str());
            rclcpp::shutdown();
            return -1;
        }
    } else {
        // 默认打开系统默认相机(设备ID通常为0)
        cap.open(0);
        if (!cap.isOpened()) {
            RCLCPP_ERROR(node->get_logger(), "无法打开默认相机");
            rclcpp::shutdown();
            return -1;
        }
        input_source = "默认相机";
    }

    RCLCPP_INFO(node->get_logger(), "正在处理输入源: %s", input_source.c_str());
    
    FaceRecognizer recognizer; // 初始化ONNX人脸识别器
    cv::Mat frame;
    while (rclcpp::ok() && cap.read(frame)) {
        recognizer.process_frame(frame); // 执行人脸识别逻辑
        cv::imshow("人脸识别结果", frame);
        if (cv::waitKey(1) == 27) { // 按ESC键退出
            break;
        }
    }

    cap.release();
    cv::destroyAllWindows();
    rclcpp::shutdown();
    return 0;
}

同时需要在CMakeLists.txt中链接OpenCV库,确保编译通过:

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(face_recognition_node src/face_recognition_node.cpp)
ament_target_dependencies(face_recognition_node rclcpp)
target_link_libraries(face_recognition_node ${OpenCV_LIBS})

install(TARGETS face_recognition_node
  DESTINATION lib/${PROJECT_NAME})

运行时直接传递视频文件名即可:ros2 run your_package face_recognition_node /path/to/your/video.mp4,不传递参数则自动使用相机。

内容的提问来源于stack exchange,提问作者petitbouchon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:04:56