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

发布于:2024-05-17 ⋅ 阅读:(222) ⋅ 点赞:(0)

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
    

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


网站公告

今日签到

点亮在社区的每一天
去签到