思岚雷达rplidar S1配置调试全纪录

2023-05-16

耗时10天,终于从零开始用QT在Ubuntu系统下完成了一个雷达避障系统的设计,这文章的主要目的是将配置的流程和遇到的问题记录下来,以供自己以后遇到一样的问题时可以有个参考。

一.思岚雷达的配置

1.配置的基本条件
本次对思岚雷达的配置主要是Ubuntu18.04系统下完成,在Windows下的配置本质和Ubuntu上的大同小异(事实上有现成例程拿来改改就能用),主要是对SDK包的使用+内部函数的调用,别忘了把雷达的波特率调到256000,一头插电源,一头插在主机上,别插反了

特别提醒!新配置的Ubuntu电脑,不要忘记开启串口的权限!!没有权限自然无法打开雷达,你debug到明天也找不到问题!!

  1. SDK包的使用方法
    下载官方的SDK包后(https://download.slamtec.com/api/download/rplidar-sdk/1.11.0?lang=netural),将SDK包在解压到想要的目录下后,在该目录下调用 make 编译,编译后出的东西在SKD包的output 文件夹内,如果你急于测试雷达是否能用,可以把雷达插入USB口后,确认对应的USB口名字后(一般是ttyUSB0),进入 ./output/linux/Release/文件夹,进入终端,输入./ultra_simple ttyUSB0 或者别的(各个小例程都有自己的输入方式,这是其中一种,注意波特率),就能看见终端不断输出雷达发给你的坐标信息,这些小程序基本没有实际的用处,但是可以把里面代码用作参考,也可以用来测试雷达坏了没。
    如果想自己使用这些包,最简单的方法就是将SDK内头文件源文件都包含进去(目录在,SDK/SDK/include和SDK/SDK/src),然后将之前用make 编译出来 共享库 包含进去(目录在output,和可执行文件摆在一起),我使用的是QT,在pro文件内将以上都包含后,在雷达相关的类内添加#include“rplidar.h”即可,其余所有的雷达相关的都包含在里面了。

  2. 使雷达正常使用最起码需要调用的函数
    写在最前,别忘了在雷达有关的源文件中设置好namespace:using namespace rp::standalone::rplidar;

    ①:RPlidarDriver * drv = RPlidarDriver::CreateDriver(DRIVER_TYPE_SERIALPORT);
    该函数可以创造一个雷达对象,做雷达的操作都靠这个类
    ②:drv->connect(path, baud)
    该方法可以建立与雷达的连接,前者是USB口的名字,后是波特率(强烈建议直接写256000),比如默认下,drv->connect(“dev/ttyUSB0”, 2560000) 就行了,会返回一个参数,用IS_OK() 来验证是否连接成功。如果想断开连接就调用 disconnect()方法。
    ③:op_result = drv->getDeviceInfo(devinfo);
    在连接成功后,使用这个函数可以得到一个devinfo类(当然这个类需要事先声明),该类内有雷达的基本属性,可以用这些属性来辨识雷达,当同时使用多个雷达时,实现自动识别。
    devinfo.serialnum[pos]
    devinfo.firmware_version>>8
    devinfo.firmware_version & 0xFF
    (int)devinfo.hardware_version);
    ④:checkRPLIDARHealth(drv)
    在启动前,调用下看看雷达坏了没,正常的使用流程。
    ⑤:drv->startMotor();
    // start scan…
    drv->startScan(0,1);
    // fetech result and print it out…
    以上是标准的开启流程,调用后,雷达电机开始旋转,开始输出雷雷达点。
    另外,drv->stop(); drv->stopMotor();可以关闭雷达,停止扫描
    ⑥: rplidar_response_measurement_node_hq_t nodes[8192];
    size_t count = _countof(nodes);
    op_result = drv->grabScanDataHq(nodes, count,0);
    前两行创造俩个参数,前者是储存雷达点的数组,后者是记录雷达点数的数字(其实直接写8192不就得了?),最后调用方法得到扫描得到的扫描点,值得注意的是,方法的第三个参数是雷达的超时时间,不写就默认的超时时间,如果写个0就会执行非阻塞输出,你什么要什么时候给你,一般用0就满足需求了。

    二.QT程序架构

    1. 大体结构:主要功能分为三块,
      雷达类:专门用来提供与雷达控制相关的方法,虽然本来SDK就给了方便的方法,但是上位机不需要这么细的功能,再次封装下,只留几个需要的功能做成方法,同时由于雷达传输上来的数据是不能直接使用的,所以需要再创一个数组用来储存这些可以直接使用的数据。
      UI类:包含雷达类,设置按钮来调用雷达类的方法,同时获得雷达传上来的数据,在雷达图上画点,直观的表现雷达显示情况。
      多线程处理部分:这是雷达程序最核心的部分,用来实时处理雷达数据,由于处理8000+个点必然需要时间,而雷达图不能有卡顿,所以需要用多线程处理,起码分出俩个线程,一个线程专门获得雷达的数据点,然后进行处理变成可以直接使用的雷达点数据,另外一个不停的检索处理好的数据点,当发现某个特征时(比如某个距离内的点数过多),就发出信号。

    2. 雷达部分:雷达两大任务,一是封装方法,我只留下启、停、连接、断开连接、获得雷达数据等几个方法,内部再加上几个判断,防止出BUG。同时在头文件内声明一个结构,代替原有的雷达点结构,同时添加一个bool usbable属性,如果质量不高或者距离是0的废点,就标记为false,处理时直接略过。内部存有俩个大数组,一个是储存雷达发送的原始数据(note),一个是储存处理后的数据(dian),这俩个数组只有一个类拥有他们的写入权限,其余的只有读取权限,防止多线程下的混乱。

    3. 多线程处理部分:为了避免各个任务间排队导致卡顿,所以只能采用多线程解决问题,所有对雷达数据的处理都放在多线程处,方法采用的是对Qthread继承。一个多线程为leida_thread,不停的读取雷达的数据,然后转化成合适的格式写入dian数组中,另一个多线程为chuli_thread,不停的读取dian数组,通过设定好的逻辑作判定,如果判定出特殊情况,则 emit fasong(int),改变UI界面的部分设置,实现需要的效果。俩个多线程都自带bool isstop判定,如果从外部将isstop改为true,则线程结束。同时多线程与ui或者其他类的通讯采用QT自带的信号槽结构,需要发送信号时使用emit,从而实现对指定类的内部的指定方法的调用,实现类之间的信号传输。

    4. UI部分结构:UI结构是该软件的核心,包含了雷达类和多线程类,但是没有数据的改变权限,只是负责连通和显示。ui通过画图的形式实现对雷达图的绘制,自带定时器,定时器到时间后触发timeout信号,然后连接timertimeout,函数内调用update函数,实现对画面的更新。在初始化的函数中需要完成对雷达类,多线程类的配置,需要准备好和多线程类的对接。

    三.调试中得到的经验

    1.取雷达点认准
    u_result ans=drv->grabScanDataHq(dian,count,0);
    设置超时会导致收到一大堆0,用这个函数已经足够解决绝大多数的问题了。
    2.不需要真的采集8192个点,由于是非阻塞模式,一般也就2000+个点是有数字的,而且最坑爹的是,完成一圈也就是1012个点,之后的1000+个点是类似于记忆点的形式,它会自动判断哪些点是长期存在的,从而在一段时间后记忆下来,如果全部显示到屏幕上就会发生俩套图的现象,如果你只想要实时的图,建议只处理1013个点,之后的点随他去吧。
    3.多线程方面,由于UI类必然是主线程而且不能多线程,所以建议不要过多打断update函数的运转,具体操作比如在chuli_thread线程连接的方法内,不要直接动手修改ui,而是只改变某个参数(比如bool xianshi 这种)具体的ui变化全都放在update函数内执行,这样可以避免不必要的卡顿。
    4.对于这类动则几千个参数的数组,而且大小几乎不变的,个人建议用最简单的数组,而不是容器,在官方的SDK例程中用的是容器,但是在我的架构下频繁清除容器再填充很容易死机,而且还卡,直接用数组同时控制好写入权限,很流畅而且稳定性也高了很多

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

思岚雷达rplidar S1配置调试全纪录 的相关文章

随机推荐

  • 一起自学SLAM算法:第10章-其他SLAM系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第11章-自主导航中的数学基础

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:11.5 强化学习与自主导航

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第12章-典型自主导航系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第13章-机器人SLAM导航综合实战

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:13.4 基于自主导航的应用

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 在ubuntu18.04中安装opencv_contrib-3.2.0闭坑记录

    由于最近要在OpenCV3中使用SIFT和SURF特征提取 xff0c 而自从OpenCV2升级到OpenCV3版本后 xff0c SIFT SURF等这些算法都被移出opencv默认项目库 xff0c 而被放到叫opencv contri
  • 在ROS中使用超声波(sonar)导航避障

    1 下载sonar layer的代码 https github com DLu navigation layers 实际只需要其中的range sensor layer放到工作空间catkin make 实验时放置于src中 xff0c 可
  • rtabmap更加适合视觉SLAM建图和导航

    slam问题目前主要集中在如何建立一个好的地图 xff0c 至于后续如何使用地图这部分工作研究的不多 xff0c 不过我个人恰好在做这部分工作所以答一下个人见解 首先 xff0c 有一张好的地图 xff0c 是导航或地图语义分析等应用的前提
  • Git应用详解第十讲:Git子库:submodule与subtree

    https www cnblogs com AhuntSun blog p 12736934 html 前言 前情提要 xff1a Git应用详解第九讲 xff1a Git cherry pick与Git rebase 一个中大型项目往往会
  • 单片机串口通信程序

    本文总结了两种比较简单的关于串口发送接收的程序 xff0c 以下是步骤 xff1a 定义数据 xff1a unsigned char idata URX 10 61 0 串口接收数组 unsigned char idata URX Num
  • Linux当中的压栈和出栈指令以及跳转指令详细教程

    1 跳压栈出栈指令 xff1a 我们通常会在 A 函数中调用 B 函数 xff0c 当 B 函数执行完以后再回到 A 函数继续执行 要想 再跳回 A 函数以后代码能够接着正常运行 xff0c 那就必须在跳到 B 函数之前将当前处理器状态保存
  • MySQL5.7版本在Ubuntu(WSL环境)系统安装

    课程中配置的WSL环境是最新的Ubuntu22 04版本 xff0c 这个版本的软件商店内置的MySQL是8 0版本 所以我们需要额外的步骤才可以安装5 7版本的MySQL 安装操作需root权限 xff0c 你可以 xff1a 通过 su
  • 动态库静态库的区别

    1 制作过程 静态库 xff1a 生成 o文件后 ar rcs o libxxx a 动态库 xff1a 生成 o文件时 xff0c 静态库是 c选项 xff0c 而动态库是 fpic FPIC xff0c 因为动态库需要生成与位置无关的代
  • 怎么把PWM信号转为模拟量

    有一个测量位置变化的位置传感器 xff0c 用万用表电压档测量传感器的输出信号 xff0c 结果显示的是模拟量信号 xff0c 即位置和信号输出大小呈线性关系 但是 xff0c 用示波器 xff08 Picoscope 4227 xff09
  • STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用

    STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过 xff0c 均为工程文件格式 xff0c 可直接编译使用 该程序为大数据量吞吐的串口收发例程 xff0c 中断接收 xff0c 边
  • C语言中的函数返回值、return用法、return 0详解

    1 函数返回值 定义 xff1a 函数的返回值是指函数被调用之后 xff0c 执行函数体中的代码所得到的结果 xff0c 这个结果通过return语句返回 没有返回值的函数为空类型 xff0c 用void表示 一旦函数的返回值类型被定义为
  • TCP协议

    TCP xff08 Transmission Control Protocol xff09 是面向连接的可靠的通讯协议 TCP需要经过三次握手建立连接 xff0c 并在断开时通过四次挥手释放连接 TCP通过应答确认 超时重传 xff08 R
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • 思岚雷达rplidar S1配置调试全纪录

    耗时10天 xff0c 终于从零开始用QT在Ubuntu系统下完成了一个雷达避障系统的设计 xff0c 这文章的主要目的是将配置的流程和遇到的问题记录下来 xff0c 以供自己以后遇到一样的问题时可以有个参考 一 思岚雷达的配置 1 配置的