- 博客(22)
- 资源 (1)
- 收藏
- 关注
原创 激光slam-如何使用算法包
以hecto_slam算法为例1、建立一个ros的hector_ws 的workspace,并在其中建立src文件夹 mkdir -p ~/hector_ws/src2、进入src文件夹,下载或粘贴算法源代码(复制粘贴源码sr...
2020-01-13 14:48:32
357
原创 C++文件操作--ofstream和ifstream
ofstream是从内存到硬盘,ifstream是从硬盘到内存,这是以文件为目标对象考虑。其实所谓的流缓冲就是内存空间,在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的。stream这个类有两个重要的运算符: 1、输出(<<) 向流输出数据,系统的默认标准输出流(cout),就是指的显示器输出,从硬盘到内存。 2、输入器(&...
2020-01-07 17:48:03
593
原创 激光slam-粒子滤波
从逻辑上讲,机器人SLAM的过程是:先控制机器人到达一个位姿,然后再进行观测。但是问题出现在了我们是由里程计数据和激光雷达观测数据来求机器人位姿,这就出现了一个逆向的过程即:我们是先有位姿再得到观测数据却变成了先得到观测数据再来求位姿的过程。这就用到了贝叶斯估计。粒子滤波是基于贝叶斯滤波器实现的,也是最典型的应用便是定位问题,主要特性为:贝叶斯估计器的一种实现方式 能处理非...
2020-01-04 14:11:41
1385
原创 激光SLAM坐标系之间关系(map-odom-base_link)
世界坐标(map) 该map坐标系是一个世界固定坐标系,其Z轴指向上方。相对于map坐标系的移动平台的姿态,不应该随时间显著移动。map坐标是不连续的,这意味着在map坐标系中移动平台的姿态可以随时发生离散的跳变。典型的设置中,定位模块基于传感器的监测,不断的重新计算世界坐标中机器人的位姿,从而消除偏差,但是当新的传感器信息到达时可能会跳变。map坐标系作为长期的全局参考是很有用...
2019-12-31 17:07:28
2142
原创 TF坐标变换学习整理
1、什么是tf变换 以机器人为例,定义两个坐标系,一个坐标系以机器人移动平台的中心为原点,称为base_link参考系,另一个坐标系以激光雷达的中心为原点,称为base_laser参考系。 tf变换树定义了不同坐标系之间的平移与旋转变换关系,tf功能包提供了存储、计算不同数据在不同参考系之间变换的功能,因此只需要告诉tf树这些参考系之间的变换公式即可。// ...
2019-12-30 21:56:27
2589
1
原创 三维旋转——四元数
四元数是一种高阶复数,刻画刚体绕任意轴的旋转,四元数q表示为: 其中,i,j,k满足: 由于i,j,k的性质和笛卡尔坐...
2019-12-30 15:51:26
1530
原创 奇异值分解
奇异值分解是一种重要的矩阵分解方法,特征值只能作用在一个n*n的正方矩阵上,而奇异值分解则可以作用在一个m*n的长方矩阵上。奇异值分解同时包含了旋转、缩放和投影三种作用,U和V都起到了对A旋转的作用,而Σ起到了对A缩放的作用。首先,对于一个m*n的矩阵,如果存在正交矩阵U(m*m阶)和V(n*n阶),使式成立...
2019-12-30 10:46:03
330
原创 搞懂C++递归
1、递归思想递归函数即自调用函数,在函数内部直接的或者间接地调用自己特点:(1) 使用递归时,一定要有明确的终止条件!(2) 递归算法解题通常代码比较简洁,但不是很容易读懂。(3) 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。...
2019-12-28 15:21:12
215
原创 激光SLAM—Eigen数学运算
1、矩阵、向量表示Eigen通过tyepdef定义了许多内置类型,不过底层仍然是Eigen::Matrix,如下所示:Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(): //初始化为0 ,Matrix3d实质上是Eigen::Matrix<double, 3, 3>Eigen::Mat...
2019-12-26 19:01:58
253
原创 激光SLAM发展方向及应用
1、SLAM简介 location:(L):在给定地图的情况下,估计机器人的位姿 Mapping(M):在给定机器人位姿的情况下,估计环境地图 SLAM: 同时估计机器人的位姿和环境地图 SLAM解决的问题:(1)机器人在环境中的位姿(2)导航过程中需要的环境地图1.1 SLAM 分类静态环境:尺度地图:滤波器、图优化 ...
2019-12-25 15:02:59
1050
原创 launch文件总结
一、运行launch文件roslaunchpackage_namelaunch_file_name注意:launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行二、标签元素<node pkg="amcl" type="amcl" name="amcl" args="--test">pkg和type属性指出ROS应该运行哪个...
2019-12-21 21:33:15
611
原创 ROS录制与回放数据
rosbag record -a附加-a选项,该选项表示将当前发布的所有话题数据都录制保存到一个bag文件中,个以年份、日期和时间命名并以.bag作为后缀的文件。rosbag info <your bagfile> 查看bag文件中的内容而无需回放出来。rosbag play <your bagfile> 回放bag文件以再现系统运行过程ro...
2019-12-19 19:21:59
165
原创 ROS服务器和客户端
一、编写Service节点#include "ros/ros.h"#include "beginner_tutorials/AddTwoInts.h"bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Response &res)...
2019-12-19 16:17:38
467
原创 ROS消息、服务、发布节点、订阅节点
一、消息和服务 (1)消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。msg文件存放在package的msg目录下。每行声明一个数据类型和变量名。创建一个.msg文件要确保msg文件被转换成为C++,Python和其他语言的源代码,查看package.xml, 确保它包含一下两条语句: <build_depen...
2019-12-18 21:09:35
1492
原创 ROS服务、参数、rqt_console 和 roslaunch
一、服务 服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request)并获得一个响应(response)(1)rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务,提供了很多可以在topic上使用的命令rosservice list 输出可用服务的信息rosservice call ...
2019-12-17 21:26:23
227
原创 C++ 类总结
一、类1)公有成员:public,谁都可以访问。2)私有成员:private,只有自己可以访问。3)保护成员:protected,只有自己和自己的子类可以访问。4)类的成员缺省访控属性为私有,而结构的成员缺省访控属性为公有。5)A.B 则 A 为对象或者结构体;A->B 则A 为指针,-> 是成员提取,A->B 是提取 A 中的成员 B,A 只能是指向类、结构...
2019-12-17 17:18:34
591
原创 ROS节点和话题
一、基本概念Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。Master:节点管理器,ROS名称服务 (帮助节点之间交互)。rosout: ROS中相当于stdout/stderr。//标准输出r...
2019-12-16 19:41:10
1548
原创 创建ROS工作空间
一、创建工作空间 mkdir -p ~/catkin_ws/src -- -p 可以层级创建目录 cd ~/catkin_ws/ catkin_make -- 编译工作空间注意:别忘了把你的工作空间目录加入到.bashrc文件里,使用:gedit ~/.bashrcsource ~/.bashrc二、功能包的创建...
2019-12-16 18:03:32
124
原创 ROS 文件系统命令
1.文件系统工具(1)rospack find [包名称] --返回包的绝对路径 rospack = ros + pack(age)(2) roscd [本地包名称[/子目录]] -- 直接切换到包的目录下或子目录下 roscd = ros + cd 注意:就像ROS中的其它工具一样,roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH...
2019-12-16 16:14:10
156
原创 New分配内存
int *p1 =new int[10];int *p2 =new int[10]();对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()...
2019-12-05 21:38:04
106
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人