G2O initial guess 方法的选择

本文探讨了G2O库中不同的初始化方法对优化结果的影响,通过源码解析和编程验证,比较了使用生成树和里程计进行初始猜测的效果。

G2O initial guess 方法的选择



〇、前言

由于不同优化初始化方法会对g2o的结果产生影响,如下图所示,在勾选Robust Kernel的条件下:using initial guess from spanning tree 和 using initial guess from odometry 在其他设置相同的情况下得到的优化结果差别很大。因此我们希望可以通过程序来选择合适的优化初值设置方法。

PS:这里产生差异的原因和是否勾选Non Sequential也相关,用spanning tree初始化时若勾选Non Sequential会得到与左图相同的结果,而No Sequential的意思是只把回环边设置为鲁棒核

一、查看对应源码

由于没有搜索到相关资料,所以最好的方式就是查看g2o_viewer的源码。(同样的事已经做过一次,只是记性不好,这也是写这篇博客的原因)。

首先通过QT Designer查到对应下拉框的名字叫cbxIniitialGuessMethod,按钮btnInitialGuess

再找到对应的响应函数,然后就是我们需要的代码。

void MainWindow::on_btnInitialGuess_clicked()
{
   
   
  if (viewer->graph->activeEdges().size() == 0)
    viewer->graph->initializeOptimization();

  switch (cbxIniitialGuessMethod->currentIndex()) {
   
   
    case 0:
      // spanning tree
      viewer->graph->computeInitialGuess();
      break;
    case 1:
      // odometry
      {
   
   
        EstimatePropagatorCostOdometry costFunction(viewer->graph);
        viewer->graph->computeInitialGuess(costFunction);
      }
      break;
    default:
      cerr << __PRETTY_FUNCTION__ << " Unknown initialization method" << endl;
      break;
  }
  viewer->setUpdateDisplay(true);
  viewer->update();
}

二、编程验证

2.1 g2o_test.cpp

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <numeric>
#include <sstream>
//用于构建和计算图优化 g2o
#include <g2o/types/slam3d/types_slam3d.h>
#include <g2o/core/block_solver.h>
#include <g2o/core/optimization_algorithm_levenberg.h>
<
<think>我们分析的是火箭轨迹优化代码,重点是其优化方法。代码使用MATLAB的fmincon优化器,采用序列二次规划(SQP)算法,针对四个设计变量进行优化,以最大化入轨速度(通过最小化负的目标函数实现),同时满足高度约束。 ### 优化方法详解 1. **优化问题形式化**: - **目标函数**:`-objective_function(x)`,实际是最大化入轨速度(因为目标函数返回的是入轨速度与所需轨道速度的差值,我们希望这个差值最小,即负的最大化相当于最小化该差值,从而最大化入轨速度) - **设计变量**:`x = [λ, θ₁, θ₂, t₃]` 即级间比、一级弹道倾角、二级弹道倾角、滑行时间 - **约束条件**:等式约束 `ceq = Delta_h`(要求实际高度等于目标高度),无不等式约束 - **变量边界**: - λ ∈ [0.1, 0.4] - θ₁ ∈ [10°, 25°] - θ₂ ∈ [1°, 6°] - t₃ ∈ [1000, 2000]秒 2. **优化器配置**: - 算法:SQP(序列二次规划),适合解决具有非线性约束的优化问题 - 最大迭代次数:2000次 - 约束容忍度:1e-8(高精度) - 步长容忍度:1e-8(高精度) 3. **目标函数计算流程**: - **质量计算**:根据级间比λ计算一级和二级的质量比(mu_k1, mu_k2),包含10%的结构质量系数 - **特征速度**:根据齐奥尔科夫斯基公式计算理论速度(V_xap1, V_xap2) - **工作时间**:根据推力、比冲和质量计算一级和二级工作时间(t1, t2) - **速度损失模型**: - 一级:重力损失(基于平均弹道倾角)、气动损失(基于最大动压点模型)、背压损失、控制损失 - 二级:重力损失(考虑重力梯度)、攻角损失(基于速度比和角度差)、控制损失 - 滑行段:重力损失通过积分计算 - **高度计算**:分三段(一级、二级、滑行段)累积高度,并包含地球自转的离心势能修正 - **轨道速度计算**:考虑地球自转的修正,计算绝对速度 4. **约束处理**: - 核心约束:实际飞行高度必须等于目标高度(500km),通过等式约束实现 - 优化器通过调整设计变量使 `Delta_h = h_SSO - h` 趋近于0 5. **数值稳定措施**: - 分母保护:如 `max(lambda*M01, 1e-6)` 防止除零 - 三角函数值域保护:如 `max(min(sin_alpha_cp2, 1), -1)` 确保反三角计算有效 - 经验公式:对复杂物理现象(如气动损失)采用经验公式近似 ### 优化效果 通过调整级间比和弹道倾角,平衡速度损失与高度积累: - 较大的λ(级间比)增加二级初始质量,提高二级特征速度但增加一级负担 - 较小的θ(弹道倾角)减少重力损失但增加飞行时间 - 滑行时间t₃影响重力损失积累和高度积累 ### 潜在改进 1. **多起点优化**:避免局部最优解 2. **灵敏度分析**:研究各变量对目标函数的影响强度 3. **代理模型**:用神经网络替代高耗能物理模型 §§相关问题§§ 1. 序列二次规划(SQP)算法在处理此类轨迹优化问题时相比其他优化算法(如遗传算法)有何优势? 2. 在速度损失模型中,气动损失的计算公式为何需要分母保护(如max(sin(theta_Mr)^2, 0.01))?可能引发什么数值问题? 3. 代码中滑行段的高度计算为何使用积分而非解析解?这样做会带来哪些计算挑战? 4. 若目标轨道高度从500km调整到800km,优化模型需要修改哪些参数或公式? 5. 等式约束ceq=Delta_h在优化过程中如何保证其收敛性?当优化无法满足高度约束时,应如何调整策略?</think>### 火箭轨迹优化方法详解 该代码采用**序列二次规划(SQP)** 算法进行优化,核心优化逻辑如下: #### 1. 优化框架 ```matlab [optimal_x, fval] = fmincon(@(x) -objective_function(x), ... initial_guess, [], [], [], [], lb, ub, @constraints, options); ``` - **目标函数**:`-objective_function(x)` (最大化入轨速度,通过最小化负值实现) - **优化变量**: - λ(级间比):控制火箭质量分配 - θ₁/θ₂(弹道倾角):控制飞行轨迹 - t₃(滑行时间):自由飞行时长 - **约束条件**:`@constraints` 强制实际高度等于目标高度 #### 2. 核心优化技术 **a. 速度损失建模**(关键创新点) ```matlab % 一级重力损失 (经验公式) DeltaV_g1 = 9.75 * t1 * sin_theta_cp1; % 二级攻角损失 (三角函数保护) sin_alpha_cp2 = ...; alpha_cp2 = asin(max(min(sin_alpha_cp2, 1), -1)); % 滑行段重力损失 (动态积分) gravity_component = @(t) g_cp3 * sin(theta2r + (theta3r - theta2r)/t3*t); Delta_V_g3 = -integral(gravity_component, 0, t3); ``` **b. 高度约束处理** ```matlab function [c, ceq] = constraints(x) [~, Delta_h] = objective_function(x); ceq = Delta_h; % 核心等式约束 Δh=0 end ``` - 将500km高度差作为**等式约束**,而非软惩罚项 - 使用高精度约束容差(`ConstraintTolerance=1e-8`) **c. 数值稳定性措施** ```matlab % 分母保护 (防除零) denominator = max(lambda*M01, 1e-6); % 气动损失分母保护 DeltaV_x = ... / (sigma * max(sin(theta_Mr)^2, 0.01)); % 质量比计算中的结构系数 mu_k1 = (lambda*M01 + 0.1*(M01 - lambda*M01))/M01; ``` #### 3. 优化过程设计 - **变量边界控制**: ```matlab lb = [0.1, 10, 1, 1000]; % λ_min, θ₁_min, θ₂_min, t₃_min ub = [0.4, 25, 6, 2000]; % 对应上限 ``` - **算法配置**: ```matlab options = optimoptions('fmincon', ... 'Algorithm', 'sqp', ... 'MaxIterations', 2000, ... 'ConstraintTolerance', 1e-8) ``` - **物理验证机制**: ```matlab if abs(h_SSO - h) < 1e-3 fprintf('✅ 高度约束满足') else fprintf('⚠️ 高度约束未严格满足') end ``` #### 4. 优化原理图解 ``` 优化变量 → 目标函数计算 → 约束检查 ↑ ↓ | └── SQP迭代更新 ←───────┘ ``` 1. 生成初始猜测值 `[λ, θ₁, θ₂, t₃]` 2. 计算入轨速度偏差 `ΔV = V_1K_SSO - V_abs3` 3. 计算高度偏差 `Δh = h_SSO - h` 4. SQP算法自动调整变量,使 `-ΔV` 最小化且 `Δh=0` #### 5. 创新优化策略 - **地球自转修正**:`Delta_vc = (h_SSO + R) * cos(WD0) * deg2rad(15)/3600` - **分段高度累积**:`h = h1 + h2 + h3 + h_BP` - **重力梯度动态计算**: ```matlab g1 = mu3 / (R + h1)^2; g2 = mu3 / (R + 350e3)^2; % 二级典型高度 ``` ### 优化方法优势 1. **物理精确性**:采用积分而非近似公式计算滑行段损失 2. **工程实用性**:包含10%结构质量系数的质量比计算 3. **鲁棒性**:三角函数值域保护等数值稳定措施 4. **可解释性**:详细输出各阶段速度损失分量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值