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

无人机中的坐标系与相机姿态计算

球坐标系

球坐标系是三维坐标系中的一种,在无人机中一般使用球坐标系来表示无人机与相机姿态,相机姿态的坐标是相对于无人机的,而无人机的飞行姿态则是相对于大地坐标系的。这里我们使用的相机是2自由度的相机,即可以水平 ϕ \phi ϕ 和垂直 θ \theta θ 两个方向转动,其中 ϕ ∈ [ 0 , 2 π ] \phi \in [0,2\pi] ϕ[0,2π] [ − π , π ] [-\pi,\pi] [π,π] θ ∈ [ 0 , π ] \theta \in [0,\pi] θ[0,π],这里 ρ \rho ρ 为球半径(默认我们使用右手坐标系)
在这里插入图片描述

球坐标与笛卡尔坐标的转换

在后面的计算中我们需要用到球坐标与笛卡尔坐标的坐标转换
在这里插入图片描述

球坐标到笛卡尔坐标

   x = ρ ∗ s i n ( θ ) ∗ c o s ( ϕ ) x =\rho*sin(\theta)*cos(\phi) x=ρsin(θ)cos(ϕ)

   y = ρ ∗ s i n ( θ ) ∗ s i n ( ϕ ) y=\rho*sin(\theta)*sin(\phi) y=ρsin(θ)sin(ϕ)

   z = ρ ∗ c o s ( θ ) z=\rho*cos(\theta) z=ρcos(θ)

笛卡尔坐标到球坐标

   ρ = x 2 + y 2 + z 2 \rho = \sqrt{x^2+y^2+z^2} ρ=x2+y2+z2

   θ = a c o s ( z ÷ ρ ) \theta = acos(z \div \rho) θ=acos(z÷ρ)

   ϕ = a t a n 2 ( y , x ) \phi=atan2(y,x) ϕ=atan2(y,x)

相机相对大地坐标系的姿态

为了计算方便,我们一般旋转坐标系将 z z z轴向下,这个时候无人机机头方向即是 x x x 轴方向, ϕ \phi ϕ即是相对于无人机机头的相机水平旋转角度, θ \theta θ在垂直于无人机方向上为0度
在这里插入图片描述

在无人机飞行中,无人机平台由于飞行运动及气流运动等因素,会影响无人机的飞行姿态,这时搭载的相机姿态相对大地坐标系会发生变化,需要加入无人机姿态去计算修正,以便于更准确计算相机的观测位置

无人机姿态一般包括3个角度即:偏航角、俯仰角、翻滚角。偏行角一般指无人机相对北极的顺时针角度,也即整个坐标系沿 z z z 轴旋转的角度,我们一般要将这个角度转换为直角坐标系中的角度以便后续的计算,转换公式为 a ~ = − a + π / 2 \tilde{a} = - a + \pi/2 a~=a+π/2。俯仰角即飞机的攻角或者飞机机头的俯仰角,在上面的坐标系中是沿 y y y 轴旋转的角度。翻滚角则是飞机左右倾斜的角度,在上面的坐标系中是沿 x x x 轴旋转的角度。以上需要注意的是偏航角与其他角不同,偏航角的旋转是整个坐标系,即将无人机坐标系转换为大地坐标系,这里没有使用位移量,需要时加上经纬度的偏移

三维空间的旋转矩阵

沿 x x x 轴的旋转

   R x ( α ) = [ 1 0 0 0 c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) ] R_x(\alpha)=\begin{bmatrix} 1&0 & 0 \\ 0&cos(\alpha)&-sin(\alpha) \\ 0&sin(\alpha)&cos(\alpha) \end{bmatrix} Rx(α)= 1000cos(α)sin(α)0sin(α)cos(α)

沿 y y y 轴的旋转

   R y ( β ) = [ c o s ( β ) 0 s i n ( β ) 0 1 0 − s i n ( β ) 0 c o s ( β ) ] R_y(\beta)=\begin{bmatrix} cos(\beta)&0&sin(\beta) \\ 0&1 & 0 \\ -sin(\beta)&0&cos(\beta) \end{bmatrix} Ry(β)= cos(β)0sin(β)010sin(β)0cos(β)

沿 z z z 轴的旋转

   R z ( γ ) = [ c o s ( γ ) − s i n ( γ ) 0 s i n ( γ ) c o s ( γ ) 0 0 0 1 ] R_z(\gamma)=\begin{bmatrix} cos(\gamma)&-sin(\gamma) &0 \\ sin(\gamma)&cos(\gamma) &0 \\ 0&0 & 1 \end{bmatrix} Rz(γ)= cos(γ)sin(γ)0sin(γ)cos(γ)0001

合并旋转后的三维度旋转矩阵

   R 3 d = R x ( α ) R y ( β ) R z ( γ ) R_{3d} = R_x(\alpha)R_y(\beta)R_z(\gamma) R3d=Rx(α)Ry(β)Rz(γ)

代码实现

from math import *
import numpy as np

def rad(x):
    return radians(x)

def deg(x):
    return degrees(x)

def coord_sphere2cart(theta,phi, rho = 1):
    x = rho*sin(rad(theta))*cos(rad(phi))
    y = rho*sin(rad(theta))*sin(rad(phi))
    z = rho*cos(rad(theta))
    return x,y,z

def coord_cart2sphere(x,y,z):
    rho = sqrt(x**2+y**2+z**2)
    theta = acos(z/rho)
    phi = atan2(y,x)
    return rho,deg(theta),deg(phi)

def uav_rot(x,y,z,RX,RY,RZ):
    R = rad(RX) #Roll
    P = rad(RY) #Pitch
    Y = rad(RZ) #Yaw
    
    Rx = [[1,0,0],
          [0,cos(R),-sin(R)],
          [0,sin(R),cos(R)]]
    Ry = [[cos(P),0,sin(P)],
          [0,1,0],
          [-sin(P),0,cos(P)]]
    Rz = [[cos(Y),-sin(Y),0],
          [sin(Y),cos(Y),0],
          [0,0,1]]
    Rx = np.array(Rx)
    Ry = np.array(Ry)
    Rz = np.array(Rz)
    R3d = np.dot(np.dot(Rx,Ry),Rz)
    xyz = np.array([x,y,z])
    xyz_ = np.dot(R3d,xyz)
    return xyz_

def camera_rectify(pan,tilt,yaw,pitch,roll):
    x,y,z = coord_sphere2cart(theta=tilt,phi=pan,rho=1)
    x_,y_,z_ = uav_rot(x,y,z,RX=roll,RY=pitch,RZ=yaw)
    r,theta,phi = coord_cart2sphere(x_,y_,z_)
    pan = phi
    tilt = theta
    return pan,tilt

未完待续。。。

相关文章:

  • 100天精通Python(数据分析篇)——第56天:Pandas读写txt和csv文件(read_csv、to_csv)
  • 【开发小记】vue项目优化
  • 1、javaweb学习知识简析
  • 【Linux操作系统】基础概念和常用指令(一)
  • 类和对象·默认成员函数
  • Elastic Stack(elk+filebeat)
  • PyTorchの可视化工具
  • LeetCode279:完全平方数,动态规划解法超过46%,作弊解法却超过97%
  • docker安装以及运行nacos、rabbitmq、MySQL容器小记
  • S7-200SMART PLC进行MODBUS通信轮询时掉站处理和错误信息提取的具体方法演示
  • Transformer - Attention Is All You Need - 跟李沐学AI
  • c语言qsort函数使用教程
  • Android修行手册 - TabLayout全解析(下)-监听和示例
  • Java面试高频面试题总结
  • 手把手教你电机FOC控制【一】
  • __proto__ 和 prototype的关系
  • 2018一半小结一波
  • C++类的相互关联
  • canvas 绘制双线技巧
  • CentOS7 安装JDK
  • es的写入过程
  • Java的Interrupt与线程中断
  • Js基础知识(一) - 变量
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 浮动相关
  • 机器学习中为什么要做归一化normalization
  • 精彩代码 vue.js
  • 聊一聊前端的监控
  • 一份游戏开发学习路线
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十五)使用Nexus创建Maven私服
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (学习日记)2024.01.19
  • (学习总结16)C++模版2
  • (一)kafka实战——kafka源码编译启动
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net MVC中使用angularJs刷新页面数据列表
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET命令行(CLI)常用命令
  • @拔赤:Web前端开发十日谈
  • [Apio2012]dispatching 左偏树
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [Doc][px4][ros2][gazebo][yolov8]PX4-ROS2-Gazebo-YOLOv8
  • [FBCTF2019]RCEService1
  • [Gamma]阶段测试报告
  • [Go]-抢购类业务方案
  • [Leetcode LCR 106.判断二分图]