- 博客(82)
- 收藏
- 关注
原创 【激光SLAM】基于已知位姿的构图算法 (Grid-based)
由于分辨率的设置,有可能去除小的可通行区域。可以使用自适应分辨率的地图缓解。同时,栅格地图是非参模型,也就是说由很多栅格组成(这话听起来有点奇怪hhh)。随着地图的增大,内存需求急剧增加。地图即为环境的空间模型。环境地图是机器人进行定位和规划的前提。定位可以用特征地图(视觉),规划可以用栅格地图。把环境分解成一个一个的小栅格,每个栅格有两种状态:占用(Occupied)或者空闲(free),适合进行路径规划。
2024-03-01 22:49:40 452
原创 【激光SLAM】基于图优化的激光SLAM 方法(Grid-based)
基于图优化的SLAM算法比较完善的匹配系统,包含建图和定位目前效果最好的开源激光SLAM系统有人在专门的维护,不断增加新的特性。
2024-02-26 22:10:41 1061
原创 【激光SLAM】基于滤波的激光SLAM方法(Grid-based)
每一个粒子都包含自己的栅格地图。对于稍微大一点的环境来说,每一个粒子都会占用比较大的内存。如果机器人的里程计误差比较大,即proposal分布跟实际分布相差较大,则需要较多的粒子才能比较好的表示机器人位姿的后验概率分布,会造成内存爆炸。要保持粒子的数量在一个比较小的数值。提升proposal分布采样的位姿质量。粒子耗散问题,因此每一次进行重采样都有一定的随机性。随着重采样次数的加多,粒子的多样性会耗散掉,即最终的所有粒子都来自同一个粒子或者少数的几个粒子的复制。
2024-02-23 15:27:07 1232
原创 【激光SLAM】激光雷达数学模型和运动畸变去除
中近距离精度较高,距离越近,精度越高价格便宜远距离精度较差易受干扰一般在室内使用由于雷达特性,α与L已标定,β为通过雷达内参数投影得出,设AB距离为L,A至垂足间的距离为L1,B至垂足间的距离为L2把激光看成一个激光束。激光束射到物体上返回得到的距离,由于噪声的存在,通常呈高斯分布,如图a所示,d在期望值附近形成高斯分布。通过raytracking得到期望距离。图b为激光束碰到障碍物的情况,此时得出的d小于期望距离。一般用指数分布来描述这种情况。
2024-02-12 21:59:38 1731
原创 【激光SLAM】里程计运动模型及标定
自由度为3(即X,Y,θ),但是驱动数只有2个(即VL,VR,左轮速度和右轮速度)。欠驱动系统造成差分模型的平移运动和旋转运动是耦合的,无法单独分解运动。差分底盘只能做一种运动——圆弧运动。对于纯旋转而言,r趋于0,实际上还是两个圆弧运动。,提高机器人导航的精度和可靠性。通过标定,可以确定里程计的误差模型和参数,从而对机器人的位移和姿态进行更准确的计算。Ax=b的每一行代表一个约束,列代表未知数的维数。表示激光雷达测得的第i帧与第j帧的相对位置关系,即u_i。同理,u_i则为由里程计测量得到的同一关系。
2024-02-05 17:47:09 814
原创 【视觉SLAM十四讲学习笔记】第六讲——非线性最小二乘
如果f为简单的线性函数,那么这个问题就是简单的线性最小二乘问题,但是有些导函数可能形式复杂,使得该方程可能不容易求解。在这个过程中,问题在于如何找到每次迭代点的增量,而这是一个局部的问题,我们只需要关心f在迭代值处的局部性质而非全局性质。列文伯格—马夸尔特方法的求解方式,可在一定程度上避免线性方程组的系数矩阵的非奇异和病态问题,提供更稳定、更准确的增量Δx。一个比较好的方法是根据我们的近似模型跟实际函数之间的差异来确定:如果差异小,说明近似效果好,我们扩大近似的范围;反之,如果差异大,就缩小近似的范围。
2024-01-23 10:57:00 1032
原创 【视觉SLAM十四讲学习笔记】第六讲——状态估计问题
我们已经知道,方程中的位姿可以由变换矩阵来描述,然后用李代数进行优化。观测方程由相机成像模型给出,其中内参随相机固定,外参则为相机位姿。于是,我们已经弄清了经典SLAM模型在视觉情况下的表达。然而由于噪声的存在,运动方程和观测方程的等式必定是不是精确成立的。尽管相机可以非常好地符合针孔模型,但我们得到的数据通常是受各种未知噪声影响的。所以,预期假设数据必须符合方程,不如讨论如何在有噪声的数据中进行准确的状态估计。解决状态估计问题需要一定程度的最优化背景知识。
2024-01-19 17:59:02 1119
原创 【视觉SLAM十四讲学习笔记】第五讲——相机模型
前面两讲中,我们介绍了“”的问题,部分地解释了SLAM经典模型中变量的含义和运动方程部分。本讲将讨论“”,也就是观测方程部分。而在以相机为主的视觉SLAM中,观测主要是指的过程。三维世界中的一个物体反射或发出的光线,穿过相机光心后,投影在相机的成像平面上。相机的感光器件接收到光线后,产生测量值,就得到了像素,形成了我们见到的照片。这个过程能否用数学原理来描述呢?本讲将首先讨论相机模型,说明投影关系具体如何描述,相机的内参是什么。同时,简单介绍双目成像与RGB-D 相机的原理。
2024-01-16 20:23:14 1463
原创 【视觉SLAM十四讲学习笔记】第四讲——李代数求导与扰动模型
虽然我们已经清楚了SO(3)和SE(3)上的李群与李代数关系,但是当在SO(3)中完成两个矩阵乘法时,李代数中so(3)上发生了什么改变呢?上面的BCH公式告诉我们,当处理两个矩阵指数之积时,它们会产生一些由李括号组成的余项。在SLAM中,要估计一个相机的位置和姿态,该位姿是由SO(3)上的旋转矩阵或SE(3)上的变换矩阵描述的。设某个时刻机器人的位姿为。最后,我们给出SE(3)上的扰动模型,而直接李代数上的求导就不再介绍了。我们把最后的结果定义成一个算符,它把一个齐次坐标的空间点变换成一个4×6的矩阵。
2023-12-14 23:56:59 348
原创 【视觉SLAM十四讲学习笔记】第四讲——指数映射
专栏系列文章如下:【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍【视觉SLAM十四讲学习笔记】第二讲——初识SLAM【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角【视觉SLAM十四讲学习笔记】第三讲——四元数【视觉SLAM十四讲学习笔记】第三讲——Eigen库【视觉SLAM十四讲学习笔记】第四讲——李群与李代数基础前一篇文章提到:上式前提是R在原点附近的一阶泰勒展开,我们看到这个向量φ=(φ1,φ2,φ3)反应了R的导数性质,故
2023-12-13 20:20:02 235
原创 【视觉SLAM十四讲学习笔记】第四讲——李群与李代数基础
每个李群都有与之对应的李代数。李代数描述了李群单位元附近的正切空间,它描述了李群局部的导数。可以理解为:李代数对应了李群的导数。一般的李代数定义如下:李代数由一个集合V、一个数域F和一个二元运算[,]组成。如果它们满足以下几条性质,则称(VF,[,])为一个李代数,记作g。其中二元运算被称为李括号。相对于群中的较为简单的二元运算,李括号表达了两个元素的差异。他不要求结合律,而要求元素和自己做李括号之后为零的性质。作为例子,三维向量R3上定义的叉积×是一种李括号,因此g=(R3。
2023-12-08 13:53:14 592
原创 【CMake入门】第二节——CMake常用指令介绍
指定要求最小的cmake版本,如果版本小于该要求,程序终止PROJECT_NAME:项目名称,与project(xxx)一致PROJECT_SOURCE_DIR:即内含project()指令的CMakeLists所在的文件夹EXECUTABLE_OUTPUT_PATH:可执行文件输出路径LIBRARY_OUTPUT_PATH:库文件输出路径CMAKE_BINARY_DIR:默认是build文件夹所在的绝对路径CMAKE_SOURCE_DIR:源文件所在绝对路径。
2023-12-06 17:40:01 284
原创 【CMake入门】第一节——CMake的安装与简单样例
cmake会输出一些编译信息,然后再当前目录下生成一些中间文件,其中最重要的就是MakeFile,这是一个自动化编译的脚本。由于MakeFile是自动生成的,我们不必修改它。CMakeLists.txt文件用于告诉cmake要对这个目录下的文件做什么事情。在这个示例中,我们指定了一个工程名和一个可执行程序。如果顺利通过,我们就可以得到再CMakeLists.txt中声明的那个可执行程序demo。Windows:直接在官网下载对应安装包即可。编写helloSLAM.cpp。
2023-12-06 14:03:55 110
原创 【视觉SLAM十四讲学习笔记】第三讲——四元数
旋转矩阵用9个量描述3自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但具有奇异性。事实上,我们找不到不带奇异性的三维向量描述方式。类似于用两个坐标表示地球表面(如经度和纬度),必定存在奇异性(纬度为 ±90° 时经度无意义)。回忆以前学习过的复数。我们用复数集C表示复平面上的向量,而复数的乘法则表示复平面上的旋转:乘上复数i相当于逆时针把一个复向量旋转 90°。四元数四元数是Hamilton找到的一种扩展的复数。它既是紧凑的,也没有奇异性。缺点是四元数不够直观,其运算稍复杂些。
2023-11-28 21:27:43 403
原创 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角
专栏系列文章如下:【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍【视觉SLAM十四讲学习笔记】第二讲——初识SLAM【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵【视觉SLAM十四讲学习笔记】第三讲——Eigen库矩阵表示方式至少有一下两个缺点:因此,我们希望有一种方式能够紧凑地描述旋转和平移。例如,用一个三维向量表达旋转,用六维向量表达变换。事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/
2023-11-27 13:07:31 402
原创 【视觉SLAM十四讲学习笔记】第三讲——Eigen库
专栏系列文章如下:【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍【视觉SLAM十四讲学习笔记】第二讲——初识SLAM【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵Eigen是一个C++开源线性代数库。它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。请输入以下命令进行安装:与其他库相比,Eigen的特殊之处在于,它是一个纯用头文件搭建起来的库,这意味着你只能找到它的头文件,而没有类似.so或者.a的二进制文件。在使用时,只需引入Eigen的头文件即可,不需要链接库文件(因为它没有库文
2023-11-23 21:47:11 983
原创 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵
首先介绍了向量及其坐标表示,并介绍了向量间的运算;然后,坐标系之间的运动由欧氏变换描述,它由平移和旋转组成。旋转可以由旋转矩阵 SO(3) 描述,而平移直接由一个。
2023-11-20 21:21:21 598
原创 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
一方面需要明白自身的(即位置),另一方面也要了解外在的(即地图)。这个时候就需要借助传感器了。
2023-11-12 10:37:11 704
原创 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍
SLAM的目的是解决“定位”和“地图构建”这两个问题——一边要估计传感器自身的位置,一边要建立周围环境的模型。对此,我们需要借助传感器,让它以一定形式观察外部世界来解决这个问题。当用相机作为传感器时,需要根据一张张连续运动的图像(它们形成了一段视频),从中推断相机的运动,以及周围环境的情况。SLAM(Simultaneous Localization and Mapping)译为。如果这里的传感器主要为。的模型,同时估计自己的。
2023-11-09 13:06:26 314
原创 【ROS入门】机器人导航(仿真)——导航实现
文章结构建图 SLAM编写gmapping节点相关launch文件执行地图服务 map_server地图保存节点 map_server地图服务 map_server定位 amcl编写amcl节点相关的launch文件编写测试launch文件执行路径规划 move_basemove_base与代价地图碰撞算法move_base使用launch文件配置文件launch文件集成测试导航与SLAM建图编写launch文件测试建图 SLAMSLAM算法有多种,当前我们选用gmapping。gmapping 是RO
2023-10-28 23:54:54 846
原创 【ROS入门】机器人导航(仿真)——导航模块概述
在ROS中机器人导航(Navigation)由多个功能包组合实现,ROS 中又称之为导航功能包集,关于导航模块,官方介绍如下:一个二维导航堆栈,它接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的安全速度命令。首先,机器人需要外部数据。而外部数据来源于里程计(里程计是用来测量移动物体移动距离和移动方向的一种装置)、传感器流(通过雷达或者摄像头感知到的障碍物信息)和目标姿态。将这些数据进行运算,输出就是控制机器人运动的速度指令。底盘接收到速度指令之后,就按照指令开始运动。
2023-10-28 20:36:10 489
原创 【ROS入门】雷达、摄像头及kinect信息仿真以及显示
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加kinect摄像头配置;通过 Gazebo 模拟kinect摄像头,并在 Rviz 中显示kinect摄像头数据。已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加摄像头配置;已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加雷达配置;通过 Gazebo 模拟摄像头传感器,并在 Rviz 中显示摄像头数据。执行 gazebo 并启动 Rviz,在 Rviz 中添加摄像头组件。
2023-10-28 12:11:38 1774
原创 【ROS入门】机器人运动控制以及里程计信息显示
启动 launch 文件,使用 topic list 查看话题列表,会发现多了 /cmd_vel 然后发布 vmd_vel 消息控制即可。在 Gazebo 的仿真环境中,机器人的里程计信息以及运动朝向等信息是无法获取的,可以通过 Rviz 显示机器人的里程计信息以及运动朝向。已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器。机器人相对出发点坐标系的位姿状态(X 坐标 Y 坐标 Z坐标以及朝向)。启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动。
2023-10-28 10:30:59 541
原创 【ROS入门】机器人系统仿真——URDF集成Gazebo
文章结构URDF与Gazebo基本集成流程创建功能包编写URDF或Xacro文件启动 Gazebo 并显示机器人模型URDF集成Gazebo相关设置collisioninertial颜色设置URDF集成Gazebo实操编写封装惯性矩阵算法的 xacro 文件复制相关 xacro 文件,并设置 collision inertial 以及 color 等参数在 launch 文件中启动 gazebo 并添加机器人模型URDF与Gazebo基本集成流程URDF 与 Gazebo 集成流程与 Rviz 实现类似
2023-10-25 22:53:26 876
原创 【ROS入门】机器人系统仿真——相关组件以及URDF集成Rviz
文章结构相关组件URDF(Unified Robot Description Format)——创建机器人模型Gazebo——搭建仿真环境Rviz(ROS Visualization Tool)——显示机器人各种传感器感知到的环境信息URDF集成RvizURDF相关语法robotlinkjointURDF优化——xacro相关语法属性与算数运算宏文件包含实操底盘、摄像头和雷达Xacro文件实现组合底盘摄像头与雷达的xacro文件launch文件在Rviz中显示机器人模型相关组件URDF(Unified
2023-10-25 21:32:53 852
原创 【ROS入门】使用 ROS 动作(Action)机制实现目标请求、进度与完成结果的反馈
使用 ROS 动作(Action)机制实现目标请求、进度与完成结果的反馈
2023-10-02 23:11:46 845
原创 【ROS入门】使用 ROS 话题(Topic)机制实现消息发布与订阅及launch文件的封装
使用 ROS 话题(Topic)机制实现消息发布与订阅
2023-09-23 21:45:42 1880
原创 【ROS入门】创建工作空间与功能包
但是并没有出现install这个文件夹,同时从日志中也可发现并无代码相关的记录,说明并没有进行真正的编译。ROS_PACKAGE_PATH是ROS本身的环境变量,它会通过这个环境变量来查找所有ROS功能包的路径。功能包是放置ROS源码中的最小单元,即所有源码全部都必须放到功能包里面,不可直接放在src下去编译。工作空间(workspace)是一个存放工程开发相关文件的文件夹,类似于在windows中使用IDE创建的工程。只有设置这个环境变量之后,才能让系统找到这个工作空间,以及对应的功能包。
2023-09-20 23:34:25 3385
原创 【ROS入门】ROS的核心概念
例如Talker设置参数(setParam),参数名为’foo’,参数的值为1;如上图所示,有一个话题Topic叫做/image_data,发布者publisher为CameraNode,通过这个话题发布各种message,然后两个订阅者subscriber分别为ImageProcessingNode和ImageDisplayNode,从话题中订阅到这个message。ROS Master维护的参数服务器,该参数服务器会来保存一部分参数作为全局共享字典,所有节点都可以通过网络访问这个共享字典。
2023-09-19 20:18:19 741
原创 【OpenCV入门】第九部分——模板匹配
单模板多模板匹配”的过程可以封装成一个方法,方法参数为模板和原始图像,方法内部将计算结果再加工一下,直接返回所有红框左上角和右下角两点横纵坐标的列表。模板移动到原始图像的边缘之后就不会继续移动了,所以模板的移动区域如下图所示,该区域的边长为“原始图像边长 - 模板边长 +1”,最后加 1 是因为移动区域内的上下、左右的两个边都被模板覆盖到了,如果不加1会丢失数据。想要找到重复的图像,可以使用matchTemplate()来判断两幅图像的相似度,如果相似度大于0.9,就认为这两幅图像是相同的。
2023-09-05 23:20:47 2179
原创 【OpenCV入门】第八部分——滤波器
但在高斯滤波中,越靠近核心的像素权重越大,越远离核心的像素权重越小。在上图的计算过程中,滤波核中的每个像素值都会与卷积核对应位置的权重值相乘最后计算出9个值,让这9个值相加,再四舍五入取整,就得到了高斯滤波的计算结果。均值滤波器 (也被称为低通滤波器) 可以把图像中的每一个像素都当成滤波核的核心,然后计算出核内所有像素的平均值,最后让核心像素值等于这个平均值。中值滤波器的原理与均值滤波器非常相似,唯一的不同就是不会计算像素的平均值,而是将所有像素值排序,把最中间的像素值取出,赋值给核心像素。
2023-09-02 15:34:34 1666
原创 【OpenCV入门】第七部分——图像的几何变换
从不同的角度观察物体,会看到不同的变形画面,例如矩形会变成不规则的四边形、直角会变成锐角或钝角、圆形会变成椭圆等。因为要保证图像的“平直性”和“平行性”,所以不需要“右下角”的点做第四个参数,右下角这个点的位置会根据 A、B、C 三点的变化自动计算得出。除了前述 OpenCV 提供的用于对图像进行几何变换的方法外,借助 Python 中的 cmath模块也能让图像呈现特定的视觉效果。仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图像仍然可以保持直线的“平直性”和“平行性”,包含平移、旋转和倾斜。
2023-09-02 11:16:09 1127 1
原创 【OpenCV入门】第六部分——腐蚀与膨胀
这三张图就是开运算的过程,从结果可以明显地看出: 经过开运算之后,二叉树中的连接线消失了,只剩下光秃秃的节点。如果对此图像进行腐蚀操作,可以得出如图 7.14 所示的图像,连接线消失了,节点也比原图节点小一圈。然后再将图像进行腐蚀操作,让膨胀的小蜘蛛缩回原来的大小,效果如图 7.21 所示。除了5×5的结构,还可以使用3×3、9×9等其他结构,行列数越大,计算出来的效果就越粗糙,行列数越小,计算出的效果就越精细。因为膨胀图比原图大,腐蚀图像比原图小,利用腐蚀图像将膨胀图像掏空,就得到了原图的。
2023-09-01 21:14:38 1870
原创 【OpenCV入门】第五部分——图像运算
当计算机处理图像时,有些内容需要处理,有些内容不需要处理。能够覆盖原始图像,仅暴露原始图像“感兴趣区域”(ROI)的模板图像就叫做。(mask),也叫做掩码,在程序中用二值图像来表示:0值(纯黑)区域表示被遮盖的部分,255值(纯白)区域表示暴露的部分(某些场景下也会用0和1当作掩模的值)。示意图如下:在使用OpenCV处理图像时,通常使用NumPy库提供的方法来创建掩模图像。创建3通道掩模图像利用NumPy库的zeros()方法创建一幅掩模图像。
2023-09-01 17:02:54 1833
原创 【OpenCV入门】第四部分——阈值
在PhotoShop里头,有一个工具可以快速抠出一幅图像中的轮廓,这个工具就是阈值。OpenCV也提供了阈值,且与PS里头的阈值有相同的作用。在OpenCV中,阈值是一个临界值,类似一个”像素值的标准线“。所有像素值都会与这条“标准线”进行比较,最后得到三种结果:像素值比阈值大、像素值比阈值小和像素值等于阈值。程序会根据这些结果将所有像素进行分组,然后对某一组像素进行“加深”或者“变淡”的操作,使得一幅图像的轮廓更加鲜明,更容易被计算机和肉眼识别。
2023-08-31 19:59:25 562
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人