我和jetson-Nano的故事(11)——在ros中编译usb_cam

1. 问题背景

最近给jetson nano重装了系统之后,在编译今年人工智能ROS小车比赛用的工程包的时候,遇到一个问题迟迟没有解决,花费了一段时间才弄清楚原因和找到解决办法,现在记录如下

1.1 jetson nano的软件环境版本

这里可以直接使用jtop进行查看,没有jtop的话,先安装一下,安装方法如下:

Jetson Nano上安装jtop的步骤如下

  1. 安装pip3和依赖项:
    打开终端,运行以下命令安装pip3(如果尚未安装):
sudo apt-get install python3-pip python3-dev -y

安装其他依赖项,这些对于jtop的运行是必要的:

sudo apt-get install git cmake  
sudo apt-get install libhdf5-serial-dev hdf5-tools  
sudo apt-get install libatlas-base-dev gfortran
  1. 安装jtop
    使用pip3安装jetson-stats,它包含了jtop:
sudo -H pip3 install jetson-stats

安装完成后,可能需要重启jetson_stats服务:

sudo systemctl restart jetson_stats.service

重启系统以确保所有更改都已生效(可选):

reboot
  1. 运行jtop:

在终端中输入以下命令来启动jtop:

sudo jtop

如果安装后遇到无法运行jtop,并且一直提示重启jtop服务的问题,可以尝试再次使用pip3重新安装jetson-stats。

另外,如果你需要配置CUDA的环境变量,可以运行以下命令来编辑~/.bashrc文件(假设你的CUDA已经正确安装):

  • 查看cuda的bin目录下是否有nvcc:
ls /usr/local/cuda/bin
  • 如果存在nvcc,编辑~/.bashrc文件:
sudo vim ~/.bashrc

在文件末尾添加以下两行(注意在vim中,按I进入插入模式,按Esc退出插入模式,然后按:进入命令模式,输入wq并按Enter保存并退出):

export PATH=/usr/local/cuda/bin:$PATH  
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

保存并关闭文件后,运行以下命令使更改生效:

source ~/.bashrc

以上步骤应该能帮助你在Jetson Nano上成功安装并运行jtop。如果仍然遇到问题,请检查你的网络连接、软件源设置以及任何相关的错误消息,以便进一步诊断问题。



最终显示信息如下,注意OpenCV的版本,最好使用3.2.0的,如果是4.1.1的话,可能会出现冲突。
这里可以直接卸载掉,然后使用ros里面的opencv
其他安装opencv的方式可以参考我的另外一篇博文:
我和jetson-Nano的故事(10)——安装OpenCV3.2.0
在这里插入图片描述



2.问题现象

在使用catkin_make编译usb_cam编译时,报错信息如下

[ 75%] Linking CXX executable /home/agilex/idrive_ws/devel/lib/usb_cam/usb_cam_node
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_packet_from_data'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `sws_scale'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_frame_alloc'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_close'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_frame_get_buffer'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_new_packet'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_alloc_context3'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_log_set_level'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_free_context'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_free'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_open2'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_send_packet'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `sws_getContext'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_image_get_buffer_size'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_parser_close'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_parser_init'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_register_all'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `sws_freeContext'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_receive_frame'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `av_image_copy_to_buffer'
/home/agilex/idrive_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_find_decoder'

3.问题原因及解决办法

出现这些链接错误是因为在编译过程中没有正确链接 FFmpeg 库。为了正确链接这些库,你需要确保 CMakeLists.txt 文件中包含了必要的库和头文件路径。

以下是详细步骤,确保 FFmpeg 库被正确找到并链接:

  1. 安装 FFmpeg 库
    首先,确保系统上安装了 FFmpeg 库。

    sudo apt-get update
    sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
    
  2. 更新 CMakeLists.txt 文件
    编辑你的 ROS 包的 CMakeLists.txt 文件,确保正确链接所有必需的 FFmpeg 库。

    cmake_minimum_required(VERSION 3.0.2)
    project(usb_cam)
    
    find_package(catkin REQUIRED COMPONENTS
      roscpp
      std_msgs
      # Add other required components here
    )
    
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(AV REQUIRED libavcodec libavformat libavutil libswscale)
    
    catkin_package(
      CATKIN_DEPENDS roscpp std_msgs
      DEPENDS AV
    )
    
    include_directories(
      ${catkin_INCLUDE_DIRS}
      ${AV_INCLUDE_DIRS}
    )
    
    add_executable(${PROJECT_NAME}_node src/your_node.cpp)
    
    target_link_libraries(${PROJECT_NAME}_node
      ${catkin_LIBRARIES}
      ${AV_LIBRARIES}
    )
    

    确保 pkg_check_modules 找到所有必要的 FFmpeg 库(libavcodec, libavformat, libavutil, libswscale)。

  3. 清理和重新编译
    在工作空间的根目录下,清理并重新编译:

    catkin_make clean
    catkin_make
    
  4. 完整的 CMakeLists.txt 示例
    这是一个完整的 CMakeLists.txt 示例,它应该能够帮助你正确地配置项目:

cmake_minimum_required(VERSION 2.8.12)
project(usb_cam)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp std_msgs std_srvs sensor_msgs camera_info_manager)

# Find OpenCV
find_package(OpenCV REQUIRED)

## pkg-config libraries
find_package(PkgConfig REQUIRED)
pkg_check_modules(avcodec libavcodec REQUIRED)
pkg_check_modules(avutil libavutil REQUIRED)
pkg_check_modules(swscale libswscale REQUIRED)
pkg_check_modules(AV REQUIRED libavcodec libavformat libavutil libswscale)

###################################################
## Declare things to be passed to other projects ##
###################################################

## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
DEPENDS AV
)

###########
## Build ##
###########

include_directories(include
${catkin_INCLUDE_DIRS}
${avcodec_INCLUDE_DIRS}
${swscale_INCLUDE_DIRS}
${avutil_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
${AV_INCLUDE_DIRS}
)

## Build the USB camera library
add_library(${PROJECT_NAME} src/usb_cam.cpp)
target_link_libraries(${PROJECT_NAME}
${avcodec_LINK_LIBRARIES}
${avutil_LINK_LIBRARIES}
${swscale_LINK_LIBRARIES}
${catkin_LIBRARIES}
${OpenCV_LIBS}
)

## Declare a cpp executable
add_executable(${PROJECT_NAME}_node nodes/usb_cam_node.cpp)
target_link_libraries(${PROJECT_NAME}_node
${PROJECT_NAME}
${avcodec_LINK_LIBRARIES}
${avutil_LINK_LIBRARIES}
${swscale_LINK_LIBRARIES}
${catkin_LIBRARIES}
${OpenCV_LIBS}
${AV_LIBRARIES}
)

#############
## Install ##
#############

## Mark executables and/or libraries for installation
install(TARGETS ${PROJECT_NAME}_node ${PROJECT_NAME}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
)

## Copy launch files
install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
FILES_MATCHING PATTERN "*.launch"
)

install(DIRECTORY include/${PROJECT_NAME}/
 DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
 FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
)
  1. 确保头文件路径和库路径正确
    确保所有必要的头文件路径和库路径都在 include_directoriestarget_link_libraries 中正确配置。如果你的库安装在非标准路径中,可以通过手动设置路径来确保编译器能找到它们。

  2. 调试链接问题
    如果问题仍然存在,可以使用以下命令查看链接器的详细输出,以便进一步调试:

    VERBOSE=1 catkin_make
    

通过这些步骤,你应该能够解决链接错误并成功编译项目。

os2 launch mipi_cam mipi_cam.launch.py [INFO] [launch]: All log files can be found below /home/sunrise/.ros/log/2025-11-14-17-47-51-825078-ubuntu-14892 [INFO] [launch]: Default logging verbosity is set to INFO config_file_path is /opt/tros/humble/lib/mipi_cam/config/ Hobot shm pkg enables zero-copy with fastrtps profiles file: /opt/tros/humble/lib/hobot_shm/config/shm_fastdds.xml Hobot shm pkg sets RMW_FASTRTPS_USE_QOS_FROM_XML: 1 env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting [INFO] [mipi_cam-1]: process started with pid [14893] [mipi_cam-1] [ERROR] [1763113674.411369851] [mipi_cam]: [init]->cap capture init failture. [mipi_cam-1] [mipi_cam-1] [ERROR] [1763113674.411905817] [mipi_node]: [init]->mipinode init failure. [mipi_cam-1] [mipi_cam-1] [WARN] [1763113674.413263630] [mipi_cam]: Enabling zero-copy [mipi_cam-1] [WARN] [1763113674.413371799] [mipi_node]: get camera calibration parameters failed [mipi_cam-1] terminate called after throwing an instance of 'rclcpp::exceptions::RCLError' [mipi_cam-1] what(): could not create publisher: rcl node's context is invalid, at ./src/rcl/node.c:428 [ERROR] [mipi_cam-1]: process has died [pid 14893, exit code -6, cmd '/opt/tros/humble/lib/mipi_cam/mipi_cam --ros-args --log-level warn --ros-args --params-file /tmp/launch_params_c6duu5bp --params-file /tmp/launch_params_rgjrrvi3 --params-file /tmp/launch_params_d7aqt8f6 --params-file /tmp/launch_params_ua6axrd1 --params-file /tmp/launch_params_xirwv3aa --params-file /tmp/launch_params_p2bm87ep --params-file /tmp/launch_params_edyp440a --params-file /tmp/launch_params_1vdzxph0 --params-file /tmp/launch_params_1kwplj95 --params-file /tmp/launch_params_j7lvks4y --params-file /tmp/launch_params_cjdcsdr9 --params-file /tmp/launch_params_aocsmvsq --params-file /tmp/launch_params_7f612z0d --params-file /tmp/launch_params_z8mu6r06'].
最新发布
11-15
<think> 我们正在解决在OS2系统中启动mipi_cam.launch.py时,mipi_cam节点出现的初始化失败无法创建发布者等错误。常见原因包括摄像头硬件连接问题、驱动程序问题、权限问题、ROS2节点配置问题或资源冲突。以下将逐步分析并提供解决方案。 ### 1. 检查硬件连接与摄像头状态 - **物理连接**:确保MIPI摄像头正确连接到开发板(如树莓派、Jetson Nano等)的CSI接口,接触良好。 - **摄像头状态**:使用系统工具验证摄像头是否被识别(如`v4l2-ctl`): ```bash sudo apt install v4l-utils # 安装v4l工具 v4l2-ctl --list-devices # 列出摄像头设备 ``` 若未列出,则可能是硬件问题或驱动未加载。 ### 2. 摄像头驱动与内核支持 - **驱动加载**:检查摄像头驱动是否加载: ```bash lsmod | grep mipi lsmod | grep vc4 # 树莓派相关 ``` 若未加载,尝试加载驱动(如树莓派需启用摄像头接口): ```bash sudo raspi-config # 选择Interfacing Options > Camera > Enable sudo reboot ``` - **设备节点权限**:确保设备节点(如`/dev/video0`)可被当前用户访问: ```bash ls -l /dev/video* ``` 若权限不足,可添加用户到`video`组并重启: ```bash sudo usermod -aG video $USER newgrp video # 或重新登录 ``` ### 3. ROS2节点配置检查 在`mipi_cam.launch.py`中,确认摄像头设备路径与参数: ```python from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='mipi_cam', executable='mipi_cam_node', name='mipi_cam', parameters=[ {'camera_device': '/dev/video0'}, # 确认设备路径 {'image_width': 640}, {'image_height': 480}, # 其他参数... ] ) ]) ``` ### 4. 依赖项检查 - **安装依赖**:确保已安装`v4l2_camera`包`mipi_cam`的依赖: ```bash sudo apt install ros-${ROS_DISTRO}-camera-calibration-parsers \ ros-${ROS_DISTRO}-camera-info-manager \ ros-${ROS_DISTRO}-launch-testing-ament-cmake ``` - **编译包**:重新编译`mipi_cam`包: ```bash colcon build --packages-select mipi_cam source install/setup.bash ``` ### 5. 资源冲突排查 - **设备独占访问**:确保摄像头未被其他进程占用(如其他ROS节点或应用)。关闭可能占用摄像头的程序。 - **ROS节点唯一性**:同一摄像头设备只能被一个节点使用。 ### 6. 调试输出 启动节点时启用调试输出以获取详细信息: ```bash ros2 run mipi_cam mipi_cam_node --ros-args --log-level DEBUG ``` 观察日志中是否有更具体的错误提示(如`VIDIOC_STREAMON`失败可能表示硬件问题)。 ### 7. 测试摄像头独立使用 使用非ROS工具测试摄像头(如`gstreamer`): ```bash gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! autovideosink ``` 若失败,则问题在ROS外部。 ### 8. 更新固件与系统 在嵌入式平台(如树莓派),更新系统固件: ```bash sudo apt update && sudo apt full-upgrade sudo reboot ``` ### 9. 查看ROS2节点代码(可选) 若以上均失败,检查节点源码(如`mipi_cam_node.cpp`)中初始化发布者的部分: ```cpp // 创建发布者示例 image_pub_ = create_publisher<sensor_msgs::msg::Image>("image_raw", 10); ``` 确保话题名称未被占用且资源充足。 ### 总结步骤 1. **硬件连接** → 2. **驱动与权限** → 3. **ROS配置与依赖** → 4. **调试与日志**。 若问题持续,请提供以下信息: - 硬件平台(如树莓派4B) - OS2系统版本(如Ubuntu 20.04 + ROS2 Foxy) - 完整错误日志(启动节点时的终端输出)。 §§相关问题§§ 1. 如何检查ROS2节点的发布者订阅者? 2. ROS2中如何设置摄像头参数(如分辨率、帧率)? 3. 在ROS2中如何解决设备权限问题? </think> 针对在OS2系统中启动`mipi_cam.launch.py`时出现的`cap capture init failure`、`mipinode init failure``could not create publisher`错误,以下是系统性的解决方案: --- ### 一、硬件与驱动层排查 1. **检查摄像头物理连接** - 重新插拔MIPI-CSI摄像头排线,确保金手指无污染或弯曲 - 验证摄像头与开发板(如树莓派/Jetson)兼容性: ```bash dmesg | grep -i csi # 检查内核是否识别设备 ``` 2. **启用摄像头接口** 在树莓派等设备上需手动启用CSI接口: ```bash sudo raspi-config # 选择 Interfacing Options > Camera > Enable sudo reboot ``` 3. **验证V4L2驱动** 检测摄像头是否被系统识别: ```bash v4l2-ctl --list-devices # 查看设备节点(如/dev/video0) v4l2-ctl -d /dev/video0 --info # 检查设备详情 ``` --- ### 二、权限与系统配置 1. **用户组权限修复** 将当前用户加入`video`组: ```bash sudo usermod -aG video $USER newgrp video # 立即生效 ``` 2. **设备节点权限** 临时授予权限(测试用): ```bash sudo chmod 666 /dev/video0 ``` 3. **Udev规则配置** 创建永久规则文件`/etc/udev/rules.d/99-video.rules`: ```udev SUBSYSTEM=="video*", MODE="0666", GROUP="video" ``` 重载规则:`sudo udevadm control --reload` --- ### 三、ROS2节点层修复 1. **检查launch文件参数** 在`mipi_cam.launch.py`中确认设备路径匹配: ```python parameters=[{ 'camera_device': '/dev/video0', # 必须与v4l2检测到的路径一致 'image_width': 640, 'image_height': 480, 'framerate': 30 }] ``` 2. **验证发布者初始化** 在节点源码(如`mipi_cam_node.cpp`)中检查发布者创建逻辑: ```cpp image_pub_ = create_publisher<sensor_msgs::msg::Image>("image_raw", 10); // 确保话题名称有效 ``` 3. **资源冲突检测** 查看是否有其他节点占用摄像头: ```bash ros2 topic list | grep image # 检查重复话题 fuser /dev/video0 # 查看占用进程 ``` --- ### 四、依赖与环境修复 1. **重新编译包** 强制重新编译MIPI摄像头包: ```bash colcon build --packages-select mipi_cam --symlink-install --cmake-clean-first source install/setup.bash ``` 2. **安装缺失依赖** 常见依赖包: ```bash sudo apt install ros-${ROS_DISTRO}-camera-info-manager \ ros-${ROS_DISTRO}-image-transport-plugins ``` 3. **GStreamer验证** 通过底层工具测试摄像头: ```bash gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! autovideosink ``` --- ### 五、调试与日志分析 1. **启用详细日志** 启动节点时开启DEBUG日志: ```bash ros2 run mipi_cam mipi_cam_node --ros-args --log-level DEBUG ``` 2. **关键错误应对** | 错误类型 | 解决方案 | |---------------------------|-----------------------------------| | `cap capture init failure` | 检查`/dev/video*`权限与V4L2支持 | | `could not create publisher` | 确认DDS配置(如CycloneDDS兼容性)| | `mipinode init failure` | 验证摄像头供电与时钟信号 | --- ### 六、终极解决方案 若仍失败,可尝试: 1. 更换为测试过的摄像头型号(如Raspberry Pi Camera Module V3) 2. 降级内核版本(某些版本存在CSI驱动问题): ```bash sudo apt install linux-image-5.15.0-1049-raspi ``` 3. 使用替代驱动包: ```bash git clone https://github.com/ros-drivers/ros2_usb_camera ``` > 提示:在Jetson设备上,建议使用[NVIDIA V4L2驱动](https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fcamera.html)替代标准驱动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joker-wt

我的心愿是——世界和平

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值