姿态估计之Yaw Pitch Roll

前言

姿态通常是物体自身坐标系相对某个约定的参考坐标系的一个状态,日常生活中描述姿态一般都是相对地面坐标系而言的,因为这更符合人的直观感受。在生活中较为常见的是飞机在空中时的姿态描述,这能辅助描述飞机的状态定位和状态调整。
在这里插入图片描述

姿态估计

姿态简单来说就是物体坐标系到大地坐标系之间的状态。而姿态估计则是采用某种方法估计出某一三维目标物体的方位指向问题。姿态估计在机器人视觉、动作跟踪和单照相机定标等很多领域都有应用。常见的姿态估计问题有人体姿态估计、人脸姿态估计等。

在这里插入图片描述在这里插入图片描述

欧拉角与姿态角

欧拉角是一种最直观的姿态描述方式,它的核心思想是一个坐标系到另一个坐标系的变换可以通过绕不同坐标轴的三次连续转动来实现。这三次的转动角度统一称为欧拉角。

而欧拉角只是说明了两种坐标系之间的变换关系,实际上我们在姿态估计中使用的姿态角是欧拉角中的一种,是人为约定的一种。通常被用在航空领域,被称为航空次序欧拉角,也叫卡尔丹角。其定义欧拉角的特定转动顺序为Z-Y-X。其中绕Z轴转动的角度为偏航角(Yaw),绕Y轴转动的角度为俯仰角(Pitch),绕X轴转动的角度为横滚角(Roll)。

在这里插入图片描述

Yaw

偏航角(Yaw),调整飞机头部左右朝向。机体坐标系X轴(Roll轴)投影到水平面与地面参考系X轴的夹角,顺时针旋转为正。
在这里插入图片描述

Pitch

俯仰角(Pitch),调整飞机头部上下朝向。机体坐标系Z轴(Yaw轴)与水平面的夹角,抬头为正。

另外,Pitch有颠簸的意思,也能反映出飞机在气流作用下上下颠簸的状态。
在这里插入图片描述

Roll

横滚角(Roll),机体坐标系Z轴(Yaw轴)与通过机体坐标系X轴(Roll轴)的铅垂面间的夹角,机体右旋为正。
在这里插入图片描述

其他场景姿态角示例

在这里插入图片描述

人脸姿态估计方法和应用

Hopenet

deep-head-pose: Deep Learning Head Pose Estimation using PyTorch
在这里插入图片描述
(注:图片来源https://github.com/natanielruiz/deep-head-pose

Face-Pose-Net

FacePoseNet: Making a Case for Landmark-Free Face Alignment
在这里插入图片描述
(注:图片来源https://github.com/fengju514/Face-Pose-Net

FacePose_pytorch

The pytorch implement of the head pose estimation(yaw,roll,pitch) and emotion detection in real time.
在这里插入图片描述
(注:图片来源https://github.com/WIKI2020/FacePose_pytorch

从人脸关键点估计姿态代码示例

import numpy as np
import math
import cv2

def rotationMatrixToEulerAngles(R) :
    sy = math.sqrt(R[0,0] * R[0,0] +  R[1,0] * R[1,0])
    singular = sy < 1e-6
    if  not singular :
        x = math.atan2(R[2,1] , R[2,2])
        y = math.atan2(-R[2,0], sy)
        z = math.atan2(R[1,0], R[0,0])
    else :
        x = math.atan2(-R[1,2], R[1,1])
        y = math.atan2(-R[2,0], sy)
        z = 0
    return np.array([x, y, z])

def estimate_pitch_yaw_roll(aligned_landmarks, size):
    """
    aligned_landmarks: landmark3D 68
    size: image size
    returns pitch,yaw,roll [-pi/2...+pi/2]
    """
    shape = (size,size)
    focal_length = shape[1]
    camera_center = (shape[1] / 2, shape[0] / 2)
    camera_matrix = np.array(
        [[focal_length, 0, camera_center[0]],
         [0, focal_length, camera_center[1]],
         [0, 0, 1]], dtype=np.float32)

    (_, rotation_vector, _) = cv2.solvePnP(
        np.concatenate( (landmarks_68_3D[:27],   landmarks_68_3D[30:36]) , axis=0) ,
        np.concatenate( (aligned_landmarks[:27], aligned_landmarks[30:36]) , axis=0).astype(np.float32),
        camera_matrix,
        np.zeros((4, 1)) )

    pitch, yaw, roll = rotationMatrixToEulerAngles( cv2.Rodrigues(rotation_vector)[0] )
   
    half_pi = math.pi / 2.0
    pitch = np.clip ( pitch, -half_pi, half_pi )
    yaw   = np.clip ( yaw ,  -half_pi, half_pi )
    roll  = np.clip ( roll,  -half_pi, half_pi )

    return -pitch, yaw, roll

版权说明

本文为原创文章,独家发布在blog.youkuaiyun.com/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com
在这里插入图片描述

参考资料

[1] Pitch, yaw, and roll - Simple English Wikipedia, the free encyclopedia
[2] Aircraft principal axes - Wikipedia
[3] Yaw (rotation) - Wikipedia
[4] pitch yaw roll是什么 - 简书
[5] 航空次序欧拉角_百度百科
[6] GitHub - natanielruiz/deep-head-pose: Deep Learning Head Pose Estimation using PyTorch.
[7] fengju514/Face-Pose-Net: Estimate 3D face pose (6DoF) or 11 parameters of 3x4 projection matrix by a Convolutional Neural Network
[8] WIKI2020/FacePose_pytorch: This is a pure python project predict head pose (yaw,roll,pitch).Easy to deploy, easy to use, and high accuracy
[9] ostadabbas/3d-facial-landmark-detection-and-tracking: Human 3D Facial Pose Estimation and Tracking (AffCom IJCAI2018)
[10] 人体姿态估计的过去,现在,未来 - 知乎
[11] 姿态篇:一.初识姿态估计 - 简书
[12] 估计姿态_hk121的博客-优快云博客_姿态估计
[13] 学习《姿态引导的真实人脸旋转》论文 - 知乎
[14] dlib人脸姿态欧拉角_Cody的博客-优快云博客_人脸欧拉角

### Roll, Yaw, Pitch 的定义及其应用 在机器人学和传感器数据处理领域,RollYawPitch 是描述物体三维空间旋转状态的关键参数。这些度通常用于表示刚体的姿态变化。 - **滚转 (Roll)** 描述的是围绕X轴的旋转运动[^1]。 - **偏航 (Yaw)** 表示沿Z轴发生的水平方向上的转动[^2]。 - **俯仰 (Pitch)** 定义为沿着Y轴产生的上下倾斜动作[^3]。 这三个欧拉可以用来精确地表达任何给定时刻下飞行器、车辆或者其他移动平台的空间方位,并且对于导航系统至关重要。 ### 姿态解算方法概述 为了从惯性测量单元(IMU)获取到准确可靠的roll/yaw/pitch信息,在实际工程实践中经常采用互补滤波算法或是扩展卡尔曼滤波(EKF)[^4]来融合加速度计、陀螺仪以及磁力计的数据: #### 互补滤波法 这是一种简单有效的实时估计方式,它通过将低频部分交给重力感应型加速表负责,而高频响应则由速率传感装置承担,从而实现两者优势互补的效果[^5]。 ```python def complementary_filter(acceleration, gyro_rate, dt=0.01): alpha = 0.98 # 调整此系数可改变滤波特性的侧重程度 roll_gyro = previous_roll + gyro_rate['x'] * dt pitch_gyro = previous_pitch + gyro_rate['y'] * dt yaw_gyro = previous_yaw + gyro_rate['z'] * dt norm_accel = np.linalg.norm([acceleration['x'], acceleration['y'], acceleration['z']]) roll_acc = math.atan2(acceleration['y'], acceleration['z']) * 180 / math.pi pitch_acc = math.atan(-acceleration['x']/norm_accel) * 180 / math.pi current_roll = alpha * roll_gyro + (1 - alpha) * roll_acc current_pitch = alpha * pitch_gyro + (1 - alpha) * pitch_acc current_yaw = yaw_gyro # 加速度无法提供有效参考故仅依赖于gyro更新 return {'roll':current_roll,'pitch':current_pitch,'yaw':current_yaw} ``` #### 扩展卡尔曼滤波 EKF是一种更复杂的非线性状态预测模型,适用于存在噪声干扰的情况下的最优估计问题。该方法能够更好地应对动态环境中的不确定性因素影响,因此被广泛应用于自动驾驶汽车等领域内的高精度定位任务当中[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracelessLe

❀点个赞加个关注再走吧❀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值