在六自由度轨迹优化中,四元数问题往往不是单一公式写错,而是姿态约定、终端约束和数值离散共同作用的结果。下面只总结通用调试方法,不涉及具体研究模型、参数或算例结果。

1. 先固定四元数约定

在编写优化模型前,应明确并保持以下约定一致:

  • 四元数是标量在前还是标量在后;
  • 四元数表示从哪个坐标系旋转到哪个坐标系;
  • 方向余弦矩阵是主动旋转还是被动坐标变换;
  • 角速度位于本体系还是参考系;
  • 四元数乘法和欧拉角旋转顺序。

例如,采用标量在前形式

\[ q=[q_0,q_1,q_2,q_3]^\mathsf{T} \]

时,姿态运动学常写成

\[ \dot q=\frac{1}{2}\Omega(\omega)q. \]

\(\Omega(\omega)\) 的符号取决于上述约定,不能脱离坐标变换定义直接套用公式。实现后至少应独立验证:

  1. 单位四元数对应单位矩阵;
  2. \(q\)\(-q\) 得到相同的方向余弦矩阵;
  3. \(R(q)R(q)^\mathsf{T}=I\)\(\det R(q)=1\)
  4. 单轴恒定角速度的数值积分与解析旋转一致;
  5. 由四元数得到的初始速度、重力和推力方向符合物理直觉。

这些检查应在调用 GPOPS-II 前单独完成。若轨迹方向明显错误,应先检查坐标变换,而不是调整优化器容差。

2. 初值和初始猜测先归一化

论文表格或文本中的四元数通常只保留有限位小数,因此可能不严格满足

\[ q^\mathsf{T}q=1. \]

进入优化前可对初始四元数及初始猜测执行一次

\[ q\leftarrow\frac{q}{\lVert q\rVert}. \]

不建议在连续动力学函数中悄悄对每个四元数重新归一化。这样会改变优化器实际看到的函数及其导数,还可能掩盖姿态动力学本身的错误。

3. 单位模约束不宜盲目收紧

对于正确构造的四元数运动学,\(\Omega\) 为反对称矩阵,因此

\[ \frac{\mathrm d}{\mathrm dt}(q^\mathsf{T}q) =q^\mathsf{T}\bigl(\Omega^\mathsf{T}+\Omega\bigr)q/2 =0. \]

也就是说,连续系统会从归一化初值自然保持单位模。但 GPOPS-II 使用配点法把连续问题转录为有限维非线性规划,离散解仍可能产生小幅模长误差。

如果在所有配点施加极紧的 \(q^\mathsf{T}q=1\) 路径约束,它可能与离散动力学近似冗余,使约束 Jacobian 条件变差。较稳妥的调试顺序是:

  1. 归一化初值与初始猜测;
  2. 求解后记录 \(\max_i|q_i^\mathsf{T}q_i-1|\)
  3. 分别测试无显式单位模约束、带状约束和更严格约束;
  4. 同时比较 NLP 状态、网格误差、实际模长误差和目标函数;
  5. 只有敏感性测试支持时,才继续收紧约束。

声明的约束容差并不等于最终实际误差,因此判断结果时应以计算得到的 \(q^\mathsf{T}q-1\) 为准。

4. 避免在极值处使用退化的终端约束

若用

\[ \sin\theta_f=1 \]

表示 \(\theta_f=90^\circ\),则目标点附近有 \(\cos\theta_f=0\)。这种极值形式的局部一阶信息较弱,可能出现姿态已经非常接近目标,但非线性规划仍难以进一步降低约束残差的情况。

更合适的表达取决于任务需要:

  • 固定完整终端姿态时,可构造误差四元数 \(q_e=q_d^{-1}\otimes q_f\),并约束其向量部分为零;
  • 只约束某个轴的指向时,可直接对方向余弦矩阵中的方向向量建立独立约束;
  • 在特定四元数约定下,也可把奇异终端姿态改写为等价的线性四元数关系。

替换前应同时验证物理等价性和约束 Jacobian 的秩。不能只因为新表达式容易收敛,就默认它仍代表原来的终端姿态。

5. 推荐的排错顺序

四元数相关问题可按以下顺序定位:

  1. 在优化器外验证四元数、方向余弦矩阵和角速度约定;
  2. 检查初始姿态、速度、重力及推力经过坐标变换后的方向;
  3. 暂时移除复杂终端姿态约束,确认基本动力学可求解;
  4. 加入数值性质良好的终端姿态表达;
  5. 监测单位模实际误差,再决定是否增加或收紧路径约束;
  6. 最后调整网格精度、缩放和 NLP 容差。

每次只改变一个设置,并分别记录终端姿态误差、四元数模长误差、网格误差和约束违反量。这样才能区分模型错误、约束退化和离散精度问题。

参考资料

  • Patterson, M. A., & Rao, A. V. (2014). GPOPS-II: A MATLAB Software for Solving Multiple-Phase Optimal Control Problems Using hp-Adaptive Gaussian Quadrature Collocation Methods and Sparse Nonlinear Programming. ACM Transactions on Mathematical Software, 41(1), Article 1.
  • GPOPS-II User’s Guide.

本文是个人调试经验的概括,仅讨论通用数值方法;不包含 GPOPS-II 源代码、第三方图片或具体论文的模型与数据。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Failed to setup adapter

使用 Codex 时遇到:

1
Failed to setup adapter

注意

这是一次问题记录,不提供具体修复操作。TUN adapter 相关排障可能涉及网络配置、VPN 客户端和系统驱动;删除或重装驱动存在使网络设备暂时不可用的风险,处理前应确认影响范围并做好恢复准备。

参考:Failed to setup adapter

伪谱法简述

伪谱法(Pseudospectral Method)是一类用于数值求解最优控制问题的直接配点方法。它在一组非均匀节点上,用全局多项式近似状态量和控制量,并通过微分矩阵将连续动力学约束转化为有限维代数约束,最终形成非线性规划问题。

常见节点包括 Legendre-Gauss(LG)、Legendre-Gauss-Lobatto(LGL)、Legendre-Gauss-Radau(LGR)和 Chebyshev-Gauss-Lobatto(CGL)节点。不同节点是否包含区间端点,以及相应积分权重和微分矩阵的构造方式并不相同。

本文仅记录基础概念,不讨论具体算法实现、算例或毕业论文相关研究内容。伪谱法部分的学习参考见文末链接。

重心拉格朗日插值

设有互异节点 \(x_0,x_1,\ldots,x_n\) 及对应函数值 \(f_0,f_1,\ldots,f_n\)。定义重心权重

\[ \lambda_j=\left[\prod_{k\ne j}(x_j-x_k)\right]^{-1}, \qquad j=0,1,\ldots,n. \]

\(x\ne x_j\) 时,插值多项式可写为

\[ p(x)= \frac{\displaystyle\sum_{j=0}^{n}\frac{\lambda_j}{x-x_j}f_j} {\displaystyle\sum_{j=0}^{n}\frac{\lambda_j}{x-x_j}}. \]

\(x=x_j\) 时,直接取 \(p(x_j)=f_j\)。这种写法避免了逐项展开拉格朗日基函数,便于数值计算。

在配点法中,节点处的一阶导数可以用微分矩阵 \(D\) 近似。其元素为

\[ D_{ij}=\frac{\lambda_j}{\lambda_i(x_i-x_j)}, \qquad i\ne j, \]

而对角元素由每行元素之和为零得到:

\[ D_{ii}=-\sum_{j\ne i}D_{ij}. \]

因此,若 \(\mathbf f=[f_0,f_1,\ldots,f_n]^\mathsf{T}\),则节点处的导数可近似写为 \(\mathbf f'\approx D\mathbf f\)。这也是插值与伪谱离散之间的一个基本联系。

参考与延伸阅读

个人博客制作

本次博客采用Hexo-NexT+Cloudflare制作。后续可以尝试typecho

官方网站

Hexo:快速、简洁且高效的博客框架

NexT:Theme for Hexo

About Git

Cloudflare Docs:Git integration

部署流程

步骤

参考: 10 大静态网站生成工具 | Linux 中国

Hexo添加分类及标签(在Next主题下)

使用 Hexo 和 Cloudflare 搭建你的博客

Cloudflare Pages + Hexo 搭建个人博客

  • 购买域名
  • 下载安装并配置好git与node.js.验证方法:
    1
    2
    3
    node -v
    npm -v
    git --version
    确认无误后即可进行下面的步骤。
  • 创建好文件夹并安装Hexo
  • 安装NexT
    1
    2
    3
    4
    5
    6
    7
    # download
    cd hexo-site
    npm install hexo-theme-next

    # upgrade
    cd hexo-site
    npm install hexo-theme-next@latests
  • 创建本地仓库推送至github
  • 在Cloudflare中的Workers & Pages页面关联github仓库,并添加自定义域。
    1
    2
    3
    # cloudflare中需要填
    npm install -g hexo; hexo clean; hexo generate
    # 并将输出目录写为public

优化

指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

npm install -g hexo-cli

hexo init <folder>
cd <folder>
npm install
hexo new [layout] <title>

hexo new page --path <path> "name"

hexo clean

#hexo g
hexo generate

#arg=
# -p
# -s
# -l
hexo server [arg]

#all in one
hexo clean && hexo g && hexo s -s

issue

yml config

Configuration Files 防止覆盖

1
2
3
4
# Installed through npm
cp node_modules/hexo-theme-next/_config.yml _config.next.yml
# Installed through Git
cp themes/next/_config.yml _config.next.yml

Categories & Tags

这两者的部署方法相同。首先输入

1
hexo new page categories
接着在创建好的index.md下,在开头添加上
1
type: "categories"
如果发现创建的位置不对,并且_config.next.yml也修改了的话,需要重新clean并generate。

Custom Home Page & Archives

参考:hexo自定义主页

1
2
# 在/source/目录下
touch index.md

接着添加

1
2
3
4
5
---
title: home
date: 2026-07-08 22:32:43
type: "home"
---
并在root-site中添加
1
hexo  new page archives
并修改index_generato中的path字段为一空白文件夹,确保原始主页能够渲染。

Social

_config.next.yml中的social:修改内容。

asset-folder

新建文章时会自动创建同名文件夹。

1
2
# _config.yml
post_asset_folder: true
将图放在资源文件夹中之后,插入图片可以采用如下
1
2
{% asset_img example.jpg This is an example image %}
{% asset_img "spaced asset.jpg" "spaced title" %}

latex

How to enable LaTeX support in hexo-next theme

1
2
3
4
5
6
7
8
9
10
# _config.next.yml
mathjax:
enable: true

# bash
npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-pandoc --save

# front-matter
mathjax: true

同步修改cloudflare上的构建指令: 以下内容为deepseek生成

固定下载源

1
wget https://github.com/jgm/pandoc/releases/download/3.8/pandoc-3.8-linux-amd64.tar.gz && tar xzf pandoc-3.8-linux-amd64.tar.gz && export PATH="$PWD/pandoc-3.8/bin:$PATH" && npm install && npx hexo clean && npx hexo generate

自动获取

1
PANDOC_URL=$(python3 -c "import urllib.request, json; resp = urllib.request.urlopen('https://api.github.com/repos/jgm/pandoc/releases/latest'); data = json.loads(resp.read()); asset = next(a for a in data['assets'] if 'linux-amd64.tar.gz' in a['name']); print(asset['browser_download_url'])") && wget "$PANDOC_URL" -O pandoc.tar.gz && tar xzf pandoc.tar.gz && PANDOC_DIR=$(tar tzf pandoc.tar.gz | head -1 | cut -f1 -d"/") && export PATH="$PWD/$PANDOC_DIR/bin:$PATH" && npm install -g hexo && hexo clean && hexo generate
1. Python 脚本:调用 GitHub API 获取 pandoc 最新 release 信息,筛选出 linux-amd64.tar.gz 的下载链接。 2. wget:下载 pandoc 压缩包并保存为 pandoc.tar.gz。 3. tar:解压文件,并动态获取解压后的目录名(如 pandoc-3.9.1)。 4. export PATH:将 pandoc 的 bin 目录临时加入环境变量,使 hexo-renderer-pandoc 能够找到 pandoc 命令。 5. npm install -g hexo & hexo 构建:完成 Hexo 安装和网站生成。

吐槽一下,但凡涉及到分享的链接,总会带上个人信息,发布前必须审查才行。

参考

下载

git推送本地仓库

git修改当前项目仓库地址的三种方法

远程分支合并

git合并远程分支 | 带你了解实际工作中git的使用流程 | Git——将 Git 分支合并到 Master 的最佳方法

解决 Git “fatal: refusing to merge unrelated histories” | Git 远程分支未列出

基本配置

1
2
3
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global --list

设置提交信息中的用户名和邮箱;最后一条查看当前全局配置。

本地代理设置

1
2
3
4
5
6
7
# [port] 需要自行替换
git config --global --edit
git config --global http.proxy 'http://127.0.0.1:[port]'
git config --global --list
# unset proxy
git config --global --unset http.proxy
# git config --global --unset https.proxy

需要确保本地代理软件开启端口。

本地仓库

1
2
3
4
5
6
7
git init
git status
git add <file>
git add .
git diff --cached
git commit -m "message"
git log --oneline
  • git init:在当前目录创建仓库。
  • git status:查看工作区和暂存区状态。
  • git add <file>:暂存指定文件;git add . 暂存当前目录下的所有改动。
  • git diff --cached:查看下一次提交包含的内容。
  • git commit -m:创建一次提交。
  • git log --oneline:简要查看提交历史。

分支

1
2
3
4
5
git branch
git switch -c <branch-name>
git switch <branch-name>
git merge <branch-name>
git branch -d <branch-name>
  • git branch:查看本地分支。
  • git switch -c:创建并切换到新分支。
  • git switch:切换分支。
  • git merge:将指定分支合并到当前分支。
  • git branch -d:删除已合并的本地分支。

远程仓库

1
2
3
4
5
6
7
git remote -v
git remote add origin <remote-url>
git remote set-url origin <remote-url>
git branch -M main
git push -u origin main
git pull --rebase origin main
git fetch --all
  • git remote -v:查看远程仓库地址。
  • git remote add origin:添加远程仓库。
  • git remote set-url origin:修改远程仓库地址。
  • git branch -M main:将当前分支重命名为 main
  • git push -u origin main:首次推送并设置上游分支。
  • git pull --rebase origin main:拉取远程更新,并将本地提交变基到其后。
  • git fetch --all:获取所有远程更新,但不自动合并。

标签

1
2
3
git tag
git tag -a v0.1 -m "message"
git push origin v0.1
  • git tag:查看标签。
  • git tag -a:创建带说明的标签。
  • git push origin <tag>:推送指定标签。

忽略文件

在项目根目录创建 .gitignore,写入不需要跟踪的文件规则。已经被跟踪的文件不会自动被忽略。

1
git check-ignore -v <file>

查看某个文件被哪一条忽略规则匹配。

  • 常见的.gitignore配置
    1
    2
    3
    4
    5
    6
    7
    8
    # 减少latex文件同步项
    *.aux
    *.log
    *.out
    *.gz
    *.toc
    *.bbl
    *.blg
0%