WSL2部署Livox_ROS_SDK踩坑

环境

Windows 11, WSL2, Ubuntu 20.04, ROS Noetic, Livox SDK, Livox ROS Driver

ROS Noetic

使用一键安装脚本安装ROS Noetic

1
wget http://fishros.com/install -O fishros && . fishros

Livox SDK

1
2
3
4
5
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
cd build && cmake ..
make
sudo make install

Livox-SDK Github

Livox ROS Driver

1
2
3
4
git clone https://github.com/Livox-SDK/livox_ros_driver.git ws_livox/src
cd ws_livox
catkin_make
source ./devel/setup.sh

Livox-ROS-Driver Github

遇到的问题

  • 问题:cmake报错c++: fatal error: Killed signal terminated program cc1plus
  • 解决:限制并行编译数,使用单线程编译,降低内存峰值:
    1
    2
    3
    make -j1
    # 或者
    cmake --build . -- -j1

Livox ROS Driver运行

1
roslaunch livox_ros_driver livox_lidar_rviz.launch

遇到的问题

  • 问题:使用WSL2的Mirrors时,可能会出现无法连接到设备的问题,导致在RViz中无法显示点云数据,但是在Livox Viewer中可以正常显示。
  • 解决:可能由于Livox_ROS_Driver1无法选择Lidar所在的子网,只扫描了默认网课loopback0。则修改为使用WSL2的Bridged桥接模式。
  1. 在Hyper-V管理器中添加虚拟交换机:

    • 打开Hyper-V管理器
    • 选择“虚拟交换机管理器”
      打开Hyper-V管理器
    • 选择“新建虚拟网络交换机”,选择“外部”,命名为Livox_Bridged
      新建虚拟网络交换机
    • 选择要连接的物理网卡,点击“确定”
      选择要连接的物理网卡
  2. 修改WSL2的c盘用户目录的配置文件.wslconfig,添加如下内容:

    1
    2
    3
    [wsl2]
    networkingMode=bridged
    vmSwitch=Livox_Bridged # 刚才设置的虚拟交换机
  3. 重启WSL2

    1
    wsl --shutdown
  4. 在WSL中设置固定ip

    1
    sudo vim /usr/lib/systemd/network/wsl_external.network
    1
    2
    3
    4
    5
    6
    7
    [Match]
    Name=eth0
    [Network]
    Description=bridge
    DHCP=false
    Address=192.168.1.140/24
    Gateway=192.168.1.1

livox_camera_lidar_calibration

参考官方安装教程

遇到的问题

  • 问题:ceres版本不兼容,需要替换为apt源的ceres1.4

  • 解决

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 1⃣ 彻底删除 /usr/local 下的旧痕迹
    sudo rm -rf /usr/local/include/ceres
    sudo rm -rf /usr/local/lib/libceres*
    sudo rm -rf /usr/local/lib/cmake/Ceres

    # 2⃣ 确保只装官方包(1.14)
    sudo apt update
    sudo apt install --reinstall libceres-dev

    # 3⃣ 清理工作空间缓存再编
    cd ~/ws_livox
    rm -rf build devel
    catkin_make -j$(nproc)
  • 问题:/usr/include/pcl-1.10/pcl/common/impl/io.hpp:73:7: note: no known conversion for argument 1 from ‘const pcl::PCLPointField’ to ‘const int&’

  • 解决
    PCL字段索引错误

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 进入包源码目录
    cd ~/ws_livox/src/livox_camera_lidar_calibration

    # 用 sed 快速替换所有潜在写法
    sed -i 's/getFieldIndex\s*(\s*cloud\.fields\[[^]]*\]/getFieldIndex(cloud.fields/' src/color_lidar_display.cpp

    # 重新编译:

    cd ~/ws_livox
    rm -rf build devel # 清掉上次失败的中间文件
    catkin_make -j$(nproc)
  • 问题:PCL 1.10 的很多内部实现(尤其是 pcl/common/io.hpp 里的 auto λ表达式)用到了 generic lambda,而 generic lambda 只在 C++14 及以后 才被支持。当前的 CMAKE_CXX_FLAGS = -std=c++11,于是编译器在替换模板时疯狂报「no match for call … const int&」。

  • 解决:Generic Lambda 需要 C++14 或以上
    CMakeLists.txt 中加入:

    1
    2
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)

    完整的 CMakeLists.txt 文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    cmake_minimum_required(VERSION 3.0.2)
    project(camera_lidar_calibration)

    ## Compile as C++11, supported in ROS Kinetic and newer
    # add_compile_options(-std=c++11)
    #set(CMAKE_BUILD_TYPE "Release")
    #set(CMAKE_CXX_FLAGS "-std=c++11")
    #set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    add_compile_options(-O3 -Wall)

    ## 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
    roscpp
    rospy
    std_msgs
    pcl_conversions
    pcl_ros
    cv_bridge
    )

    find_package(PCL REQUIRED)
    find_package(OpenCV)
    find_package(Threads)
    find_package(Ceres REQUIRED)

    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)

    list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")

    catkin_package(
    CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
    )

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

    ## Specify additional locations of header files
    ## Your package locations should be listed before other locations
    include_directories(
    # include
    ${catkin_INCLUDE_DIRS}
    ${PCL_INCLUDE_DIRS}
    ${OpenCV_INCLUDE_DIRS}
    )

    add_executable(cameraCalib src/cameraCalib.cpp)
    target_link_libraries(cameraCalib ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

    add_executable(pcdTransfer src/pcdTransfer.cpp src/common.h)
    target_link_libraries(pcdTransfer ${catkin_LIBRARIES} ${PCL_LIBRARIES})

    add_executable(cornerPhoto src/corner_photo.cpp src/common.h)
    target_link_libraries(cornerPhoto ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})


    add_executable(getExt1 src/cam_lid_external1.cpp src/common.h)
    target_link_libraries(getExt1 ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${CERES_LIBRARIES})

    add_executable(getExt2 src/cam_lid_external2.cpp src/common.h)
    target_link_libraries(getExt2 ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${CERES_LIBRARIES})


    add_executable(projectCloud src/projectCloud.cpp src/common.h)
    target_link_libraries(projectCloud ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

    add_executable(colorLidar src/color_lidar_display.cpp src/common.h)
    target_link_libraries(colorLidar ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${CERES_LIBRARIES})

参考资料

  1. 鱼香 ROS 一键安装脚本
  2. Livox-SDK GitHub
  3. Livox-ROS-Driver GitHub
  4. WSL2 桥接网络并固定 IP 方法 (CSDN)
  5. ChatGPT o3 Model