图优化理论(1)

2023-05-16

简介

图优化本质上是一个优化问题,所以我们先来看优化问题是什么。

优化问题有三个最重要的因素:目标函数、优化变量、优化约束。一个简单的优化问题可以描述如下:

                                                                   

其中x为优化变量,而F(x)为优化函数。此问题称为无约束优化问题,因为我们没有给出任何约束形式。由于slam中优化问题多为无约束优化,所以我们着重介绍无约束的形式。

当F(x)有一些特殊性质时,对应的优化问题也可以用一些特殊的解法。例如,F(x)为一个线性函数时,则为线性优化问题(不过线性优化问题通常在有约束情形下讨论)。反之则为非线性优化。对于无约束的非线性优化,如果我们知道它梯度的解析形式,就能直接求那些梯度为零的点,来解决这个优化:

                                                                     

梯度为零的地方可能是函数的极大值、极小值或者鞍点。由于现在F(x)的形式不确定,我们只好遍历所有的极值点,找到最小的作为最优解。

但是我们为什么不这样用呢?因为很多时候F(x)的形式太复杂,导致我们没法写出导数的解析形式,或者难以求解导数为零的方程。因此,多数时候我们使用迭代方式求解。从一个初值x0出发,不断地导致当前值附近的,能使目标函数下降的方式(反向梯度),然后沿着梯度方向走出一步,从而使得函数值下降一点。这样反复迭代,理论上对于任何函数,都能找到一个极小值点。

迭代的策略主要体现在如何选择下降方向,以及如何选择步长两个方面。主要有 Gauss-Newton (GN)法和 Levenberg-Marquardt (LM)法两种。


图优化

所谓的图优化,就是把一个常规的优化问题,以图(Graph)的形式来表述。

图是由顶点(Vertex)边(Edge)组成的结构,而图论则是研究图的理论。我们记一个图为G={ V,E },其中V为顶点集,E为边集。

边一条边连接着若干个顶点,表示顶点之间的一种关系。边可以是有向的或是无向的,对应的图称为有向图或无向图。边也可以连接一个顶点(Unary Edge,一元边)、两个顶点(Binary Edge,二元边)或多个顶点(Hyper Edge,多元边)。最常见的边连接两个顶点。当一个图中存在连接两个以上顶点的边时,称这个图为超图(Hyper Graph)。而SLAM问题就可以表示成一个超图(在不引起歧义的情况下,后文直接以图指代超图)。

SLAM的核心是根据已有的观测数据,计算机器人的运动轨迹和地图。假设在时刻k,机器人在位置xk处,用传感器进行了一次观测,得到了数据\large z{_{k}}。传感器的观测方程为:

                                                                               

由于误差的存在,\large z{_{k}}不可能精确地等于\large h(x{_{k}}),于是就有了误差:

                                                                               

那么,如果我们以\large x{_{k}}为优化变量,以minxFk(\large x{_{k}})=∥ek∥为目标函数,就可以求得\large x{_{k}}的估计值,进而得到我们想要的东西了。这实际上就是用优化来求解SLAM的思路。

x可以是一个机器人的Pose(6自由度下为 4×4的变换矩阵T 或者 3自由度下的位置与转角[x,y,θ],也可以是一个空间点(三维空间的[x,y,z]或二维空间的[x,y])。相应的,观测方程也有很多形式,如:

  • 机器人两个Pose之间的变换;
  • 机器人在某个Pose处用激光测量到了某个空间点,得到了它离自己的距离与角度;
  • 机器人在某个Pose处用相机观测到了某个空间点,得到了它的像素坐标;

同样,它们的具体形式很多样化,这允许我们在讨论slam问题时,不局限于某种特定的传感器或姿态表达方式。

在图中,以顶点表示优化变量,以边表示观测方程。由于边可以连接一个或多个顶点,所以我们把它的形式写成更广义的zk=h(xk1,xk2,…),以表示不限制顶点数量的意思。对于刚才提到的三种观测方程,顶点和边是什么形式呢?

  • 机器人两个Pose之间的变换;——一条Binary Edge(二元边),顶点为两个pose,边的方程为T1=ΔT⋅T2。
  • 机器人在某个Pose处用激光测量到了某个空间点,得到了它离自己的距离与角度;——Binary Edge,顶点为一个2D Pose:[x,y,θ]T
  • 和一个Point:[λx,λy]T,观测数据是距离r和角度b,那么观测方程为:

                                                              

  • 机器人在某个Pose处用相机观测到了某个空间点,得到了它的像素坐标;——Binary Edge,顶点为一个3D Pose:T和一个空间点x=[x,y,z]T,观测数据为像素坐标z=[u,v]T。那么观测方程为:                        

                                                                                       

C为相机内参,R,t为旋转和平移。

由于机器人可能使用各种传感器,故我们不限制顶点和边的参数化之后的样子。比如我既加了激光,也用相机,还用了IMU,轮式编码器,超声波等各种传感器来做slam。为了求解整个问题,我的图中就会有各种各样的顶点和边。但是不管如何,都是可以用图来优化的。


图优化怎么做

现在让我们来仔细看一看图优化是怎么做的。假设一个带有n条边的图,其目标函数可以写成:

                                                                                   

  1. e 函数在原理上表示一个误差,是一个矢量,作为优化变量\large x{_{k}}\large z{_{k}}符合程度的一个度量。它越大表示\large x{_{k}}越不符合\large z{_{k}}。但是,由于目标函数必须是标量,所以必须用它的平方形式来表达目标函数。最简单的形式是直接做成平方:e(x,z)Te(x,z)。进一步,为了表示我们对误差各分量重视程度的不一样,还使用一个信息矩阵 Ω 来表示各分量的不一致性。
  2. 信息矩阵 Ω 是协方差矩阵的逆,是一个对称矩阵。它的每个元素\large \Omega {_{i,j}}作为\large e{_{i}},e{_{j}}的系数,可以看成我们对\large e{_{i}},e{_{j}}这个误差项相关性的一个预计。最简单的是把Ω设成对角矩阵,对角阵元素的大小表明我们对此项误差的重视程度。
  3. 这里的\large x{_{k}}可以指一个顶点、两个顶点或多个顶点,取决于边的实际类型。所以,更严谨的方式是把它写成\large e{_{k}}(z{_{k}},x{_{k1}},x{_{k2}},...),但是那样写法实在是太繁琐,我们就简单地写成现在的样子。由于\large z{_{k}}是已知的,为了数学上的简洁,我们再把它写成\large e{_{k}}(x{_{k}})的形式。于是总体优化问题变为n条边加和的形式:

                                                                               

重复一遍,边的具体形式有很多种,可以是一元边、二元边或多元边,它们的数学表达形式取决于传感器或你想要描述的东西。例如视觉SLAM中,在一个相机Pose \large T{_{k}} 处对空间点xk进行了一次观测,得到\large z{_{k}},那么这条二元边的数学形式即为:

                                                         

单个边其实并不复杂。

现在,我们有了一个很多个节点和边的图,构成了一个庞大的优化问题。我们并不想展开它的数学形式,只关心它的优化解。那么,为了求解优化,需要知道两样东西:一个初始点和一个迭代方向。为了数学上的方便,先考虑第k条边\large e{_{k}}(x{_{k}})吧。

我们假设它的初始点为\large \tilde{x}{_{k}},并且给它一个Δx的增量,那么边的估计值就变为\large F{_{k}}(\large \tilde{x}{_{k}}+\Delta x),而误差值则从 \large e{_{k}}(\tilde{x}{_{k}}) 变为 \large e{_{k}}(\large \tilde{x}{_{k}}+\Delta x)。首先对误差项进行一阶展开:

                                                                     

这是的Jk是ek关于xk的导数,矩阵形式下为雅可比阵。我们在估计点附近作了一次线性假设,认为函数值是能够用一阶导数来逼近的,当然这在Δx很大时候就不成立了。

于是,对于第k条边的目标函数项,有:

                                                        

在熟练的同学看来,这个推导就像\large (a+b)^{_{2}}=a^{_{2}}+2ab+b^{^{2}}一样简单(事实上就是好吧)。最后一个式子是个定义整理式,我们把和Δx无关的整理成常数项 \large C{_{k}} ,把一次项系数写成 \large 2b{_{k}} ,二次项则为 \large H{_{k}}(注意到二次项系数其实是Hessian矩阵)。

请注意 \large C{_{k}} 实际就是该边变化前的取值。所以在\large x{_{k}}发生增量后,目标函数\large F{_{}k}项改变的值即为:

                                                                                        

我们的目标是找到Δx,使得这个增量变为极小值。所以直接令它对于Δx的导数为零,有:

                                                                       

所以归根结底,我们求解一个线性方程组

                                                                                                        

在每一步迭代中,我们都要求解一个雅可比和一个海塞。而一个图中经常有成千上万条边,几十万个待估计参数,这在以前被认为是无法实时求解的。但是SLAM构建的图,并非是全连通图,它往往是很稀疏的。例如一个地图里大部分路标点,只会在很少的时刻被机器人看见,从而建立起一些边。大多数时候它们是看不见的(就像后宫怨女一样)。体现在数学公式中,虽然总体目标函数\large F(x)有很多项,但某个顶点\large x_{k}就只会出现在和它有关的边里面!

这会导致什么?这导致许多和\large x_{k}无关的边,比如说\large e_{j},对应的雅可比\large J_{j}就直接是个零矩阵!而总体的雅可比\large J中,和\large x_{k}有关的那一列大部分为零,只有少数的地方,也就是和\large x_{k}顶点相连的边,出现了非零值。

                                                      

相应的二阶导矩阵H中,大部分也是零元素。这种稀疏性能很好地帮助我们快速求解上面的线性方程。稀疏代数库包括SBA、PCG、CSparse、Cholmod等等。g2o正是使用它们来求解图优化问题的。要补充一点的是,在数值计算中,我们可以给出雅可比和海塞的解析形式进行计算,也可以让计算机去数值计算这两个阵,而我们只需要给出误差的定义方式即可。


流形

我们在讨论给目标函数F(x)一个增量Δx时,直接就写成了F(x+Δx)。但是这个加法可能没有定义!由于我们不限制顶点的类型,x在参数化之后,很可能是没有加法定义的。最简单的就是常见的四维变换矩阵T或者三维旋转矩阵R。它们对加法并不封闭,因为两个变换阵之和并不是变换阵,两个正交阵之和也不是正交阵。它们乘法的性质非常好,但是确实没有加法,所以也不能像上面讨论的那样去求导。

但是,如果图优化不能处理SE(3)或SO(3)中的元素,那将是十分令人沮丧的,因为SLAM要估计的机器人轨迹必须用它们来描述啊。

回想我们先前讲过的李代数知识。虽然李群 SE(3) 和 SO(3) 是没有加法的,但是它们对应的李代数 se(3),so(3) 有啊! 数学一点地说,我们可以求它们在正切空间里的流形上的梯度!如果读者觉得理解困难,我们就说,通过指数变换和对数变换,先把变换矩阵和旋转矩阵转换成李代数,在李代数上进行加法,然后再转换到原本的李群中。这样我们就完成了求导。

这样的好处是我们完全不用重新推导公式。这件事比我们想的更加简单。在程序里,我们只需重新定义一个优化变量x的增量加法即可。如果x是一个SE(3)里的变换矩阵,我们就遵守刚才讲的李代数转换方式。当然,如果x是其他什么奇怪的东东,只要定义了它的加法,程序就会自动去计算如何求它的雅可比。


核函数

引入核函数的原因,是因为SLAM中可能给出错误的边。SLAM中的数据关联让科学家头疼了很长时间。出于变化、噪声等原因,机器人并不能确定它看到的某个路标,就一定是数据库中的某个路标。万一认错了呢?我把一条原本不应该加到图中的边给加进去了,会怎么样?

嗯,那优化算法可就慒逼了……它会看到一条误差很大的边,然后试图调整这条边所连接的节点的估计值,使它们顺应这条边的无理要求。由于这个边的误差真的很大,往往会抹平了其他正确边的影响,使优化算法专注于调整一个错误的值

于是就有了核函数的存在。核函数保证每条边的误差不会大的没边,掩盖掉其他的边。具体的方式是,把原先误差的二范数度量,替换成一个增长没有那么快的函数,同时保证自己的光滑性质(不然没法求导啊!)。因为它们使得整个优化结果更为鲁棒(所谓鲁棒性,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性),所以又叫它们为robust kernel(鲁棒核函数)。

很多鲁棒核函数都是分段函数,在输入较大时给出线性的增长速率,例如cauchy核,huber核等等。当然具体的我们也不展开细说了。

函数在许多优化环境中都有应用,博主个人印象较深的时当年有一大堆人在机器学习算法里加各种各样的核,我们现在用的svm也会带个核函数。


小结

最后总结一下做图优化的流程。

  1. 选择你想要的图里的节点与边的类型,确定它们的参数化形式;
  2. 往图里加入实际的节点和边;
  3. 选择初值,开始迭代;
  4. 每一步迭代中,计算对应于当前估计值的雅可比矩阵和海塞矩阵;
  5. 求解稀疏线性方程HkΔx=−bk
  1. ,得到梯度方向;
  2. 继续用GN或LM进行迭代。如果迭代结束,返回优化值。

实际上,g2o能帮你做好第3-6步,你要做的只是前两步而已。

转载自:http://www.cnblogs.com/gaoxiang12/p/5244828.html

 

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

图优化理论(1) 的相关文章

  • 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021 5 10 1 串口通信简介1 1 波特率1 2 数据位1 3 停止位1 4 奇偶校验位 2 GPS模块串口通信配置2 1 驱动安装2 2 插入GPS模块2 3 GPS模块串口通信数据简介 3 Java实现G
  • Lambda表达式的使用

    对于jdk1 8其实并不是那么熟悉 xff0c 但是要学习这一点 xff0c 对以后工作有好处 xff0c 接下来开始学习jdk1 8在Android studio的配置以及lambda表达式的使用吧 Lambda表达式 jdk1 8中新增
  • ROS实现无人机目标跟踪/物体跟随/循迹

    无人机自主物体跟随 循迹 1 物体跟踪1 1 实现思路1 2 代码示例 2 自主寻线 本实验采用ROS和OpenCV实现功能 xff0c 实验平台采用Parrot的Bebop2无人机ROS部分的学习可以参考我的专栏 xff1a ROS学习记
  • vs code中项目的基本配置--include路径、运行参数、debug配置

    1 安装C C 43 43 for Visual Studio Code 点击左边扩展栏图标 gt 搜索C C 43 43 gt 安装 gt Reload xff1a 安装完成之后 xff0c 打开你的包含c 43 43 的文件夹 xff0
  • CMakeLists.txt编写规范模板及CMake常用变量

    文章目录 基本语法规则常见CMakeLists txt中指令剖析从VS项目配置过程理解CMakeLists内容CMake中常用变量汇总常用CMakeLists文件模板 基础模板使用OpenCV库CMakeLists文件模板使用PCL库CMa
  • C++ 多线程detach()操作的坑以及传参

    detach 的作用是将子线程和主线程的关联分离 xff0c 也就是说detach 后子线程在后台独立继续运行 xff0c 主线程无法再取得子线程的控制权 xff0c 即使主线程结束 xff0c 子线程未执行也不会结束 当主线程结束时 xf
  • 条件变量中的唤醒丢失问题分析

    本文是在其他作者博文的基础上进行了部分补充 原文 xff1a https zhuanlan zhihu com p 55123862 0 前言 条件变量 xff08 condition variable xff09 和互斥锁 xff08 m
  • 无人车传感器 IMU与GPS数据融合进行定位机制

    前言 上一次的分享里 xff0c 我介绍了GPS的原理 xff08 三角定位 xff09 及特性 xff08 精度 频率 xff09 xff0c 同时也从无人车控制的角度 xff0c 讨论了为什么仅有GPS无法满足无人车的定位要求 为了能让
  • C++类对象的赋值与=运算符重载

    本文主要介绍C 43 43 中的赋值运算符重载函数 xff08 operator 61 xff09 的相关知识 1 概述 1 1 why 首先介绍为什么要对赋值运算符 61 进行重载 某些情况下 xff0c 当我们编写一个类的时候 xff0
  • 微信小程序开发入门(一)

    所有示例的完整代码 xff0c 都可以从 GitHub 的代码仓库下载 一 小程序是什么 xff1f 学习小程序之前 xff0c 先简单说一下 xff0c 它到底是什么 字面上讲 xff0c 小程序就是微信里面的应用程序 xff0c 外部代
  • rtp载荷H264解包过程分析,ffmpeg解码qt展示

    网络抽象层单元 NALU NALU头 NALU 头 由1个byte组成 它的语法如下 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F 1 个比特 for
  • CPU上下文切换、进程上下文、中断上下文

    由于Linux是一个多任务操作系统 xff0c 能够支持远大于CPU数量的任务同时运行 当然 xff0c 这些任务实际上并不是真的在同时运行 xff0c 而是由CPU进行调度 xff0c 将时间分片 xff0c 每个任务占用1个时间片 xf
  • Gstreamer概述

    1 什么是GStreamer GStreamer 是用来构建流媒体应用的开源多媒体框架 framework xff0c 其基本设计思想来自于俄勒冈 Oregon 研究生学院有关视频管道的创意 同时也借鉴了DirectShow的设计思想 其目
  • grbl学习之旅---serial篇

    serial c和serial h文件是实现了通过串行端口发送和接受字节的功能 首先是serial h中定义了基本函数和常量大小 xff1a ifndef RX BUFFER SIZE define RX BUFFER SIZE 128 定
  • ip rule,ip route,iptables 三者之间的关系

    以一例子来说明 xff1a 公司内网要求192 168 0 100 以内的使用 10 0 0 1 网关上网 xff08 电信 xff09 xff0c 其他IP使用 20 0 0 1 xff08 网通 xff09 上网 首先要在网关服务器上添
  • 什么是Zero-copy零拷贝

    考虑这样 种常 的情形 xff1a 你需要将静态内容 xff08 类似图 件 xff09 展 给 户 那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到 个内存buf中 xff0c 然后将这个buf通过socket传输给 户 xff
  • 图解协程原理

    前言 协程 Coroutines xff0c 是 Kotlin 最神奇 的特性 xff0c 没有之一 本文会以图解 43 动画的形式解释 Kotlin 协程的原理 看完本文后 xff0c 你会发现 xff0c 原来协程也没有那么难 本文要求
  • ubuntu 16.04下安裝和配置ros

    書上和網上關於ubuntu下安裝ros的文章很多 xff0c 但是很多介紹的不完整 xff0c 並且ubuntu和ros之間其實是有版本對應關系的 xff0c 並不是所有的ros都能安裝到所有的ubuntu上 xff0c xff08 很多書
  • Ubuntu 16.04安装docker详细步骤

    因需要安装opendronemap 而这个依赖于docker 所以记录了一下安装docker的步骤 比较简单 通过apt的docker官方源安装最新的Docker CE Community Edition xff0c 即Docker社区版
  • 在本地shell脚本中ssh到远程服务器并执行命令

    shell远程执行 xff1a 经常需要远程到其他节点上执行一些shell命令 xff0c 如果分别ssh到每台主机上再去执行很麻烦 xff0c 因此能有个集中管理的方式就好了 一下介绍两种shell命令远程执行的方法 前提条件 xff1a

随机推荐

  • Catkin_make执行过程

    这是一个比较复杂的问题 xff0c 但是有时候会有莫名其妙的编译错误 xff0c 在找错误的过程中会非常需要了解这个过程 1 模板文件 首先说一下 in文件 在catkin的目录中有许多 in文件 这些都是模板文件 xff0c 以 opt
  • Docker用yum安装步骤

    Docker用yum安装步骤 一 安装docker xff08 完整版 xff09 1 Docker 要求 CentOS 系统的内核版本高于 3 10 uname r 2 使用 root 权限登录 Centos 确保 yum 包更新到最新
  • 1024,如果全世界程序员都消失了,会怎样?

    这两天 xff0c 有一个话题引起了程序员的广泛讨论 xff1a 年薪80W程序员相亲被鄙视 某知名互联网社区 xff0c 一网友发帖 xff0c 自己年薪80W去相亲 xff0c 竟然被鄙视不如在二本学校教书的大学老师 估计令他没想到的是
  • 非线性控制1.1——稳定与跟踪问题概念

    一 非线性控制系统的两大任务 1 稳定 xff08 或称调节 xff09 问题 稳定问题是要使得闭环系统的状态稳定在一个平衡点附近 对于稳定问题 xff0c 系统的输出不一定要有具体的物理意义 xff0c 此时可以借助输入 输出状态线性化方
  • 在 linux ubuntu 18.04 上运行QQ音乐

    在 linux ubuntu 18 04 上运行QQ音乐 我使用的组合为 ubuntu 18 04 43 wine stable 3 6 43 QQ音乐17 63 xff0c 未在其它平台做过尝试 一直想在ubuntu上好好听音乐 xff0
  • 非线性控制1.0——自适应控制和鲁棒控制

    1 鲁棒控制和自适应控制的联系与区别 鲁棒控制是以目的定义的控制方法集合 xff0c 自适应控制是以手段定义的控制方法集合 xff0c 这两种控制都是为了应对 当数学模型不能精确表示实际系统的情况下 狭义的鲁棒控制是指H2 xff0c Hi
  • 非线性控制2.0——鲁棒控制之H无穷控制器设计

    一 基本概念 对于图1所示系统 xff0c u为控制输入 xff0c y为测量输出 xff0c z为被调输出 xff0c w为干扰输入 xff0c 由输入u xff0c w到输出y xff0c z的传递函数G成为增广被控对象 xff0c 控
  • 非线性控制1.0——控制理论生态及结构

    一 控制理论地图 二 控制理论发展及结构 上图应用于 xff1a https www zhihu com people xiang yi 55 49 answers
  • 四旋翼飞行器——飞行原理

    1 机械结构 旋翼对称分布在机体的前后 左右四个方向 xff0c 四个旋翼处于同一高度平面 xff0c 且四个旋翼的结构和半径都相同 xff0c 四个电机对称的安装在飞行器的支架端 xff0c 支架中间空间安放飞控板 结构形式如图 1 1所
  • 四旋翼飞行器——非线性化模型

    一 建模思路 该模型目标控制量是机体相对于地面坐标系的线速度的三个分量Vx xff0c Vy xff0c Vz xff0c 而我们能控的实质上只有四个电机的转速W1 xff0c W2 xff0c W3 xff0c W4 怎样由输入一步步推导
  • 故障诊断4—龙伯格状态观测器设计

    1 龙伯格状态观测器概念 已经线性系统模型如下 xff1a 当系统状态量难以获取 xff0c 但实际控制中又需要利用系统状态量时 xff0c 如何通过输入量和输出量重构系统状态量 xff1f 这便是龙伯格状态观测器设计初衷 xff0c 将实
  • 故障诊断5——状态观测器和输出观测器

    1 状态观测器分类 在现代控制理论中 xff0c 控制系统的基本结构和经典控制理论一样 xff0c 仍然是由受控对象和反馈控制器两部分构成的闭环系统 不过在经典理论中习惯于采用输出反馈 xff0c 而在现代控制理论中则更多地采用状态反馈 由
  • GPS漂移和定位不准确的解决办法

    解决GPS漂移主要从两方面入手 xff1a 一 主系统的设计主要减少在近距离内对GPS信号的干扰 二 软件处理 软件处理主要集中在导航软件处完成 xff0c 导航软件会将坐标定位在道路之内 xff0c 如果GPS接收到的信号超出道路的半径范
  • AI---是什么?可以做什么?

    1 AI的项目简单介绍 图像识别 描述 xff1a 给定图片 xff0c 识别图片中有什么 xff1f 算法 xff1a KNN CNN 情感分析 描述 xff1a 判断文本包含的情感是正面 负面还是中性 关键 xff1a 文本如何表示成向
  • realsense的安装问题

    realsense的安装问题 0 旁白1 SDK的安装2 python开发包的安装3 nodejs开发包的安装方法1 xff1a 方法2 xff1a 接手一位同事的realsense相关项目 xff0c 先配置一个环境 xff0c 出现不少
  • 二叉排序树的删除

    xff08 网上讲二叉排序树删除的资料很少 xff0c 这篇很不错 xff01 转自 xff1a http bbs csdn net topics 110010437 xff09 二叉排序树的删除 xff1a 对于一般的二叉树来说 xff0
  • 分布式锁学习

    概述 分布式锁是控制分布式系统之间同步访问共享资源的一种方式 在分布式系统中 xff0c 常常需要协调他们的动作 如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源 xff0c 那么访问这些资源的时候 xff0c 往往需要互斥来
  • 无人机飞行控制

    intro 这篇笔记记录了无人机飞控算法和px4相关 control algorithm adrc 周立功讲adrc 参数整定 xff1a Scaling and Bandwidth Parameterization
  • 168-HITL-dev-manual

    HITL todo 使用mavlink收ref和imu 可以选择发出pwm和torque 发出torque的话 xff0c 没有考虑pwm的饱和 发出pwm的话 xff0c 电机的参数也不准 参考GAAS FC 写收的imu gps xff
  • 图优化理论(1)

    简介 图优化本质上是一个优化问题 xff0c 所以我们先来看优化问题是什么 优化问题有三个最重要的因素 xff1a 目标函数 优化变量 优化约束 一个简单的优化问题可以描述如下 其中x为优化变量 xff0c 而F x 为优化函数 此问题称为