基于激光雷达的人型识别(无人车)

2023-05-16

原文在这 finalobject.cn

这个项目是无人车里的一部分,完成激光雷达的驱动,数据采集然后后期的处理以及人型识别,并不涉及车辆硬件的控制。主要分三个大块讲吧,硬件驱动、数据聚类,以及模式识别,本来还想写一写UI部分的,但是感觉自己的UI写的其实蛮简陋的,所有还是不写了,对UI实现有兴趣的自己拔一下源代码吧。

github:https://github.com/finalObject/HumanDetectingOnLidar

这个项目是我大二时候写的,那时候还不会用github,版本记录都是直接备份实现的,所以在源代码里就会出现很多版本的项目,以最新的为准即可。然后里面files里还有一些项目中用到的硬件驱动库,型号资料。项目里有两个main类,带有radar的是连接雷达实时显示的,不带radar的,是把官方软件储存下来的数据文件作为数据来源。两者就是数据来源不一样。

这是程序的截图

硬件驱动部分

使用的传感器是一只小型的激光雷达,型号UTM-30LX-EW,用到的库直接就是官网下载的java库urg_java_lib,另外files还提供了C++/VS版本的驱动库urg_library-1.2.0。驱动激光雷达的代码封装在RadarReader.java中。

这种小的激光雷达一般可以通过USB连接或者网口连接,当时可能是USB连接驱动装不上吧(忘记了),选择的是网口连接,所以在代码直接输入IP地址就可以进行连接。

device = new UrgDevice(new EthernetConnection());
device.connect("192.168.0.10");
RangeSensorInformation info = device.getInformation();
if(info != null){
    System.out.println("Sensor model:" + info.product);
    System.out.println("Sensor serial number:" + info.serial_number);
}else{
    System.out.println("Sensor error:" + device.what());
}
device.setCaptureMode(CaptureSettings.CaptureMode.MD_Capture_mode);
//We set the capture type to a continuous mode so we have to start the capture
device.startCapture();

然后通过

capData= device.capture()

这个函数就可以获取一帧数据,因为返回的CaptureData类,我写了下面的函数把它解析成了一个数组,以方便后面对于数据的使用

public static int[] setDepthsFromRadar(CaptureData data)

这种激光雷达的基础工作模式其实类似于超声波测距,只不过把超声波换成了激光,然后这个传感器还会旋转。这个型号的激光雷达视场角为270度,所以它一帧的数据其实就是不同角度下,激光雷达和最近不透光障碍物之间的距离。data这里存了用官方软件记录下来的数据,txt格式,直接打开看其实也就是一帧一帧的数据,每一帧数据用一些时间之类的标签,主要还是就是一个数组,储存着测量结果。

我这个函数返回的结果就是把一帧里,所有距离储存成一个数据作为结果返回。至此就完成了硬件的驱动和数据采集。

聚类

因为要进行模式识别把,必须要有识别的对象,如果需要识别每一帧下,这些数据哪几块是人,哪几块是墙。因为一帧数据是整个数组,首先需要在这个数组中,找出哪几个数据点是一块,属于同一个物体,这之后才能进行模式识别。这个就是聚类。上面那张程序截图里,蓝色点就是数据结果,然后聚类之后认为是同一物体的,用红线连接起来了。

这里聚类我没有用那些传统的聚类算法,原因是这个场景比较简单,为了代码效率,放弃了需要大量迭代的k均值。

场景:这里所有数据都是有顺序的,每一个物体拥有的数据点都是连续的。这些数据都是一维的。

基本分类的原则就是,当连续两个点,距离激光雷达的距离相差大于某个阈值是判定不属于同一类。这个阈值如果手动输入的话就会很鸡肋,所有需要设计一个评价标准,让程序自动选择分类效果好的阈值。

每一个类的数据,应该都非常集中的分布在同一个距离范围内,所以可以用所有类数据的标准差之和,来判断集中程度,但是光是这样不够,因为这样一来,最好的分类结果就是所有点自成一类,标准差就全是0了。所以分类结果中,类的数量也必须足够多。因此我设计一个标准,就是【标准差之和】以及【分类类的数量】加权求和,值越小分类效果越小。这样一来遍历所有阈值,选择最好分类效果的就行,这样就实现的聚类。

模式识别

用的是libsvm-3.21这个库,官网提供了各种语言的支持。这部分内容其实很简单了,就是从每一类数据中提取有用的特征,然后开始学习就好了。

用到的特征如下:

  1. 数据长度。可以是数据点的数量,或者是数据起点和终点直接的物理距离(可以用距离和角度算出二维坐标,然后计算距离)
  2. 曲率。就是把这一类数据,拟合成椭圆,计算曲率。因为人体被激光雷达扫描的部分主要就是躯干,差不多就是一个椭圆。可以用这个来筛选墙面之类曲率过小以及垃圾桶之类曲率过大的物体

还有别的参数,但是我具体也说不上来了,自己扒扒代码吧。

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

基于激光雷达的人型识别(无人车) 的相关文章

随机推荐

  • filebeat学习

    注 xff1a 本篇基于filebeat7 5 2 filebeat是什么 xff1f Filebeat 是用于转发和集中日志数据的轻量级传送程序 作为服务器上的代理安装 xff0c Filebeat 监视您指定的日志文件或位置 xff0c
  • Git Flow 用法

    git flow 工作流程 如下图所示 master 分支 master 分支主要方稳定 随时可上线的版本 这个分支只能从别的分支上合并过来 xff0c 一般来讲 xff0c 从develop 上合并 xff0c 或者从hotfix分支上合
  • Qt父窗口与子窗口间的焦点传递问题的完美解决

    使用activateWindow 或者raise 参考文章 xff1a https blog csdn net Hoarce article details 107215868 http www manongjc com detail 19
  • Git 工作中的一些命令操作

    本篇为工作中 git 使用过程中的一些操作记载 xff0c 不定期更新 目录 1 git 推本地代码到远程 2 git 放弃修改 commit 撤销远程提交记录 3 git pull push fetch 4 git关联本地与远程分支 5
  • php如何使用S3

    本篇是新手使用PHP调aws的s3服务的一些心得 一 关于AWS S3 s3是一个文件存储服务 xff0c 当需要做成服务来进行微服务调用 xff0c 或者终端服务端文件交流使用s3是一个非常不错的选择 aws各种常见的语言例如 xff1a
  • MySQL相关面试题

    1 MySQL text长度 mysql的text是65535的字节限制 xff0c 而pg是不限制的 2 覆盖索引 聚簇索引 xff08 https blog csdn net alexdamiao article details 519
  • Redis相关面试题

    1 缓存是什么 xff1f 缓存分为本地缓存和分布式缓存 以Java为例 xff0c guava实现的就是本地缓存 xff0c 生命周期随JVM销毁而结束 起多个服务实例 xff0c 就有多份缓存 xff0c 不具有一致性 redis和me
  • 如何断网安装docker

    docker rpm安装 不能联网情况 生产环境可能是不能联网的 xff0c 当我们需要用到docker 或其他组件 的时候 xff0c 就需要借助能联网的环境下载好rpm包 xff0c 然后去操作系统服务器装下载好的docker RPM包
  • docker相关

    优势 xff1a 1 启动快 传统的虚拟机技术启动应用服务往往需要数分钟 xff0c 而 Docker 容器应用 xff0c 由于直接运行于宿主内核 xff0c 无需启动完整的操作系统 xff0c 因此可以做到秒级 甚至毫秒级的启动时间 大
  • Liunx下源代码安装&&make&&makefile

    Linux下安装软件的方式分为源代码安装和二进制安装 源代码安装 xff0c 即使用应用程序源代码进行编译安装二进制安装 xff0c 例如red hat发行的 rpm包 debian发行的 deb包 源代码安装 用c语言为例 include
  • Linux下rpm&yum&apt-get

    RPM简介 RPM命名 RedHat Package Manager xff0c 简称则为RPM 属于Red Hat阵营的 xff0c 与其并列的则是debian centos中大部分我们安装都是使用yum install xff0c 而d
  • Java面试题复习整理(多线程)

    文章目录 1 aio nio bio epoll select2 reactor模式介绍Reactor软件工程java代码总结 3 Java中的cas乐观锁4 自旋锁是什么 xff1f 自旋锁 amp amp 自适应自旋锁 amp amp
  • Grpc&&protocol buffer结合提供grpc服务

    Grpc amp amp protocol buffer 关于下载 xff1a 首先下载一个protobuf 对于mac系统就brew install protobuf 就可以了 然后可以 protoc version 看下安装的版本号 x
  • 指针p,*p,&p之间的区别

    假设我们定义一个指针p 那么会经常使用到三个符号 xff1a 1 xff0c p xff1b p是一个指针变量的名字 xff0c 表示此指针变量指向的内存地址 xff0c 如果使用 p来输出的话 xff0c 它将是一个16进制数 2 xff
  • 自己经历的Java面试题(附答案)

    本篇记录一下自己面试的一些中大厂的 1 3年Java开发的面试题以及自己对题目理解的答案 xff08 结合网上查的资料 xff09 部分可能更新的不及时 xff0c 有问题可以评论区讨论 面试题不分先后 1 hashmap rehash 过
  • Redisson相关使用&&分布式锁浅析

    注 xff1a 本篇的redisson版本基于3 13 3 xff1b 本篇的demo将我写的源代码贴了出来 xff0c 每个方法都有清晰的注释 xff0c 分布式锁相关的代码以及验证是我手动验证Redis中key状态来判断的 文章目录 简
  • SpringBoot实战elasticSearchAPI微服务开发

    文章目录 前言启动一个ElasticSearchSpringBoot引入ElasticSearch索引创建 amp amp 更新插入删除 写 操作ElasticSearch的API查询操作源码参考 前言 本文准备记录一下ElasticSea
  • Leetcode链表刷题思路汇总

    链表 链表相关的题 xff0c 最快的入门方法就是做题的时候画图 标注A的next节点是哪里 xff0c 单链表的遍历只能是单向的 xff0c 从头结点到尾结点 例如 xff1a 给你一个链表的head头 xff0c 让你返回最后元素的值
  • Java基础之字符串&equals、==、包装类、常量池

    在java中有三中对字符串的操作方式 注 xff1a 文章只注明思路原理 不注明方法 xff0c 看API就行了 文章就涉及到啥写啥了 xff0c 哈哈 xff0c 瞅着可能乱一点 但是这么写就很舒服 1 String 常量 效率较低 指的
  • 基于激光雷达的人型识别(无人车)

    原文在这 finalobject cn 这个项目是无人车里的一部分 xff0c 完成激光雷达的驱动 xff0c 数据采集然后后期的处理以及人型识别 xff0c 并不涉及车辆硬件的控制 主要分三个大块讲吧 xff0c 硬件驱动 数据聚类 xf