描述 在自动驾驶与机器人导航中,我们经常会使用到栅格地图:利用SLAM技术将车在一定范围内进行移动,依靠视觉或雷达传感器,对区域内的障碍物进行感知,得到一个指定分辨率指定大小的栅格地图,每个像素点代表了被占据的概率。随后在栅格地图上,我们可以进行例如A*这样的路径规划算法。 而在实际工程中,栅格地图有诸多不变。首先就是构建和维护的困难,本人之前工作中遇到了很多工业的场景,机器人在建图后短时间内
描述 上一篇文章介绍了匈牙利匹配算法的原理,这一篇文章我们来分析另一种好用的匹配算法——KM算法 匈牙利匹配算法是一个二分图匹配算法,但对于任意两顶点的匹配都是等价的。显然,如果我们面对特征匹配任务时,特征A可能和特征B、特征C都产生了关联。如何在B与C之间选择更佳的匹配呢。这就是KM算法优于匈牙利匹配的地方。 KM算法原理 KM算法是在匈牙利算法的衍生算法,在二分图匹配的问题上增加权重,
描述 最近在做特征级别的感知结果融合算法。我的工作目的,是要将多种不同传感器的感知结果,通过一定的机制融合起来,得到融合后的感知结果。为此看了一些资料,了解到Apollo中使用了匈牙利匹配算法,之前不懂就学习了一下。这个算法挺好理解的,将个人对匈牙利匹配算法的理解写在这里。 这篇感觉是我写过最搞笑的文章。。。 算法论文:The Hungarian Method for the Assig
描述 如题。一年前我写过另外一篇位姿变换的文章,但最近事情太多,脑子乱的很。而我又面临一些比较重要的开发任务,其中会涉及到一些简单的坐标变换。但坐标系有很多,导致我写代码时总得再花点时间来确定什么基坐标系啊自定义坐标系。 于是,我决定再写一篇更直白的文章,以节省以后的时间。这篇文章会涉及到自动驾驶或移动机器人领域可能遇到的坐标变换场景,对于变换后的数据点或特征点,再介绍一些好用的处理办法。
描述 python实现简单的车道线检测,本文章将介绍两种简单的方法 颜色阈值+区域掩模 canny边缘检测+霍夫变换 这两种方法都能实现简单的车道线检测demo,注意仅仅是demo 下面的图片是用到的测试图片 方法1:颜色阈值(Color Selection)+ 区域掩模(Region Masking) 我们可以仅仅通过设置一些RGB通道阈值,来提取车道线。 以
描述 CSF布料滤波算法,用于遥感雷达数据提取地面,是张吴明教授等发表在remote sensing期刊上的文章论文全称:An Easy-to-Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation源码链接:https://github.com/jianboqi/CSF.git 方法挺简单易懂的,网上有很多对此的论文
背景 相机标定核心公式复习公式 原理 我们可以将mei模型理解为,在 z 轴添加了一个偏移\xi ,使得球型水平入射的光线也可以投影到图像的像素区域内 1. 物理xyz 求 像素uv 通过以下过程,根据物理点的信息,和我们已经标定好的相机模型,可以得到该点在图像上的坐标 1.1 找到xyz与uv之间的关系 假设物理真实的点的坐标为 P = (x, y, z)^T 这个物理点,
描述 DBSCAN是一种基于点云密度的无监督聚类方法 论文:A Density-Based Algorithm for Discovering Clusters in Large Spatial DataBase with Noise, 1996 它是一种聚类的基本算法,了解它的原理并实现是一件基础的工作。 定义 如论文所述,主要解决三个问题: It can often be
描述 这篇文章继续介绍一些利用PCL库的工程代码,主要目的是为了解决一些场景的地面分割任务。 这篇文章介绍的方法包括: RANSAC 形态学分割 欧式聚类分割 在最后也介绍了一些小工具代码:点云颜色显示,以及上述算法的效果显示代码 1. RANSAC分割 ransac的原理不过多介绍,大体就是这样一个思路:从原始数据集中选出种子点,去按照指定模型来拟合(二维数据找直线,三维
Efficient Online Segmentation for Sparse 3D Laser Scans 描述 本文来分析另外一篇点云分割的算法原文:Efficient Online Segmentation for Sparse 3D Laser Scans 算法中分为两步,第一步是点云地面分割,第二步是对除去地面后的点进行分割。和之前一样,我们还是先只介绍地面分割的部分,之后有时间
描述 这个韩国团队真的挺厉害的,在2017年别人提出的GPF算法(已分析)基础上,持续输出。2021年在RAL发表了两篇文章:一篇R-GPF算法(我还没分析),另外一篇是Patchwork(已分析)。今年刚刚刚,也就是2022年7月份又中了一篇IROS,也就是这篇文章:Patchwork++,主要改进了之前提出的Patchwork。 论文思想挺不错的,我来解析一下(同时,定个小目标,年底争取超
描述 这一篇文章介绍2017年的一篇基于点云数据的地面分割算法——GPF(Ground Plane Fitting)论文全称:Fast Segmentation of 3D Point Clouds: A Paradigm on LiDAR Data for Autonomous Vehicle Applications 这篇文章实际上有两个贡献:其中一个是GPF。而另外一个是SLR(Scan
描述 本文会对何恺明博士的论文实验结果进行分析,并结合我的复现代码,对一些参数选择给出建议 以下是我关于去雾的另外两篇文章:论文解析:https://www.guyuehome.com/39848思路梳理与python代码复现:https://www.guyuehome.com/39850 原文分析 5. Experimental Results 自己的结果 在我们的实验中,我们使用M
描述 上一篇文章,对何恺明的论文进行了逐行分析,但总体内容还是有些繁琐,不利于学习总结。本篇将重点思想按照工程顺序给出,便于理解去雾的核心思想。我还列出了python版本的实现,是我按照论文的公式去复现的。 算法核心思想 1. 雾的模型 有雾的图像,与正常图像有什么区别呢?作者结合参考文献,给出了这样的公式 意思是说:我们拿到的有雾图像素值,是正确图像经过一个t的衰减,增加一个大气光
Single Image Haze Removal Using Dark Channel Prior 描述 这篇文章不用多说了。看作者:何恺明,孙剑,汤晓鸥。事实上这篇文章是2009年CVPR的Best Paper,我在上学时就已经读过这篇文章了。那时刚入门还不太懂这三人有多厉害,只觉得这篇文章真的很炫酷。 这几年,有幸上过孙老师的一堂课,家里人也曾在旷视工作过。这几天有相关的契机,就重新分
LeNet 1998年由Yann LeCun, Leon Bottou, Yoshua Bengio, Patrick Haffner发表,众所周知其中的两人已经被授予了2018年图灵奖。 这篇文章的重要性不言而喻,其中有很多重要的概念。它的核心网络结构,被称为LeNet-5 网络的特点来概括一下:网络一共7层,池化使用的是全局 pooling,激活函数使用的是Sigmoid,输出层使用径向
描述 接上一篇,对论文中的实验结果进行分析 PLARD使用的网络:视觉PSPNet,雷达ResNet-101 IV. EXPERIMENT 在本节中,我们评估了基于KITTI道路检测的PLARD的有效性。我们首先采用5倍交叉验证来说明PLARD中各个部分的有效性。然后,我们在测试集上评估PLARD,并将其与其他最先进的道路检测算法进行比较。 A. Dataset数据集 KITTI道路基
描述 详解一篇基于激光视觉融合的道路检测文章,发表在2019年自动化学报英文版(我所主编的业界顶刊)中,第三作者是陶大程,业界大佬,可自行进行百度。 为什么选择这篇文章进行分析呢。查看KITTI数据集的分数榜单leader-board你会发现,这篇文章的结果非常领先。 Abstract 尽管基于视觉图像的道路检测技术发展迅速,但由于光照变化和图像模糊等问题,在视觉图像中鲁棒的识别出道路区域
智能体位姿解算核心——欧拉角与四元数 描述 为这篇文章起了一个这样的标题,实属有感而发。位姿解算在机器人及自动驾驶中处处常见:传感器的姿态,车辆自身的姿态,物体姿态等。而这些姿态最重要的一种表现形式,就是欧拉角与四元数。借今天同事分享之机会,也重新给出一份专业详细的总结,为自己回顾也为未来做笔记。 当然了,这个知识并不高端,但理解得有多透,就因人而异了。看这篇文章,暂时请忘掉你的所有已知概念
描述 点云地面分割算法——Patchwork的论文分析该论文是ICRA2021年的一篇文章,比较新,效果不错,在这里进行介绍论文全称:Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor 简述 Patc
描述 使用PCL库对点云的一些工程化操作,接上一篇。这一篇主要以PCA为核心。 原理 PCA代表主成分分析,它是一种用于降低数据集维度的技术,同时保留尽可能多的原始信息。在点云的背景下,主成分分析可以用来找到点云的主轴,然后可以用来表示低维空间中的点云。从PCA获得的特征向量表示点云的主轴。这些轴按重要性排序,第一个轴最重要,最后一个轴最不重要。每个特征向量是指向相应主轴方向的单位向量。特征
描述 利用PCL库既有函数,对激光雷达点云进行一系列处理。操作数据可以利用一些经典点云文件,我的操作还有一些自采数据。 经典点云数据 斯坦福兔子猴子龙(数据量比前两个大了不少) 代码 1. 加载点云 pcd点云格式 #include <pcl/io/pcd_io.h> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(n
描述 本文对经典点云聚类算法DBSCAN进行分析 论文名称:A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise 1. 介绍 如今,数据是从许多不同类型的设备自动接收的。卫星、x射线和交通摄像头只是其中的一小部分。为了使我们能够理解这些信息/数据,必须对其进行处理。
描述 这篇文章继续上一篇,对原论文的实验结果进行分析,同时还要给出直线拟合算法部分的进一步解释。 最后也会上一些我自己的分割结果 原文解析 Result 执行3D点云分割的主要好处是能够检测和跟踪场景中较小的动态对象,因为这样可以精确建模场景的动态方面,从而最终促进安全驾驶。较大的对象,如植被和大型建筑物,对导航任务不太重要,通过简单的二维占用栅格可以更有效地建模。由于我们的所有算法都适
点云地面分割算法——Fast Segmentation of 3D Point Clouds for Ground Vehicles文章解析(一) 描述 《Fast Segmentation of 3D Point Clouds for Ground Vehicles》是美国加州大学圣地亚哥分校发表在2010 IEEE Intelligent Vehicles Symposium会议上的一篇文
描述 简单介绍B样条曲线,并给出实现代码 原理 有关B样条的介绍有很多,这里不会太详细的介绍B样条曲线的全部概念,只会列出一些我的理解 贝塞尔曲线 不得不提到贝塞尔曲线,之前我曾经写过一篇关于贝塞尔曲线的文章,将非常有助于理解B样条曲线。贝塞尔曲线是这样生成的,简述: 有n个控制点,那么第0个点和第1个点连接起来,第1个点和第2个点连接起来…第n-2个点和第n-1个点连接起来,这样
描述 求单应矩阵已知一个平面上的4个点(A、B、C、D),经过两个针孔相机分别成像得到4个点的图像坐标分别为 相机1: (xA1, yA1),(xB1, yB1), (xC1, yC1), (xD1, yD1) 相机2: (xA2, yA2),(xB2, yB2), (xC2, yC2), (xD2, yD2), 计算相机1的图像到相机2图像的单应矩阵,并转换相机2图像中的点坐标到相机
描述 给定输入图像,图像为二值图像,计算图像中非零像素的连通区域要求:统计连通域的数目以及每个连通域的像素数目 代码 #include <stdio.h> #include <opencv2/opencv.hpp> #include <vector> // 快排从大到小 void quickSort(int low_id, int high_i
描述 以下两篇文章将是这一系列最后的两篇,将对全部的代码进行剖析 开发的时间并不多,有些写的并不是最优的实现,请多指教 代码 mian.c 添加的代码段就多了 增加头文件和一些变量定义 /* USER CODE BEGIN Includes */ #include "control.h" #define RXBUFFERSIZE 256 char info_buffer[RXBUFF
描述 以下两篇文章将是这一系列最后的两篇,将对全部的代码进行剖析 开发的时间并不多,有些写的并不是最优的实现,请多指教 代码 control.h、control.c 这两个文件是主控的核心代码在control.h头文件中我们定义了一些常量和结构体在control.c中做了两件事:解析命令buffer,根据磁信息调整左右电机转速 control.h // copyright: @fuxi_rob
描述 这一篇介绍磁条机器人的算法思路,并开源部分代码 算法核心思路 磁条机器人的算法核心思路很简单,我愿意称之为“消息触发型”,意思就是机器人接收消息再通过代码进行判断和操作。 当然了,整体代码还是要分几部分去实现。以下几个小节来概述 消息处理 指令处理上位机发送过来的命令,需要将命令解析,并对命令进行处理,令机器人做出相应的改变。 磁条信号处理磁传感器的数据,由算法来判断磁条现在和机器人
描述 接下来的两篇文章将介绍磁条机器人的算法开发部分。这一篇主要介绍机器人主控的配置及部分算法思路 主控 这次机器人的主控芯片,我们选择的型号是STM32F103RCT6,这是意法半导体比较便宜的一款产品了,但用做我们这次的开发是足够的。在网上我们买了这个芯片的一个开发版,如图。 为了便于进行传感器的插入,我们配合这个开发版,还做了一块拓展版,这里就不贴出图片了。 管脚配置 为了使这块主控起到磁条
描述 上一篇文章对磁条机器人机械部分的内容进行了介绍这一篇我们来讨论一下该机器人的下位机系统吧 系统概述 由于磁条机器人的功能较为简单,其下位机系统实际上是一系列电子元器件的组合。开局一张图。图中蓝色的线代表着传感器数据的流向,绿色的线代表的是上位机和下位机之间的命令通信,红色的线代表着供电。实际上图示已经很明显了,不过还是将关键流程说明一下。 主控:磁传感器向主控返回收到的磁条信号强弱,用以
描述 上一篇文章对磁条机器人应该具有的功能进行了分析这一篇我们按照上一篇总述的顺序,对磁导航机器人进行一个整体的设计。 我们按照三个方向:机械、嵌入式、算法,来进行分析。这一篇文章主要介绍机械部分的内容,剩下的留给以后的篇章。 机械设计 机械设计将是我介绍最简单的部分。对于这个机器人的机械设计,我本身是有以下几个基本需求的: 负载能力达到要求:我设计的机器人负载大概在50kg可以正常行走 外观:
描述 之前的几个章节,我们依次介绍了使用stm32的开发经历,文章的顺序是按照机器人从无到有的开发逻辑:stm32的基本使用,stm32是如何和模块完成通信的,stm32控制电机及灯带。 这一章节,我们将正在开始去设计一个机器人,并且使用之前章节的开发经验,完成一个磁条机器人的开发与设计工作。 这一篇是一个先导文章,主要是梳理我们机器人的功能和大体设计逻辑。 磁条机器人的功能 在进行设计与开发工作
描述 这篇文章延续上一篇文件,上一篇贴出了我写的两个源码文件,这一篇会介绍一下源码的注释,并介绍如何进行代码移植 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 灯带:WS2812型号的灯带 在这一篇文章的工作之前,我们已经通过上一篇文章,成功的配置了PWM管脚,并成功构建了整个工程。 代码移植 将ws2812.c文件添加到整个工程中。添加
描述 这篇文章延续上一篇文件,上一篇介绍了WS2812的一些知识和设置,这一篇文章会利用CubeMX工具进行芯片设置,设置一个产生PWM波的管脚,用它来完成WS2812灯带的控制。 这篇文章还附赠了一个我写的.h和.c文件,可以很简单的添加到工程中,你也可以把这两个文件的代码放到main.c中,很容易。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407I
描述 这篇文章将介绍,如何利用CubeMX工具进行芯片设置,最终达到控制WS2812型LED灯带的任务目标。 之所以要学习这种led灯的控制,是因为我们的机器人需要由灯光来返回一些机器人的状态,这样的显示状态方式比只通过屏幕显示是更优雅的。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 灯带:WS2812型号的灯带 由于LED灯带并不是我们
描述 上两篇文章介绍了如何利用CubeMX设置PWM波,并通过按钮控制电机。这一篇我们首先对上两篇文章进行进一步的实验与分析。随后将继续开发,完成同步控制两个直流电机的研发工作。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 电机及驱动板:电机使用的是一款直流有刷减速电机。电机驱动板也是野火家的,型号是L298N电机驱动板 这篇文章实验在前
描述 这一篇文章紧接上一篇文章stm32按钮控制直流有刷电机(一)(Develop文章3.1)的内容,上一篇文章利用CubeMX对stm32已经进行了配置 这一篇文章将利用代码开发,产生PWM信号完成按钮控制直流有刷减速电机的过程。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6电机及驱动板:电机使用的是一款直流有刷减速电机。电机驱动板也是野火家
描述 这一篇文章是新一段开发经验的开篇,主要是利用CubeMX对stm32进行配置,产生PWM信号控制直流有刷减速电机的过程 本篇文章最后能达到的效果就是,可以利用stm32上的按钮,对直流电机进行使能、失能、加速减速、转换运动方向的操作。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6电机及驱动板:电机使用的是一款直流有刷减速电机。电机驱动板也
描述 这一篇文章是继续上一篇关于stm32的串口中断学习,主要是利用CubeMX对stm32进行配置,完成基于232通信协议的模块检测信息读取 本篇文章最后能达到的效果就是,可以令stm32与基于232协议的模块,进行通信 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6开发器件:本文使用的传感器,是在淘宝上购买的广州联网科技的磁传感器。需要链接的
描述 这一篇文章是关于stm32的串口中断学习,主要是利用CubeMX对stm32进行配置,使用串口消息收发,完成一些传感器的消息接收。 本篇文章最后能达到的效果就是,可以向单片机发送需要的数据,并可以从连接在单片机上的传感器上,返回检测到的结果 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 开发器件:本文还使用了一种传感器,是在淘宝上购买的
描述 这一篇文章是关于stm32的led灯控制的最后一篇。这篇想要实现的功能就是led以固定周期进行状态的翻转。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 最简单的实现办法(没有技术含量) 我们可以在main.c的代码中找到程序的主循环while函数,在函数中我们可以通过HAL_Delay的方式进行延时控制,在延时中间穿插灯的控制语句,
描述 本文利用按钮来控制LED灯的开与关。 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 该单片机我要使用其中除了复位按钮的其他5个按钮,第1个按钮控制全部4个灯的状态翻转,后4个按钮分别控制4个灯 思路 我们依旧使用CubeMX来创建一个工程,选择我们使用的芯片型号,并在CubeMX的帮助下设置管脚具体的思路就是 打开CubeMX,按照
描述 这篇文章是研发文章的第一篇,在这里稍微详细的介绍一下。学习stm32第一步先把LED灯点亮,这是最简单的。这篇文章会详细的介绍这一研发步骤 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是stm32F407IGT6 思路 我们通过两种方式,可以完成LED灯的控制。 使用stm32公司研发的CubeMX工具,对芯片进行一些简单的设置,就可以完成灯的控制(这都是官方
描述 这是我新开的一个专栏,目的是为了记录一些有关移动机器人下位机的开发心得。本来我的工作强度是不允许我还来写文章的,但由于一系列比较坑的人和事情,我还是必须把我的一部分精力分出来给技术,就有了这样一些文章 既然准备写专栏,而且要亲自去开发,也就需要一个框架了。下面的框架是我的开发进度及内容,用于梳理知识。 前提:我并不是一个嵌入式开发人员,因此文章还是会由浅入深 框架 我会写以下三类文章: 基
描述 使用glog的CMake工程,在make时报错 出现原因 之前也出现过Undefined symbols for architecture x86_64这种错误,出现这种错误时,基本上问题可以确定,就是 工程在编译时找不到包含这个提示函数的库文件 原因有两个:第一,存在源文件没有编译,和我这篇文章相同的情况Mac编译出错第二,你的工程里需要用到某个第三方库,而这个库现在没有链接到你的工程下
描述这段时间的任务一直是阅读cartographer,这篇主要分析cartographer的代码运行顺序,再好好理清一下cartographer的运行逻辑 顺序我在代码中cout一些信息,帮助我们梳理一下代码的运行时的进进出出 这里会梳理出全部的关键程序语句 1.node_main.cc 开始运行launch文件后,就进入Run()函数 功能:开始运行建图节点 2.node_options.cc
描述 Cmake工程执行编译链接命令过程中,举例 cd build cmake .. make -j12 能够make成功100%,但是在链接过程中终端打印信息提示 warning: XXX is deprecated [-Wdeprecated-declarations] \\ XXX代表某函数 原因 这是一句警告,简单来说就是在你代码中使用的XXX函数已经被弃用了。具体发生原因暂时不清楚,
描述 主要分析cartographer处理雷达数据的代码 在代码中cout来理解 1. HandleLaserScanMessage cartographer_ros/node.cc中的HandleLaserScanMessage()函数中,我添加了如下几个cout std::cout<<"sensor_id: "<<sensor_id<<" time: "&l
问题描述 使用cmake编译项目时,报错内容为 Undefined symbols for architecture x86_64: "Obstacle::run()", referenced from: _main in 1.o "Obstacle::Obstacle()", referenced from: _main in 1.o "Obstacle::~Ob
描述 主要分析node_main.cc中的Run()函数中的RunFinalOptimization() node.RunFinalOptimization(); RunFinalOptimization()的基本逻辑 第一层:node.cc RunFinalOptimization()函数定义在node.cc void Node::RunFinalOptimization() { {
描述 Run()函数中的函数AddTrajectory()源码继续解析 int Node::AddTrajectory(const TrajectoryOptions& options) { const std::set<cartographer::mapping::TrajectoryBuilderInterface::SensorId> expected_s
描述 Run()函数中的建图功能的代码解析 解析 node_main.cc中的Run()函数中有这样一段核心代码 NodeOptions node_options; TrajectoryOptions trajectory_options; std::tie(node_options, trajectory_options) = LoadOptions(FLAGS_configuratio
描述 Run()函数中的记载配置参数的代码解析 node_main.cc中的Run()函数中有这样一段核心代码 NodeOptions node_options; TrajectoryOptions trajectory_options; std::tie(node_options, trajectory_options) = LoadOptions(FLAGS_configuratio
描述 Run()函数的最后有两个关键句(我认为的),一个是FinishAllTrajectories,另外一个是RunFinalOptimization 这篇会分析第一个,也就是函数FinishAllTrajectories 第一部分会分析FinishAllTrajectories中每行程序的声明位置,第二部分会分析FinishAllTrajectories实现的功能 一、FinishAllTra
描述 cartographer学习笔记(二) 这一篇主要分析node_main.cc的代码 主函数main() 主函数
描述 关于cartographer的学习笔记 DEMO运行 launch文件详解 以下是官网给出的demo执行命令 roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag 1. demo_backpack_2
描述 Ubuntu系统下安装cartographer 需要说明的是:每个人电脑配置是不同的,而cartographer的依赖库又比较多,所以难免出来各种各样的问题 由于我的电脑安装库比较多也比较杂,本文章只是描述我的安装过程,不一定通用安装命令1. 安装依赖 "VERSION="的那句一定要执行#后面的语句是注释 以下的命令都是摘抄官网,不信任的话可以去cartographer官网找命令来执行ht
描述 python使用Eigen库 加载 import numpy as np import scipy.linalg as la 1. 矩阵定义 零矩阵 m_matrix = np.zeros((5, 2)) 对角矩阵 m_matrix = np.eye(5) 2. 基本操作 矩阵乘法,两种写法 A = B @ C A = B.dot(C) 3. 特殊矩阵 转置矩阵 A =
描述 使用C++语言的Eigen库进行一些常见操作 使用库时,请一定注意两点 定义清楚矩阵类型 矩阵乘法注意尺寸对应 代码 头文件声明 #include <Eigen/Dense> 1. 矩阵声明 n*n方阵(已知n) Eigen::Matrix2d m_matrix; m_matrix<< 2,3,2.2,1; std::cout << "m_m
描述这一系列我会开始介绍一下Coursera自动驾驶课程的关键内容 本文内容自动驾驶的分类法驾驶任务的感知需求如何做出驾驶决策1. 自动驾驶等级的分类1.1 驾驶任务 三个子任务 感知环境: 跟踪汽车的状态,识别路标、行人等,跟踪运动物体,预测它们未来的行动 运动规划 操控车 辆,加减速,控制轨迹等Operational Design Domain(ODD, 操作设计域或奇数)构成了给定系统设计运
描述工作需要利用了一些时间完成了定时器中断控制步进电机,这篇文章记录一下开发过程 步进电机控制 1. 基本知识 步进电机是有机座号的,又叫电机外径,一共有28、42、57、86、110、130型号。我使用的是42电机,用尺子量量就会发现它的尺寸是42mm 步进电机步距角:输入一个电脉冲信号,步进电动机转子相应的角位移。我使用的电机步距角为1.8° 细分数就是指电机运转时的真实步距角是固有步距角(整
描述这里还是说明一下本人还是一个算法工程师,虽然本科专业为自动化,但是单片机这项技能早就丢了哈哈。这次是项目需要,因此简单拾起来了一下下,因此这些文章还是属于记录性质的,并不高端也不难,仅仅面向初学者吧 stm32项目搭建基础好吧进入主题,我们现在要搭建一个stm32的项目我还是把问题写在最开始把 1. 注册keil你的keil需要注册 当你编写了几行类似于helloworld的小代码,想看看它能
描述 ROS下编译cpp文件时,出现编译错误错误提示 error: ‘shared_ptr’ in namespace ‘std’ does not name a template type 解决方案 在需要编译的包的CMakeLists.txt文件下,添加如下一句话 add_compile_options(-std=c++11) 使用C++ 11编译方式,问题解决
描述 Cmake工程指定依赖库的搜索路径,比如系统中有两个opencv版本,分别安装在不同路径下 比如,一个在 /usr/local下,另外一个在/home下,两个版本不同 那么如何使你的Cmake工程,使用指定opencv版本呢 方案 在CMakeLists.txt中这么写 set(xxx_DIR "xxxConfig.cmake文件所在的路径") 举例如果我想使用安装在某路径下的opencv
描述 本文将简要介绍机械臂手眼标定原理及相关知识,包会 基础知识 了解手眼标定原理,就必须先了解一句话,叫做“右乘连体左乘基”。 这句话实际上是读硕士期间,机器人学课程上老师讲的,我会专门写一篇文章来介绍这个定则,这篇我们先不介绍,只用最后的结论。 公式 手眼标定原理 明确坐标系 首先明确坐标系:机械臂项目一般存在四个坐标系 基坐标系:机械臂的基座为原点的坐标系 末端关节坐标系:一般机械臂末端关
描述 使用matlab求解AX=XB的问题 可以正确求出X的值,我已经成功验证了 至于说X具体代表什么,要结合你自己推导出的公式AX=XB之中,A、X、B分别代表什么 代码 main.m 包含我做手眼标定时的14组A和B然后使用X= tsai(A,B)一句话就可以求解出手眼矩阵X clc; clear; num = 14; A=zeros(4,4,num); B=zeros(4,4,num); A
描述 C++求解AX = XB 以下的两个代码,虽然可以直接运行,但是我本人使用它们得到的手眼矩阵,旋转矩阵R值的大小看起来是合理的,但位置向量t的三个数值大概都是大于10万的,显然是错误的。 但没有时间去研究错误的原因,但是找到这些代码已属不易,因此还是贴在这里,供以后研究 代码 C++求解AX = XB 代码网上有很多,这里贴出来两个。Tsai_HandEye和Navy_HandEye Tsa
描述 机械臂末端的位姿是p时,不想沿着基坐标系来移动,而是想沿着末端的xyz轴来移动 接口代码 核心函数 # 移动 def move_endEffector(axis, dist, x, y, z, rx, ry, rz): Rx = np.mat([[1, 0, 0], [0, math.cos(rx), -math.sin(rx)], [0, math.sin(rx), math.co
描述 ROS系统下,使用moveit和gazebo搭建UR机械臂控制的仿真环境,并使用C++编写一个节点来控制UR机械臂的移动ROS系统:kineticUR5机械臂电脑系统:Ubuntu16.04 截图和运行效果 gazebo的机械臂会先水平,然后依次移动到两个位置rviz中的机械臂移动和gazebo机械臂一致,但是会有一个透明效果的机械臂,沿着同样路径非常滞后的移动 代码 1. 特殊位置
描述 在使用ROS的kinetic版本控制UR机械臂时,moveit规划成功但UR机械臂不运动的问题 失败表现 UR机械臂在Gazebo环境下,绵软无力的倒在地上,在rviz环境下一直是横着倒下的姿态,机械臂末端一直位于地面之下 成功的截图如下 注意到,MotionPlanning界面下的“Commands”下有四个按钮,分别是“plan”、“Execute”、“Plan and Execute”
Real-Time Loop Closure in 2D LIDAR SLAM文章精读 原文:W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM, in Robotics and Automation (ICRA), 2016 IEEE International Conference
cartographer概述 cartographerr是google推出的一套基于图优化的SLAM算法 原文:W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM, in Robotics and Automation (ICRA), 2016 IEEE International C
二维点云ICP原理推导 描述 ICP是迭代就近点算法,大部分的实现代码都是基于PCL点云库的,也就是三维点云的匹配 实际上,二维点云数据也算是常见的数据类型,比如移动机器人经常使用的单线雷达。本文就是二维点云ICP的原理推导 算法原理 二维点云数据说明 现在假设我们有两帧点云A与B,我们把 A 称为标准点云,把 B 称为源点云。我们的需求是把点云 B 经过矩阵变换到点云 A,需要注意的是点云
描述 关于A_算法的一些实现,我已经写在了我的博客里。这里也贴出链接来,大家可以去看[移动机器人路径规划算法及思考——A_算法](https://www.guyuehome.com/32775 “移动机器人路径规划算法及思考——A*算法”) 这篇我主要使用C++来实现了一下,发在这里,有一些代码写的还是不太优,以后会花些时间来优化的。 代码 代码分为三个文件,main.cpp,AStar.h头文件
A*算法原理 A算法是一种经典的路径搜索算法,A算法的原理初学者可以去网上搜索算法原理详解,讲得很好 链接:http://www.gamedev.net/reference/articles/article2003.asp 截图回忆 算法牛人或者进阶者,可能只是忘了算法的一些关键点,这里进行回顾 A*算法简单
描述 使用贝塞尔曲线生成路径 已知:若干个二维路径点(x, y),生成一段由一系列(x, y)点组成的点集 公式 网上有很多贝塞尔曲线的概念和知识,这里不做赘述 贝塞尔曲线上的路径点计算公式: 公式的理解: 假设我有6个点,按照点的顺序依次连
1. 算法简介 Catmull-Rom Spline算法是一种插值算法,能够在目标点之间插值生成一条平滑的曲线 算法数学原理不在此介绍 算法特点 什么情况下,可以使用Catmull-Rom Spline算法呢——平滑机器人或无人车的路径 算法要求: 有一系列路径点 路径点大于4个 想要在路径点之间插值生
当然可以结合,实时性的话要考虑你的soc算力,对时延性有更高的要求的话,建议使用LineFit
坡度一致OK,过于凹凸的看你需要多少精度了
谢谢夸奖~
谢谢支持
信息太少了,我无法帮你判断啊。
谢谢兄弟~
数据可以从网上搜到,关键词:standford bunny,搜不到可以发邮箱,我发给你
这个原因有太多了,不太清楚你的实际情况。可以从以下几个方面排查:cpu当前占用,点云数据大小,代码中是否利用了多线程、CMakelist里的编译模式是release吗等等。既然你会跑源码,我觉得排查问题的能力应该也OK吧
可以,论小时计费
不需要啊,代码里也没ros的代码呀,你自己建一个cmake工程就好
古月居优秀创作者
积分
粉丝
勋章
第三方账号登入
看不清?点击更换
第三方账号登入
QQ 微博 微信