0. 前言

  • 关于 ROS1 的 librviz 文档已经很完善了,但 ROS2 下的相关文档目前缺失,但在 ROS2 下开发可视化界面又是一个迫切的需求,好在官方给出了 ROS2 下 librviz 的一个简单范例,在学习的过程中,需要类比 ROS1 下的 librviz,对一些函数和头文件进行替换,迁移也就不那么困难了。
  • 官方的范例是针对目前最新的 ROS2 Rolling 的,头文件和函数相比 ROS2 Foxy 存在一些区别,虽然 Foxy 的支持在今年就截止了,但就像 ROS1 Kinetic 一样,后续一些年仍会有大量人使用该旧版本。我从官方的仓库 fork 了一份,从 ros2 分支迁出了一个 foxy-devel 分支,在此基础进行了完善。
  • Github 仓库连接:visualization_tutorials

1. 基于 QT5 实现 rviz 窗口

  1. 使用 QT 的 ROS2 插件新建一个工作空间,不会的同学可以参考上一篇博客](https://www.guyuehome.com/43738))
  2. 克隆源码:
     cd src
     git clone -b foxy-devel https://github.com/SEUZTh/visualization_tutorials.git
    
  3. 编译后的工作空间下的目录如下,虽然 src 和功能包之间多了一层文件夹,但并不影响编译:
     .
     ├── build
     ├── install
     ├── log
     ├── ros2_rviz.workspace
     ├── ros2_rviz.workspace.user
     └── src
             └── visualization_tutorials
                 ├── interactive_marker_tutorials
                 ├── librviz_tutorial
                 ├── README.md
                 ├── rviz_plugin_tutorials
                 ├── rviz_python_tutorial
                 ├── tutorialformatter.py
                 ├── visualization_marker_tutorials
                 └── visualization_tutorials
    
  4. 使用 QT5 进行编译 。

原仓库中的 ROS2 分支可能是适配了 ROS2 Rolling 版本,在 Foxy 下有的函数和头文件是不存在的,具体修改的内容在这个 commit 中。

  1. 进入工作空间根目录执行:

    source install/setup.sh
    ros2 run librviz_tutorial myviz # 会报很多找不到图标的错,暂时忽略
    
  2. 效果如下:

2. 可视化点云

  1. 修改代码,以在 Rivz 中显示点云话题消息。修改的局部代码如下,参数可以自己修改,可以打开一个 rviz 界面,参考其中存在的参数进行添加和修改:

     manager_->setFixedFrame("livox_frame");
    
     // Create a pointcloud display.
     pointcloud_ = manager_->createDisplay("rviz_default_plugins/PointCloud2", "pointcloud", true);
     if (pointcloud_ == NULL) {
       throw std::runtime_error("Error creating pointcloud display");
     }
    
     // Configure the pointcloud the way we like it.
     pointcloud_->subProp("Topic")->setValue("/livox/lidar"); // 这里改为自己的点云话题消息
     pointcloud_->subProp("Style")->setValue("Points");
     pointcloud_->subProp("Size (Pixels)")->setValue("2");
     pointcloud_->subProp("Color Transformer")->setValue("Intensity");
     pointcloud_->subProp("Invert Rainbow")->setValue("true");
     pointcloud_->subProp("Decay Time")->setValue("5");
    
  2. 该功能在这个 commit 中添加。

  3. livox 的点云可视化效果如下:

3. Livox ROS2 驱动和功能包配置

3.1 Livox 驱动(ROS2)

需要做部分修改才能在 ROS2 下使用,所以这里提一下。

  1. 下载: Livox-SDK
  2. 修改 sdk_core/CMakeLists.txt 中的内容,否则后面的 ROS2 下无法正常编译 Livox ROS2 驱动的工作空间:

     target_compile_options(${SDK_LIBRARY}
             PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall -Werror -Wno-c++11-long-long> -fPIC
             PRIVATE $<$<CXX_COMPILER_ID:AppleClang>:-Wno-unknown-pragmas -Wall -Werror -Wno-c++11-long-long> -fPIC
             PRIVATE $<$<CXX_COMPILER_ID:Clang>:-Wno-unknown-pragmas -Wall -Werror -Wno-c++11-long-long> -fPIC)
    
  3. 编译安装:

     sudo apt install cmake
     # 下载安装包后解压
     cd Livox-SDK
     cd build && cmake ..
     make
     sudo make install
    
  4. 修改电脑的静态ip:

  5. 测试:

     cd build/sample/lidar/
     ./lidar_sample
    

3.2 Livox ROS2 功能包

  1. 克隆代码并编译:

     git clone https://github.com/Livox-SDK/livox_ros2_driver.git ws_livox/src
     cd ws_livox
     colcon build
    
  2. 测试:

     source ./install/setup.sh
     cd ./src/livox_ros2_driver/launch
     ros2 launch livox_lidar_rviz_launch.py # 激光雷达连接模式下
    
  3. 效果如下: