# 1 **rs_driver预览**

[English Version](README.md) 



## 1.1 概述

**rs_driver**是RoboSense雷达的驱动库。

可以从[github](https://github.com/RoboSense-LiDAR/rs_driver/releases)下载正式版本。也可以使用git工具得到最新版本。

```
git clone https://github.com/RoboSense-LiDAR/rs_driver.git
```



## 1.2 支持的雷达型号

**rs_driver**支持的雷达型号如下。

+ RS-LiDAR-16
+ RS-LiDAR-32
+ RS-Bpearl
+ RS-Bpearl-V4
+ RS-Helios
+ RS-Helios-16P
+ RS-Ruby-128
+ RS-Ruby-80
+ RS-Ruby-48
+ RS-Ruby-Plus-128
+ RS-Ruby-Plus-80
+ RS-Ruby-Plus-48
+ RS-LiDAR-M1
+ RS-LiDAR-M2
+ RS-LiDAR-E1



## 1.3 支持的操作系统

**rs_driver**支持的操作系统及编译器如下。注意编译器需支持`C++14`标准。

- Ubuntu (16.04, 18.04, 20.04)
  - gcc (4.8+)

- Windows
  - MSVC  (Win10 / VS2019 已测试)



## 1.4 依赖的第三方库

**rs_driver**依赖的第三方库如下。

- `libpcap` (可选。如不需要解析PCAP文件，可忽略)
- `eigen3` (可选。如不需要内置坐标变换，可忽略)
- `PCL` (可选。如不需要可视化工具，可忽略)
- `Boost` (可选。如不需要可视化工具，可忽略)



## 1.5 Ubuntu下的编译及安装

### 1.5.1 安装第三方库

```bash
sudo apt-get install libpcap-dev libeigen3-dev libboost-dev libpcl-dev
```
### 1.5.2 编译

```bash
cd rs_driver
mkdir build && cd build
cmake .. && make -j4
```

### 1.5.3 安装

```bash
sudo make install
```

### 1.5.4 作为第三方库使用

配置您的```CMakeLists.txt```文件，使用find_package()指令找到**rs_driver**库，并链接。

```cmake
find_package(rs_driver REQUIRED)
include_directories(${rs_driver_INCLUDE_DIRS})
target_link_libraries(your_project ${rs_driver_LIBRARIES})
```

### 1.5.5 作为子模块使用

将**rs_driver**作为子模块添加到您的工程，相应配置您的```CMakeLists.txt```文件。

使用find_package()指令找到**rs_driver**库，并链接。

```cmake
add_subdirectory(${PROJECT_SOURCE_DIR}/rs_driver)
find_package(rs_driver REQUIRED)
include_directories(${rs_driver_INCLUDE_DIRS})
target_link_libraries(project ${rs_driver_LIBRARIES})
```



## 1.6 Windows下的编译及安装

### 1.6.1 安装第三方库

#### libpcap

安装[libpcap运行库](https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe)。

解压[libpcap开发者包](https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip)到任意位置，并将```WpdPack_4_1_2/WpdPack``` 的路径添加到环境变量```PATH```。

#### PCL

如果使用MSVC编译器，可使用PCL官方提供的[PCL安装包](https://github.com/PointCloudLibrary/pcl/releases)安装。

安装过程中选择 `Add PCL to the system PATH for xxx`。
![](./img/01_install_pcl.png)

### 1.6.2 安装

Windows下，**rs_driver** 暂不支持安装。

### 1.6.3 VS工程文件

工程目录`rs_driver/win`下，有编译实例程序和工具的MSVS工程文件。

关于Windows下编译和使用**rs_driver**的更多说明，可以参考[如何在Windows下编译rs_driver](doc/howto/16_how_to_compile_on_windows_CN.md)



## 1.7 示例程序

**rs_driver**在目录```rs_driver/demo``` 下，提供了两个示例程序。

- `demo_online.cpp`

`demo_online`解析在线雷达的数据，输出点云。


- `demo_pcap.cpp`

`demo_pcap`解析PCAP文件，输出点云。编译`demo_pcap`需要安装`libpcap`库。

要编译这两个程序，需使能`COMPILE_DEMOS`选项。

```bash
cmake -DCOMPILE_DEMOS=ON ..
```

关于`demo_online`的更多说明，可以参考[如何连接在线雷达](doc/howto/08_how_to_decode_online_lidar_CN.md)

关于`demo_pcap`的更多说明，可以参考[如何解码PCAP文件](doc/howto/10_how_to_decode_pcap_file_CN.md)



## 1.8 点云可视化工具

**rs_driver**在目录```rs_driver/tool``` 下，提供了一个点云可视化工具`rs_driver_viewer`。

要编译这个工具，需使能`COMPILE_TOOS`选项。编译它需要安装PCL库和Boost库。

```bash
cmake -DCOMPILE_TOOLS=ON ..
```

关于`rs_driver_viewer`的使用方法，请参考[如何使用可视化工具rs_driver_viewer](doc/howto/14_how_to_use_rs_driver_viewer_CN.md) 



## 1.9 接口文件

**rs_driver**的主要接口文件如下。

- 点云消息定义: ```rs_driver/src/rs_driver/msg/point_cloud_msg.hpp```, ```rs_driver/src/rs_driver/msg/pcl_point_cloud_msg.hpp```
- 接口定义: ```rs_driver/src/rs_driver/api/lidar_driver.hpp```
- 参数定义: ```rs_driver/src/rs_driver/driver/driver_param.hpp```
- 错误码定义: ```rs_driver/src/rs_driver/common/error_code.hpp```



## 1.10 更多主题

关于**rs_driver**的其他主题，请参考如下链接。

+ **rs_driver**工程中包括哪些例子、工具、和文档？

请参考[rs_driver的目录结构](doc/intro/02_directories_and_files_CN.md) 

+ **rs_driver**有`v1.3.x`和`v1.5.x`两个版本？该选哪一个？现在正在使用`v1.3.x`，需要升级到`v1.5.x`吗？如何升级？

请参考[如何从v1.3.x升级到v1.5.x](doc/howto/07_how_to_port_your_app_from_rs_driver_1.3.x_to_1.5.x_CN.md) 

+ Windows上如何编译**rs_driver**？

请参考[如何在Windows上编译rs_driver](./doc/howto/16_how_to_compile_on_windows_CN.md)

+ **rs_driver**的接口如何设计的？如何将**rs_driver**集成到我的系统中，有什么注意事项吗？

请参考[rs_driver的线程模型与接口设计](./doc/intro/03_thread_model_CN.md)

+ **rs_driver**如何集成到我自己的系统中？有参考的例子吗？有多雷达的例子吗？

请参考[如何连接在线雷达](doc/howto/08_how_to_decode_online_lidar_CN.md)，[如何解析PCAP文件](doc/howto/10_how_to_decode_pcap_file_CN.md)。

+ 在单播、组播、广播的情况下，应该如何配置**rs_driver**的网络选项？在多雷达的情况下如何配置？在VLAN的情况下如何配置？可以在MSOP/DIFOP数据的前后加入自己的层吗？这些网络配置都确认无误，用抓包软件也能抓到MSOP/DIFOP包，为什么还是接收不到点云？

请参考[在线雷达 - 高级主题](doc/howto/09_online_lidar_advanced_topics_CN.md) 

+ 一般情况下，PCAP文件中只有一个雷达的数据，如何配置网络选项？ 如果文件中有多个雷达的数据，如何配置？ 在VLAN的情况下如何配置？可以在MSOP/DIFOP数据的前后加入自己的层吗？

请参考[PCAP文件 - 高级主题](doc/howto/11_pcap_file_advanced_topics_CN.md) 

+ 手上只有一个PCAP文件，可以根据它确定**rs_driver**的网络配置选项吗？包括连接在线雷达和解析PCAP文件。

请参考[根据PCAP文件确定网络配置选项](doc/howto/12_how_to_configure_by_pcap_file_CN.md)

+ **rs_driver**支持什么格式的PCAP文件？如何录制这样的文件？

请参考[如何为rs_driver录制PCAP文件](doc/howto/13_how_to_capture_pcap_file_CN.md)

+ 想编译示例程序/小工具，怎么指定编译选项？ **rs_driver**丢包了，如何解决？**rs_driver**的CPU占用率？点云的时间戳是UTC时间，能改成本地时间吗？嵌入式平台不需要解析PCAP文件，可以不编译这个特性吗？如何启用点云坐标转换功能？

请参考[rs_driver CMake编译宏](./doc/intro/05_cmake_macros_intro_CN.md)

+ **rs_driver**如何指定雷达类型？如何指定数据源为在线雷达、PCAP文件或用户数据？ 想先试用一下，但是对雷达作PTP时间同步很麻烦，可以先用电脑的系统时间给点云打时间戳吗？想节省一点内存空间，可以丢弃点云中的无效点吗？点云的时间戳来自它的第一个点，还是最后一个点？可以配置吗？点云坐标转换的位移、旋转参数如何设置？机械式雷达的分帧角度可以设置吗？

请参考[rs_driver配置选项](./doc/intro/04_parameter_intro_CN.md)

+ **rs_driver**报告了一个错误`ERRCODE_MSOPTIMEOUT`/`ERRCODE_WRONGMSOPID`/`ERRCODE_PKTBUFOVERFLOW` ...... 这个错误码是什么意思？

请参考[rs_driver错误码](./doc/intro/06_error_code_intro_CN.md)

+ 如何将点云变换到另一个位置和角度上去？

请参考[点云坐标变换](doc/howto/15_how_to_transform_pointcloud_CN.md) 

+ RoboSense雷达的数据量有多大？在什么情况下可能丢包？怎么避免？

请参考[丢包问题以及如何解决](doc/howto/17_how_to_avoid_packet_loss_CN.md)

+ **rs_driver**要占用多少CPU和内存？

请参考[rs_driver的CPU和内存占用](doc/howto/20_about_usage_of_cpu_and_memory_CN.md)

+ 点在点云中是怎样布局的？点坐标的参考系是什么？点的通道号指什么？点的时间戳来自哪里？

请参考[点云中点的布局](doc/howto/18_about_point_layout_CN.md)

+ RoboSense雷达怎么分帧？RoboSense使用UDP协议，万一丢包或乱序，会影响**rs_driver**的分帧处理吗？

请参考[RoboSense雷达如何分帧](doc/howto/19_about_splitting_frame_CN.md)

+ 希望进一步深入了解**rs_driver**的设计细节？

请参考[rs_driver源代码解析](doc/src_intro/rs_driver_intro_CN.md)

