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
相关产品推荐
相关产品推荐

