当前位置: 首页 > web >正文

更新雅可比矩阵的非线性部分笔记

// 更新雅可比矩阵的非线性部分

df(1,6) = -vel_trans * sin(yaw);

df(2,6) = vel_trans * cos(yaw);

// ∂x/∂θ = -v*sin(θ) df(2,6) = vel_trans * cos(yaw);

// ∂y/∂θ = v*cos(θ) 为什么是这两行 而不是别的行呢

我们重点分析为什么在雅可比矩阵中只更新了(1,6)和(2,6)这两个位置。这需要从机器人的运动模型和状态向量的定义入手。

状态向量(state)的定义:
1: x(机器人在世界坐标系中的x坐标)
2: y(机器人在世界坐标系中的y坐标)
3: z
4: roll
5: pitch
6: yaw(机器人在世界坐标系中的偏航角)

控制输入(vel)的定义:
1: 线速度v(沿机器人前进方向,即x方向)
2: 角速度ω

运动模型(状态转移函数):
x_{k+1} = x_k + v * cos(yaw_k) * Δt
y_{k+1} = y_k + v * sin(yaw_k) * Δt
yaw_{k+1} = yaw_k + ω * Δt

注意:在代码中,传递给运动模型的控制输入(vel)已经包含了时间间隔?实际上,在代码中,我们注意到vel_trans是直接用的vel(1),而并没有另外乘以Δt。这意味着在调用此运动模型之前,速度应该已经乘以了时间(即实际上传递的是位移和角度变化量)。因此,我们在代码中看到:
state(1) += cos(state(6)) * vel(1); // 相当于Δx = v * cos(θ) * Δt
state(2) += sin(state(6)) * vel(1); // 相当于Δy = v * sin(θ) * Δt
state(6) += vel(2); // 相当于Δθ = ω * Δt

现在,我们需要计算状态转移函数关于状态向量的雅可比矩阵(即偏导数矩阵)F,用于扩展卡尔曼滤波的协方差传播。

雅可比矩阵F的元素定义为:
F(i,j) = ∂f_i / ∂x_j (f_i是状态转移函数第i个分量,x_j是状态向量的第j个分量)

由于运动模型只改变了x, y和yaw(状态向量的第1、2、6个分量),其他分量保持不变(即f_i = x_i,当i=3,4,5时),所以雅可比矩阵中对应于z,roll,pitch的行应该是单位矩阵(对角线上为1,其余为0)。

而我们需要计算的是状态转移函数相对于当前状态(k时刻)的偏导数。具体来看:

  1. 对于x_{k+1} = x_k + v * cos(yaw_k) * Δt
    对x_k的偏导:∂(x_{k+1})/∂x_k = 1
    对y_k的偏导:0
    对yaw_k的偏导:∂(x_{k+1})/∂yaw_k = -v * sin(yaw_k) * Δt (注意:这里v*Δt就是vel(1))

  2. 对于y_{k+1} = y_k + v * sin(yaw_k) * Δt
    对y_k的偏导:1
    对yaw_k的偏导:∂(y_{k+1})/∂yaw_k = v * cos(yaw_k) * Δt

  3. 对于yaw_{k+1} = yaw_k + ω * Δt
    对yaw_k的偏导:1

  4. 其他状态分量的偏导:保持不变,所以对角线上为1,其他为0。

因此,雅可比矩阵F(6x6)为:

    x   y   z   r   p   yaw
x [ 1   0   0   0   0   -v*sin(yaw)*Δt ]
y [ 0   1   0   0   0    v*cos(yaw)*Δt ]
z [ 0   0   1   0   0     0           ]
r [ 0   0   0   1   0     0           ]
p [ 0   0   0   0   1     0           ]

yaw [ 0 0 0 0 0 1 ]

在代码中,df初始化为单位矩阵(对角线上为1,其他为0)。因此,我们只需要修改第1行第6列(即df(1,6))和第2行第6列(即df(2,6))这两个元素,将初始的0改为计算得到的值。

所以代码中:
df(1,6) = -vel_trans * sin(yaw); // 对应∂(x_{k+1})/∂yaw_k = -vΔtsin(yaw)
df(2,6) = vel_trans * cos(yaw); // 对应∂(y_{k+1})/∂yaw_k = vΔtcos(yaw)

而其他位置的偏导数已经是0(非对角线)或者1(对角线),无需改变。

结论:我们只更新了这两个位置,因为运动模型中只有x和y的更新方程含有yaw角(状态向量的第6个分量),其他状态变量没有交叉耦合。

注意:在控制理论中,我们通常将状态转移函数关于状态向量求偏导。这里我们只对状态向量(k时刻)求导,控制输入(vel)在这里视为已知量,不需要求导(因为控制输入是独立的输入,不是状态向量的一部分)。

http://www.xdnf.cn/news/12500.html

相关文章:

  • 和芯 SL6341 (内置FLASH) 国产USB 3.0HUB芯片 替代 GL3510 VL817
  • 区块链技术相关
  • mybatis中判断等于字符串的条件怎么写
  • ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
  • Python爬虫实战:研究mechanize库相关技术
  • 深入解析JVM工作原理:从字节码到机器指令的全过程
  • 四叉树在空间结构建模中的应用
  • 车载以太网数据流量抓取手段全解析
  • 深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作
  • C++11完美转发
  • Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理
  • intelrealsense深度相机产品介绍
  • 从零开始的python学习(七)P95+P96+P97+P98+P99+P100+P101
  • MySQL安装与配置
  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
  • 口罩佩戴检测算法AI智能分析网关V4工厂/工业等多场景守护公共卫生安全
  • Linux 服务管理与自启动配置全解析:rc.d、systemctl与service对比
  • MySQL 性能调优入门 - 慢查询分析与索引优化基础
  • 智能终端与边缘计算按章复习
  • Skia如何绘制几何图形
  • 解决基于LangGraph框架的DeerFlow使用Qwen3不能正常被解析的问题
  • Edge(Bing)自动领积分脚本部署——基于python和Selenium(附源码)
  • 开源投屏工具Escrcpy的使用教程
  • MySQL基础2
  • F5 GSLB 最佳实践:如何手动将Wide IP 故障转移到另一个数据中心
  • Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
  • 链游技术破壁:NFT资产确权与Play-to-Earn经济模型实战
  • 从零开始基于Ubuntu18搭建Gazebo地图仿真环境
  • 【AI】智驾地图在不同自动驾驶等级中的作用演变