光线投射算法
1. 前沿 光线投射算法(Ray Casting)是指在一个空间体素模型中,已知起点和终点,求光线从起点到终点经过的所有体素 此算法与直线绘制算法的不同之处在于:一个是寻找点,一个是寻找体素。因此当直线穿过对角点时,直线绘制算法直接加入这个点就行了;光线投射算法需要把对角线周围的体素加入进去 2. 快速体素遍历算法 2.1 思路 已知起点P0P_0P0和终点PnP_nPn,可以分别计算两点距离在x轴方向和y轴方向的投影Δx,Δy\Delta x,\Delta yΔx,Δy。可以把每个栅格的边长设为1(栅格索引以1为单位进行移动),则移动一个格子时的比例(或者称为时间)为tΔx=1/Δxt_{\Delta x}=1/\Delta xtΔx=1/Δx或tΔy=1/Δyt_{\Delta y}=1/\Delta ytΔy=1/Δy。分别累积计算水平方向穿过网格边和竖直方向穿过网格边的ttt值,记为txt_{x}tx和tyt_{y}ty 如果t_{x} < t_{y}$,那么光线先穿过垂直边界,那么向x方向移动一步 如果t_{x} \geq t_{y}$, 那么...
直线绘制算法
1. 前沿 数学上直线是连续的,由无穷多点构成;但在计算机显示中,屏幕是离散的像素网格,只能用整数坐标的像素点去逼近连续直线。因此需要算法来确定哪些整数像素点最能代表这条直线,这就是直线绘制算法的核心作用 算法的输入是起点和终点的坐标,算法的输出是两点连成的直线经过的像素网格坐标序列 2. DDA算法 全称为数字差分分析器(Digital Differential Analyzer)算法 2.1 思路 直线的斜截式方程微分形式为 Δy=kΔx\Delta y = k \Delta x Δy=kΔx 那么有 {xi+1=xi+Δxyi+1=yi+Δy=yi+kΔx\left\{ \begin{align*} & x_{i+1} = x_i + \Delta x \\ & y_{i+1} = y_i + \Delta y = y_i + k \Delta x \end{align*} \right. {xi+1=xi+Δxyi+1=yi+Δy=yi+kΔx 当斜率为0≤k<10 \leq k <10≤k<1,且Δx\Delta xΔx...
DSVP代码解读
1. 代码依赖 volumetric_mapping:项目地址 minkindr:项目地址 minkindr_ros:项目地址 2. 代码结构 2.1 dsvplanner包 入口文件为drrtp_node,此文件会启动drrtp drrtp会启动/drrtPlannerSrv服务的服务端和/cleanFrontierSrv服务的服务端 2.2 kdtree包 使用kdtree数据接口来管理drrt的节点,从而加速最近邻搜索 这个包使用的是开源项目 参考文章 代码解析:DSVP: Dual-Stage Viewpoint Planner for Rapid Exploration by Dynamic Expansion
Chapter 4 多线程异步通信和并发计算
1. 异步通信 1.1 异步变量 promise: promise提供存储异步通信的值 , 再通过其对象创建的future异步获得结果 promise创建的一个对象只能用一次set_value设置传递值;也只能用一次get_future()获取future对象 创建子线程时需要使用move将promise对象传给子线程 future: future对象的get()方法会阻塞等待promise::set_value()的值 代码示例: #include <iostream> #include <future> #include <thread> using namespace std; void TestFuture(promise<string> p) { p.set_value("TestFuture value\n"); } int main(int argc, char* argv[]) { promise<string> p;/*异步传输变量存储*/ auto f...
Chapter 3 锁资源管理和条件变量
1. RAII锁管理类 借助对象实现构造时可自动加锁,析构时自动解锁,并通过{ }控制锁的临界区 1.1 互斥锁管理类lock_guard(C++11) 关键词标记: adopt_lock标记/adopt_lock_t标记(C++11),用于手动加锁后,想让RAII工具接管解锁的场景,此时不需要再次手动释放锁 1.2 互斥锁管理类unique_lock(C++11) 关键词标记: adopt_lock标记/adopt_lock_t标记(C++11) defer_lock延后拥有,只有再次手动上锁后才拥有锁,如果未拥有锁,则出栈区不释放。当unique_lock作为成员变量时需要使用此标记 try_to_lock尝试获取锁,不阻塞,获取失败退出栈区不释放 特点: 可以调用unlock()和lock()来临时解锁和上锁 可以调用owns_lock()来判断是否拥有锁,拥有则返回true 比lock_guard更加灵活,但是效率、内存占用差一些,同时支持移动构造 1.3 共享锁管理类shared_lock(C++14) 特点: ...
Chapter 2 多线程通信和同步
2. 锁 2.1 互斥锁mutex 成员方法: lock()获取锁资源,如果获取不到则阻塞等待 unlock()释放锁资源 try_lock()尝试获取锁资源,如果获取成功返回true;否则返回false,并不会阻塞线程 互斥锁的坑: 释放锁资源只是告诉操作系统要释放锁资源,故而并不是立即释放,此时如果再次立即获取锁资源,此线程会再次上锁,其他线程无法获取 2.2 超时锁timed_mutex 成员方法: try_lock_for(std::chrono::duration)在指定的时间期限内尝试获取互斥锁。如果在这个时间期限内获得了锁,函数返回 true;否则函数返回false。如果接受的参数接近0,那么函数的功能基本就等于try_lock() 2.3 递归锁recursive_mutex和recursive_timed_mutex 特点: 可以多次lock()和unlock()当计数为0时才真正释放,而普通锁多次上锁属于未定义行为 2.4 共享锁shared_timed_mutex(C++14)和shared_mutex(C++17) 成员方法: ...
ROS2使用教程
1. 安装 1.1 安装ros2 切换成bash后使用小鱼一键安装 bash wget http://fishros.com/install -O fishros && . fishros Ubuntu 22.04建议安装humble Ubuntu 24.04建议安装jazzy 1.2 安装colcon sudo apt install python3-colcon-common-extensions 2. ZSH补全 2.1 humble版本 为了解决zsh下ros2命令无法自动补全的问题,我们需要在/opt/ros/humble/setup.zsh的末尾添加如下命令 eval "$(register-python-argcomplete3 ros2)" eval "$(register-python-argcomplete3 colcon)" 2.2 jazzy版本 为了解决zsh下ros2命令无法自动补全的问题,我们需要在/opt/ros/jazzy/setup.zsh的末尾添加如下命令 eval "$(register-python-argcompl...
LaTeX中的数学符号
\to是\rightarrow的简化,二者是等价的 \gets是\leftarrow的简化,二者是等价的 绝对值符号尽可能使用\lvert \rvert 和 \lVert \rVert 这两组符号能正确处理符号间距 加粗时尽量选择\bm{},但是需要添加宏包\usepackage{bm},这个指令可以处理希腊字体且不会使斜体消失
Chapter 7 Matrix algorithms
1. 计算特征值和特征向量 1.1 幂迭代法(The power iteration method) 在本节中,我们概述了一种计算可对角化矩阵的特征值和特征向量的技术。幂迭代(Power Iteration,PI)方法可能是计算矩阵一个特征值/特征向量对的最简单方法。它的收敛速度相对较慢,并且存在一些局限性。然而,我们在这里介绍它,因为它构成了许多其他更精细的特征值计算算法的基础。还有许多其他计算特征值和特征向量的技术,其中一些是为具有特殊结构的矩阵设计的,例如稀疏矩阵、带状矩阵或对称矩阵 设A∈Rn,n\bm{A} \in \mathbb{R} ^{n,n}A∈Rn,n,假设A\bm{A}A可对角化,并记λ1,⋯ ,λn\lambda _1 ,\cdots , \lambda _nλ1,⋯,λn为A\bm{A}A的特征值,按模递减顺序排列,即∣λ1∣>∣λ2∣≥⋯≥∣λn∣\lvert \lambda _1 \rvert > \lvert \lambda _2 \rvert \geq \cdots \geq \lvert \lambda _n \rvert∣...
Chapter 6 Linear equations and least squares
我们在这里介绍线性方程以及一种用于表示它们的标准形式Ax=y\bm{Ax} = \bm{y}Ax=y,其中x∈Rn\bm{x} \in \mathbb{R} ^nx∈Rn为未知变量,A∈Rm,n\bm{A} \in \mathbb{R} ^{m,n}A∈Rm,n为系数矩阵,y∈Rm\bm{y} \in \mathbb{R} ^my∈Rm为已知向量。实际上,求解一组线性方程 Ax=y\bm{Ax} = \bm{y}Ax=y的问题也可以解释为一个优化问题,即相对于x\bm{x}x最小化∥Ax−y∥2\lVert \bm{Ax} - \bm{y} \rVert_2∥Ax−y∥2 1. 动机和示例 如前面的例子所示,通用的线性方程可以用向量形式表示为 Ax=y\bm{Ax} = \bm{y} Ax=y 其中x∈Rn\bm{x} \in \mathbb{R} ^nx∈Rn为未知变量,A∈Rm,n\bm{A} \in \mathbb{R} ^{m,n}A∈Rm,n为系数矩阵,y∈Rm\bm{y} \in \mathbb{R} ^my∈Rm为已知向量。 我们预期,根据A\bm{A}A和y\b...