非线性优化库G20实战套路

非线性优化库g2o实战中,基本按照如上图5步进行;

02

G2O实战套路

2.0准备工作

BlockSolver

1.BlockSolver用于计算稀疏的雅可比矩阵和Hessian矩阵;

2.BlockSolverTraits:P表示姿态纬度(流形manifold下最小表示),L表示三维点维度;为构建雅可比矩阵和Hessian矩阵提供尺度;

3.为便于使用,此处采用typedef缩写,或系统自带缩写:

typedefg2o::BlockSolver>Block;

typedefBlockSolver>BlockSolver_6_3;

//用于BA/3Dslam;

typedefBlockSolver>BlockSolver_7_3;

//用于带尺度的BA/3Dslam;

typedefBlockSolver>BlockSolver_3_2;

//用于BA/2D3自由度slam;

此外还具有变尺寸:

usingBlockSolverX=BlockSolverPL

Eigen::Dynamic>;

2.1建立线性求解器

建立线性求解器LinearSolver,用于H△x=b,△x=H.inv()*b;

(结合实际情况替换Block)

第1步

Block::LinearSolverType*linearSolver=new

g2o::LinearSolverDense(Block::PoseMatrixType);

其他求解器

LinearSolverDense

使用denseCholesky分解法

LinearSolverEigen

依赖项只有eigen,与Csparse差不多

LinearSolverCholmod

使用sparsecholesky分解法

LinearSolverCSparse

LinearSolverPCG

使用preconditionedconjugategradient

2.2建立块求解器

建立块求解器BlockSolver,用LinearSolver对其初始化;

第2步

Block*solver_ptr=new

Block(std::unique_ptr

(linearSolver));

2.3建立总求解器

从GN/LM/DogLeg中选择优化算法,并用块求解器初始化

第3步

g2o::OptimizationAlgorithmLevenberg*solver=new

g2o:OptimizationAlgorithmLevenberg(std::unique_ptr(solver_ptr));

其他优化算法求解器

OptimizationAlgorithmGaussNewton

高斯牛顿

OptimizationAlgorithmDogleg

DL

2.4建立稀疏优化器

建立稀疏优化器optimizer,并为其设定求解器

第4步

g2o::SparseOptimizeroptimizer;

optimizer.setAlgorithm(solver);

optimizer.setVerbose(true);//打开调试输出

2.5添加顶点

第5步

5.1初始化顶点

g2o::VertexSE3Expmap*vSE3=

newg2o::VertexSE3Expmap();

5.2顶点赋初值

vSE3->setEstimate(

Converter::soSE3Quat(pFrame->mTcw));//setEstimate是继承而来

5.3顶点设定编号

vSE3->setId(idx);

//如果单个节点就是0;

//多个节点看情况确定,setId是继承而来;

5.4顶点是否参与优化

vSE3->setFixed(false);

//参与优化所以无需固定;

//有些定点只是提供约束不优化所以需要固定true

5.5顶点是否对齐shur,针对三维点类型

vSE3->setMarginalized(false);

5.6顶点加入优化器optimizer

optimizer.addVertex(vSE3);

//addVertex是继承而来

自定义顶点

classVertexSE3Expmap::public

g2o::BaseVertex<6,SE3Quat>//6:流形空间中定点的最小维度表示

//SE3Quat:顶点数据类型

{

public:

EIGEN_MAKE_ALIGNED_OPERATOR_NEW//Eigen库在类当中使用时必须添加,以便位对齐

VertexSE3Expmap(){}//顶点构造函数

virtualvoidread(std::istream&is){}

virtualvoidwrite(std::ostream&os)const{}

//read和write函数一般情况下可忽略

virtualvoidsetOriginImpl()//设定顶点初值或重置

_estimate=SE3Quat();

//SE3Quat是顶点中成员的初始化方式

}

//例如构造函数

SE3Quat(){

_r.setIdentity();

_t.setZero();}

virtualvoidoplusImpl(constdouble*update)override//定点的更新方式

//Eigen::Mapupdate(_update);

_estimate+=/*update*/;

//setEstimate(SE3Quat::exp(update)*estimate());

常见顶点

VertexSE2:publicBaseVertex<3,SE2>

//2DposeVertex,(x,y,theta)

VertexSE3:publicBaseVertex<6,Isometry3>

//6dvector(x,y,z,qx,qy,qz)(notethatwe

leaveoutthewpartofthequaternion)

VertexPointXY:publicBaseVertex<2,Vector2>

VertexPointXYZ:publicBaseVertex<3,Vector3>

VertexSBAPointXYZ:publicBaseVertex<3,Vector3>

//SE3Vertexparameterizedinternallywithatransformationmatrixandexternallywith

itsexponentialmap

VertexSE3Expmap:publicBaseVertex<6,SE3Quat>

//SBACamVertex,(x,y,z,qw,qx,qy,qz),(x,y,z,qx,qy,qz)(notethatweleaveoutthewpart

ofthequaternion.

//qwisassumedtobepositive,otherwisethereisanambiguityinqx,qy,qzasa

rotation

VertexCam:publicBaseVertex<6,SBACam>

//Sim3Vertex,(x,y,z,qw,qx,qy,qz),7dvector,(x,y,z,qx,qy,qz)(notethatweleaveout

thewpartofthequaternion.

VertexSim3Expmap:publicBaseVertex<7,Sim3>

2.6添加边

第6步

6.1初始化边

g2o::EdgeSE3ProjectXYZOnlyPose*e=newg2o::EdgeSE3ProjectXYZOnlyPose();

6.2设置边的顶点

e->setVertex(0,

dynamics_cast(optimizer.vertex(0)));

//单元边

e->setVertex(1,pose);

//如果是双元边,则0对应三维点顶点,

//1对应位姿顶点

6.3设置id

e->setId(i);

6.4设置测量值

e->setMeasurement(obs);

//obs是测量值

6.5设置协方差矩阵

e->setInformation(

Eigen::Matrix2d::Identity()*inSigma2);

6.6设置鲁邦函数

g2o::RobustKernelHuber*rk=

newg2o::RobustKernelHuber;

e->setRobustKernel(rk);

e->fx=pFrame->fx;

e->fy=pFrame->fy;

e->cx=pFrame->cx;

e->cy=pFrame->cy;

6.8添加边

optimizer.addEdge(e);

自定义-单元边

classEdgeSE3ProjectXYZOnlyPose:publicg2o::

BaseUnaryEdge<2,vector2d,VertexSE3Expmap>

/单元边<测量值维度,测量值类型,边对应的定点>

EIGEN_MAKE_ALIGNED_OPERATOR_NEW

EdgeSE3ProjectXYZOnlyPose(){}

virtualboolread(istream&in){}

virtualboolwrite(ostream&out)const{}

virtualvoidcomputeError()override

#计算测量值和顶点计算值的误差

constVertexSE3Expmap*v1=static_cast

(_vertices[0]);

vector2dobs(_measurement);

_error=obs–cam_project(v1->estimate().map(Xw));

//利用定点v1的变换矩阵使用map将世界坐标转换到

//相机坐标,然后cam_project投影到图像坐标

virtualvoidlinearizeOplus()override

//当前顶点值下该误差对优化变量的偏导数,

//雅可比矩阵

private:

Vector3dXw;doublefx,fy,cx,cy;

Vector2CameraParameters::cam_project(constVector3&trans_xyz)const{

Vector2proj=project2d(trans_xyz);

Vector2res;

res[0]=proj[0]*fx+cx;

res[1]=proj[1]*fy+cy;

returnres;

Vector3map(constVector3&xyz)const{

returns*(r*xyz)+t;

自定义-双元边

classEdgeProjectXYZ2UV:publicBaseBinaryEdge

<2,Vector2D,

VertexSBAPointXYZ,VertexSE3Expmap>

/双元边<测量值维度,测量值类型,边对应的定点>

EIGEN_MAKE_ALIGNED_OPERATOR_NEW;

//1.默认初始化

EdgeProjectXYZ2UV();

//2.计算误差

voidcomputeError()

//李群相机位姿v1

constVertexSE3Expmap*v1=static_cast(_vertices[1]);

//顶点v2

constVertexSBAPointXYZ*v2=static_cast(_vertices[0]);

//相机参数

constCameraParameters*cam

=static_cast(parameter(0));

//误差计算,测量值减去估计值,也就是重投影误差obs-cam

//估计值计算方法是T*p,得到相机坐标系下坐标,然后在利用camera2pixel()函数得到像素坐标。

Vector2Dobs(_measurement);

_error=obs-cam->cam_map

(v1->estimate().map(v2->estimate()));

//3.线性增量函数,也就是雅克比矩阵J的计算方法

virtualvoidlinearizeOplus();

//4.相机参数

CameraParameters*_cam;

boolread(std::istream&is);

boolwrite(std::ostream&os)const;

};

G2O重要成员变量和函数

_measurement:存储观测值

_error:存储computeError()函数计算的误差

_vertices[]:存储顶点信息,比如二元边的话,_vertices[]的大小为2,存储顺序和调用setVertex(int,vertex)是设定的int有关(0或1)

THE END
1.GNNpython源码下载平台GNN算法的原理主要包括以下几个方面: 1. 自注意力机制(Self-Attention Mechanism):GNN使用自注意力机制来捕获图中不同节点之间的依赖关系。在自注意力机制中,每个节点都会根据其邻居节点的信息计算自己的表示,然后将这些信息与自身信息相结合,得到最终的节点表示。 2. 图卷积(Graph Convolution):GNN使用图卷积来处理https://python.code.coder100.com/index/index/content/id/61023
2.1DCNN模型参数解析mob64ca14092155的技术博客(4)基于模型:LR模型,user和item等维度特征输入给模型训练,label是show:clk,根据预估的pctr进行推荐。DNN模型:见下面。 2)基于内容的过滤:抽取item的有意义描述特征,推荐user偏好item相似度高的item,个人觉得像基于item的过滤。 3)组合推荐:根据具体问题,组合其它几种技术进行推荐。 https://blog.51cto.com/u_16213653/12888433
3.GN算法本算法的具体内容请参考Finding and evaluating community structure in networks(Newman and Girvan)。 重要概念 边介数(betweenness):网络中任意两个节点通过此边的最短路径的数目。 GN算法的思想: 在一个网络之中,通过社区内部的边的最短路径相对较少,而通过社区之间的边的最短路径的数目则相对较多。下图中展示了https://blog.csdn.net/qq_31510519/article/details/85325275
4.社区发现算法GN社区发现算法-GN 社区发现 先来说说什么是社区发现吧,学术上的说法是:一个社区由一组连接紧密的结点组成,同时这些结点与社区外部的结点连接稀疏,如下图所示。那么,社区发现就是在复杂网络中发现这些连接紧密的社区结构。其实,我个人觉得,社区发现就是网络中的结点聚类。https://www.jianshu.com/p/44c4206979a6
5.gn算法pythonjavagn算法.gn域名腾讯云开发者社区2、A*算法是启发式算法,采用最佳优先搜索策略(Best-first),基于评估函数对每个搜索位置的评估结果,猜测最佳优先搜索位置。https://cloud.tencent.cn/developer/information/gn%E7%AE%97%E6%B3%95python
6.基于ICGN的立体视觉三维位移测量方法本文为了提高立体视觉测量方法的精度和适应性,针对该技术中的亚像素匹配、空间点坐标三维重构、圆形靶标的识别定位和结构坐标系建立进行研究,主要研究内容包括以下三个部分:(1)提出单点匹配的IC-GN改进算法,与将整像素坐标作为IC-GN算法初值的传统方法相比,本文采用二次曲面拟合得到的亚像素坐标作为IC-GN算法的初始值https://wap.cnki.net/lunwen-1019648231.html
7.Gephi案例后续我们会出一篇GN算法测试的Jupyter Notebook。 2.2 SAO语义分析方法 下面对语义分析方法的描述来自原范例: SAO(Subject-Action-Object)语义分析方法因在文本信息中能够经由准确的语义结构提取而受到众多学者的关注,并被广泛应用于语义链、技术树、形态矩阵及技术路线图的构建[10]。如 Miao 等[11]通过从专利信息中http://www.gooseeker.com/doc/article-739-1.html
8.InstanceNormalization作者在论文中指出GN要比LN和IN的效果要好。 GN算法 和之前所有归一化算法相同,GN也是根据该层的输入数据计算均值和方差,然后使用这两个值更新输入数据: \mu{i}=\frac{1}{m} \sum{k \in \mathcal{S} i} x{k} \quad \sigma{i}=\sqrt{\frac{1}{m} \sum{k \in \mathcal{S}{i}}\left(x{https://www.flyai.com/article/943
9.基于BFGS修正的高斯牛顿光束法平差解算方法当高斯牛顿法的信息矩阵失去正定性后, 使用 BFGS 算法对法方程进行补充修正, 可从根本上消除高斯牛顿方法对初值敏感的数学缺陷。在数据集上的实验结果表明, BFGS-GN 算法对不同类型的初值具有鲁棒性, 在初值较好的情况下, 所提方法与高斯牛顿法具有相同的精度和迭代效率; 在初值较差的情况下, 高斯牛顿方法因发散https://xbna.pku.edu.cn/fileup/0479-8023/HTML/2020-6-1013.html
10.gn.exe位于srcbuildtools里面TK_378GN交大版 TK378G专用 上传者:musiccd2008时间:2020-12-23 引导修复NTBootAutofix_gn 强大的多系统引导修复软件,自动检测计算机中包含的系统,生成开机引导,修复引导问题,单系统引导同样可以修复。 上传者:ls_man时间:2011-08-14 GN.rar_GN 分裂算法_GN分裂算法_GN算法_GN算法MATLAB_MATLAB的GN算法 https://www.iteye.com/resource/bigben0123-12497581
11.社交网络中的社区发现算法本博客主要是对Finding and evaluating communitystructure in networks ——Girvan,Newman 该论文的解读。 介绍 相关定义 GN算法 连接社区之间的边介数大,社区内部的边介数小。通过删边发现社区 举例 第一步:从节点s开始,执行一个广度优先搜索,确定一个节点的最短路径数量 红色数字:边介数 https://www.pianshen.com/article/18321255864/
12.数字体图像相关方法的亚体素算法性能研究期刊数字体图像相关方法亚体素位移测量测量精度IC-GN算法FA-NR算法拟合算法计算效率稳定性 分类号: TN911.73-34(通信)TP391.41(计算技术、计算机技术)TH822(机械、仪表工业) 资助基金: 国家自然科学基金(11762009) 在线出版日期: 2022-04-18(万方平台首次上网日期,不代表论文的发表时间) https://d.wanfangdata.com.cn/periodical/xddzjs202207005
13.算法,须依法!——中国青年网给“算法”立规矩!3月1日起,《互联网信息服务算法推荐管理规定》正式实施。保护个人权益,维护国家安全。算法不能变“算计”!《新闻1+1》连线中国信息安全研究院副院长左晓栋,共同关注:算法,须依法! 规范算法,聚焦五类应用! 如何理解这次实施的规定,要从“生成合成类、个性化推送类、排序精选类、检索过滤类、调度决https://t.m.youth.cn/transfer/index/url/news.youth.cn/gn/202203/t20220302_13492341.htm
14.基于非加权图的大型社会网络检测算法研究AET本文在核心图社区检测时采用GN算法(Girvan-Newman)。 本文采用模块性Q函数[13]来评价划分出的模块性,采用NMI[13]来评价划分结果的相似性,两个评价指标的数值越接近1,说明算法划分的效果和质量越高。实验采用的4个较大社会网络数据集的具体参数如表2所示。 4.1 结果分析 采用生成树算法、CBCD算法和本文提出算法在http://www.chinaaet.com/article/3000077934
15.小米11Ultra影像霸榜DxOMark背后:首发三星GN2,大底+8P小米传感器专家小林谈到:“小米 11 Ultra 在感光元件尺寸上有巨大突破,本次与三星共同研发的 GN2,是超级硬件与自研算法的综合呈现,为影像体验再次升级打下坚实基础。 大底+ 8P 强强联手 小米相机部光学专家尹志东介绍了光学镜头的部分,并且提到这次的小米 11 Pro 和小米 11 Ultra 用到了高端的 8P 主摄镜头与大https://www.ithome.com/0/544/920.htm
16.社会类范文12篇(全文)我们选择GN算法为对比算法,分别以标签网络节点数30,50,80,100进行聚类,结果如图4所示。由图可以看出,STNC算法具有较好的聚类效果。 6 结束语 本文提出了一种聚类算法来改善社会化标注系统的服务。通过对检索结果的聚类,提供语义关联的标签类簇,从而有助于提升用户浏览和检索的质量和效率。下一步的研究工作将主要集中https://www.99xueshu.com/w/ikey9azrs1bi.html
17.数学中的图论与复杂网络.pptx随机网络模型Erdos-Renyi模型随机图中节点的连边概率相等易于理解和实现复杂网络的社区发现计算节点在同一社区内连边的概率与随机网络的比值模块度0103迭代将节点划分至不同社区以增加模块度Louvain算法02将网络不断分割直到最优社区结构达到最大模块度GN算法最优控制问题寻找控制策略使得疫情传播受到限制考虑最小化传播成本或https://m.renrendoc.com/paper/318595589.html
18.LabelPropagation腾讯云开发者社区在实际求解的过程中是不能直接求解的,所以通常是采用近似解法,根据求解方法不同可以分为以下几种方法:①凝聚方法,通过不断合并不同社区,实现对整个网络的社区划分,典型的方法有Newman快速算法,CNM算法和MSG-MV算法。②分裂方法,通过不断的删除网络的边来实现对整个网络的社区划分,典型的方法有GN算法。③直接近似求解https://cloud.tencent.com/developer/article/1352697