此SDK是基于RPLidar激光雷达开发,实现快速划定多点触摸区域范围及大小,将所有触摸点扫描并显示在用户界面上的功能。
RPlidar_multi_touch SDK : 请点击这里下载。
此SDK默认适用于RPLiDAR A2 型号,如果想连接测试波特率为256000的雷达如A3,需要更改multi_touch.json中的波特率的值。 |
使用网口附件板的用户首先需按照下面链接中文档配置好模块IP地址,
https://wiki.slamtec.com/pages/viewpage.action?pageId=10354801
并且将电脑的IP地址配置到同样网段,例如模块默认IP地址为192.168.0.7, 此时可按照如下图片中设置电脑的IP地址。
另外,需要将multi_touch.json中的connect_path参数改为TCP。(此部分将在SDK文件组织结构中介绍)
首先打开位于workspaces\vc10下的 VS 解决方案文件:sdk_and_demo.sln
注意:本文档所使用的应用环境均基于VS2010, 其他版本的VS会出现编译问题。 |
通过USB适配器或者网口附件板接入PC后,首先打开calibration application标定触摸区域,
点击左上角file菜单下load configuration读取对应的配置
请注意这里要读取的multi_touch.json配置文件, 在Debug模式编译下,是存储在..\conf文件目录下,Release模式编译下是存储在workspaces\vc10\demo_project\rplidar_multi_touch\bin文件目录下,放在其他目录下无效。 |
拖动白色虚线框体来标定触摸区域和大小
标定结束后保存区域至conf目录下multi_touch.json文件,图中标定范围为一个1米边长的正方形,即图中白色虚线区域,图中蓝色点为实时扫描的激光点,如步骤5中安装图所示,蓝色点扫描出的是固定在墙面时的房间轮廓。
打开workspaces\vc10\demo_project\rplidar_multi_touch\bin目录下的rplidar_multi_touch_debug.exe。会显示颜色大小不同的圆,代表了每一个TouchPoints。按照之前标定的1m*1m的区域内,将其按照屏幕比例映射显示(此时屏幕分辨率为1920*1080)
Rplidar_multi_touch应用中首先将原始以极坐标系表示的雷达点数据转换成以笛卡尔坐标系表示,如果两个点距离小于0.05m (BlobCombinationThreshold参数),则将两个点融合为一个以两个点为矩形顶点的矩形,矩形长度取两个点中较大x值,宽度取两个点中较大y值,如果融合后的矩形和其他的矩形距离还是小于0.05m,则将两个矩形继续融合,以两个矩形较大长度为新矩形长度,以两个矩形较大宽度为新矩形宽度,融合直到没有矩形或者点两两之间距离小于0.05. 然后根据矩形长度和宽度的大小关系,计算出以长度或者宽度为直径的圆的半径,作为TouchPoints在屏幕上画圆的半径。 |
如果您使用Windows进行开发,请打开位于workspaces\vc10下的 VS 解决方案文件:sdk_and_demo.sln。其中包含了 SDK 项目工程以及所有的示例程序项目。
您可以直接在 VS 环境中使用编译命令对 SDK 本身以及所有示例程序进行编译。按照开发需要,可以选择 Debug 或者 Release 编译方式。编译结果可以 在 output\win32\Debug 或者 output\win32\Release 中找到。
该示例程序演示 PC 通过串口与 RPLIDAR 进行连接,并不断的将在触摸区域内的 RPLIDAR 扫描数据输出的最简单过程。
使用方式:
1) 使用包装里提供的 USB 线连接 RPLIDAR 至 PC 机 (开发板集成了 USB 转 串口芯片)
2)控制台打开workspace\vs10\demo_project\ultra_simple_multi_touch \bin下ultra_rplidar_multi_touch.exe运行程序
如果不指定 COM 设备号,则程序会尝试打开 COM3。
该示例程序演示 PC 通过串口与 RPLIDAR 进行连接,实时采集雷达扫描数据, 并在 GUI 界面上将触摸区域内的点数据融合以后以彩色圆圈的方式显示出来。
使用方式
1) 使用包装里提供的 USB 线连接 RPLIDAR 至 PC 机 (开发板集成了 USB 转 串口芯片)
2) 双击打开 workspace\vs10\demo_project\rplidar_multi_touch\bin下的rplidar_multi_touch_debug.exe运行程序
在配置流程步骤8中已有详细介绍。
该示例程序演示 PC 通过串口与 RPLIDAR 进行连接,实时采集雷达扫描数据, 并在 GUI 界面上将触摸区域内的点数据,以及标定了触摸区域的大小与范围.
使用方式
1) 使用包装里提供的 USB 线连接 RPLIDAR 至 PC 机 (开发板集成了 USB 转 串口芯片)
2) 双击打开 workspace\vs10\demo_project\calibration_app\bin下的rplidar_multi_touch_debug.exe运行程序
3)点击左上方file目录下load configuration,选择..\conf目录下(Debug编译)workspace\vs10\demo_project\calibration_app\bin目录下(Release编译)的对应json文件读取配置,此时雷达会开始转动,界面上会出现雷达扫描点和标定触摸区域的白框,可以手动拖动调整框体的大小和区域。点击file目录下的save configuration可以保存配置好的触摸区域位置信息。
请注意保存的配置文件也必须位于相应同一目录下,否则将无效。 |
SDK的文件结构如下图所示:
文件中包含了此SDK中使用的第三方库,分别是:
conf目录包含一个json格式的配置文件,会在每次开始扫面时读取这个配置文件中的参数,可配置的参数包括
demo_app目录包含了相关的示例程序代码,暂时提供了如下几个示例程序:
一个基于win32的GUI显示程序,获取到当前触摸的点数据后,经过渲染实时的呈现在界面上。
一个基于命令行的演示程序,不断的输出当前的触摸点数据。
SDK目录包含了multi_touch驱动程序的外部头文件(include目录)以及SDK自身的内部实现代码(src目录)。
Workspace目录包含了SDK和相关示例程序的VS工程项目文件。
对于经过编译的 SDK,上述目录结构还会新增 2 个子目录:obj 和 output。 其中 output 目录存放了编译产生的 SDK 静态库(.lib 或者.a)以及示例程序的可 执行文件(exe 或者 elf 格式)。obj 目录存放了编译过程中的中间文件。
至此所有的配置步骤已经SDK介绍就结束了,用户可以通过配置快速将RPLIDAR与Multi_touch SDK结合,通过rplidar_multi_touch应用显示所有的TouchPoints,实现多点触摸的效果。
用户也可以根据Multi_touch SDK进行二次开发,附录中附有SDK头文件和接口函数的简介,以帮助用户快速开发。
app_config.h
定义了多点触摸应用中的配置参数,以及从Json配置文件读取参数的函数与打印调试函数。
message.h
将雷达的扫描点加入时间戳
nodeProcessDevice.h
定义了核心驱动接口 NodeProcessDevice类声明,包含获取雷达的原始点数据并将雷达点数据融合为将显示在屏幕上的圆圈的实现过程。
rplidar.h
一般情况下开发的项目中仅需引入该头文件即可使用RPLidar SDK的所有功能。
rplidar_driver.h
定义了RPLidar SDK核心驱动接口: RPLIdarDriver的类声明。
rplidar_protocol.h
定义了RPLidar 通讯协议文档中描述的底层相关数据接口和常量定义。
rplidar_cmd.h
定义了RPLidar 通讯协议文档中描述的各类请求/应答相关的数据结构和常量定义。
rptypes.h
平台无关的结构和常量定义。
SDK初始化
在用户程序与一个RPLidar设备进行通讯操作前,首先需要创建一个对应的NodeProcessDevice实例,在rplidar_multi_touch中通过ofApp类的构造函数创建了一个NodeProcessDevice实例 proDev_ .
连接RPLidar
在创建NodeProcessDevice实例后,通过createAndStartRPLidar()函数连接到RPLidar设备,支持串口(serial)和网口(TCP)两种模式连接,连接成功返回true。
配置扫描参数
通过startUp()函数来读取Json格式的配置文件中的参数,包括了设置触摸点的面积CropArea的大小。
设置雷达转速
通过setLidarPwm()来调节雷达的转速,默认值为660(占空比60%左右),最大值为1023.
获取雷达扫描点
通过getLidarScan()函数来获取雷达扫描数据,其中调用RPLidar_driver中的grabScanData()函数获取雷达原始数据,通过processScan()函数将原始数据加上带有当前时间的时间戳,并解析这些点的距离,角度数据。
设置屏幕尺寸
通过setScreenSize来设置屏幕的大小。默认值为1920*1080.
获取触摸点数据
通过getTouchPoints()来获取触摸点数据.
获取在触摸区域内的雷达扫描点
通过getScanNodeDrawPoints()来获取雷达扫描点,并判断是否在触摸区域内,将其转换成为以笛卡尔坐标系表示的点供后续调用显示在屏幕上。