首页 > 其他分享 >用3个IMU计算空间中两个点的相对位置

用3个IMU计算空间中两个点的相对位置

时间:2024-12-23 18:20:11浏览次数:2  
标签:0.7071 overrightarrow LA 位置 IMU1 quaternion IMU2 IMU 计算

1. 总思路

用两个IMU(1-head,2-robotend)分别固定在想要测量的两个空间点上,用另外一个IMU(3)固定在静止物体上,充当参考坐标系。
IMU1 is mounted on the human head, IMU2 is mounted on the robot end-effector, and IMU3 is mounted on the desk as stationary.

2. 带入实数计算例子

  1. 先获得每个IMU的线加速度(Linear Acceleration)的数值:下面简写为LA

    \[\overrightarrow{LA}_1=[0.2,0.3,9.9] \]

    \[\overrightarrow{LA}_2=[0.1,0.4,9.7] \]

    \[\overrightarrow{LA}_3=[0, 0, 9.81] \]

    获得每个IMU方向四元数(Orientation Quaternion):下面简写为Rotation (R)
    以四元数形式绕 Z 轴旋转 90°

    \[R_1=[0, 0, 0.7071,0.7071] \]

    以四元数形式绕 Y 轴旋转 90°

    \[R_2=[0,0.7071,0,0.7071] \]

    全局的identity四元数

    \[R_3=[0, 0, 0, 1] \]

  2. 将线加速度转换到全局(global)坐标系中
    使用静止IMU(3)的方向四元数

    \[R_3=[0, 0, 0, 1] \]

    来定义全局坐标系;
    以IMU1为例,首先计算IMU1相对IMU3的旋转

    \[R_{1relative}=R_3\cdot{R_1^{-1}} \]

    其中,\(R_1^{-1}\)是指四元数\(R_1\)的共轭,也就是\(R_1\)中的x, y, z取相反数,即\(R_1^{-1}=[0, 0, -0.7071,0.7071]\)
    带入计算得到

    \[R_{1relative}=[0, 0, 0, 1]\cdot{[0, 0, -0.7071,0.7071]}=[0, 0, -0.7071,0.7071] \]

    用以上旋转来转换IMI1的线性加速度到全局坐标系中
    先将线性加速度表示为标量部分为0的四元数(从三位变成四位)

    \[\overrightarrow{LA}_{1}^{quaternion}=[0.2,0.3,9.9,0] \]

    然后使用上面计算得到的IMU1相对IMU3的相对四元数\(R_{1relative}\)对IMU1的加速度进行旋转:

    \[\overrightarrow{LA}_{1global}=R_{1relative}\cdot{\overrightarrow{LA}_{1}^{quaternion}}\cdot{R_{1relative}^{-1}} \]

    \[\overrightarrow{LA}_{1global}=[0, 0, -0.7071,0.7071]\cdot{[0.2,0.3,9.9,0]}\cdot{[0, 0, 0.7071,0.7071]} \]

    \[\overrightarrow{LA}_{1global}=[0.3, -0.2, 9.9, 0] \]

    其中的矢量部分\(\overrightarrow{LA}_{1global}=[0.3, -0.2, 9.9]\)就是全局坐标系中IMU1的线性加速度。
    同理,计算得到

    \[\overrightarrow{LA}_{2global}=[-9.7,0.4,0.1] \]

  3. 重力补偿
    从\(\overrightarrow{LA}_{global}\)中减去重力加速度\(\overrightarrow{g}=[0,0,9.81]\),得到\(\overrightarrow{LA}_{globalG}\), IMU1和IMU2分别为:

    \[\overrightarrow{LA}_{1globalG}=\overrightarrow{LA}_{1global}-\vec{g}=[0.3, -0.2, 9.9]-[0,0,9.81]=[0.3, -0.2, 0.09] \]

    \[\overrightarrow{LA}_{2globalG}=\overrightarrow{LA}_{2global}-\vec{g}=[-9.7,0.4,0.1]-[0,0,9.81]=[-9.7,0.4, -9.71] \]

  4. 积分得到速度和位置
    假设积分的时间步长为\(\Delta{t}=0.1\)seconds.
    4.1 对加速度进行积分得到速度:

    \[\overrightarrow{v(t)}=\int{\overrightarrow{LA}_{globalG}(t)dt} \]

    为了简化,将积分约写成:

    \[\overrightarrow{v}=\overrightarrow{LA}_{globalG}\Delta{t} \]

    对于IMU1:

    \[\overrightarrow{v}_1=[0.3, -0.2, 0.09]\cdot{0.1}=[0.03, -0.02, 0.009] \]

    对于IMU2:

    \[\overrightarrow{v}_1=[-9.7,0.4, -9.71]\cdot{0.1}=[-0.97,0.04, -0.971] \]

    4.2 对速度进行积分得到位置:

    \[\overrightarrow{p(t)}=\int{\overrightarrow{v(t)}dt} \]

    约写成:

    \[\overrightarrow{p}=\overrightarrow{v}\cdot{\Delta{t}} \]

    对于IMU1:

    \[\overrightarrow{p}_1=\overrightarrow{v}_1\cdot{\Delta{t}}=[0.03, -0.02, 0.009]\cdot{0.1}=[0.003, -0.002, 0.0009] \]

    对于IMU2:

    \[\overrightarrow{p}_2=\overrightarrow{v}_2\cdot{\Delta{t}}=[-0.97,0.04, -0.971]\cdot{0.1}=[-0.097,0.004, -0.0971] \]

  5. 计算相对位置
    计算IMU1和IMU2分别相对于IMU3的位置(IMU3静止不动):
    对于IMU1:

    \[\overrightarrow{p}_{1relative}=\overrightarrow{p}_1-\overrightarrow{p}_3=\overrightarrow{p}_1-[0, 0, 0]=[0.003, -0.002, 0.0009] \]

    对于IMU2:

    \[\overrightarrow{p}_{2relative}=\overrightarrow{p}_2-\overrightarrow{p}_3=\overrightarrow{p}_1-[0, 0, 0]=[-0.097,0.004, -0.0971] \]

    IMU1和IMU2之间的相对位置为:

    \[\overrightarrow{p}_{relative}=\overrightarrow{p}_{2relative}-\overrightarrow{p}_{1relative} \]

    \[\overrightarrow{p}_{relative}=[-0.097,0.004, -0.0971]-[0.003, -0.002, 0.0009] \]

    \[\overrightarrow{p}_{relative}=[-0.1, 0.006, -0.098] \]

4. python实现

import numpy as np

def quaternion_conjugate(q):
    """Compute the conjugate of a quaternion."""
    x, y, z, w = q
    return (-x, -y, -z, w)

def quaternion_multiply(q1, q2):
    """Multiply two quaternions."""
    x1, y1, z1, w1 = q1
    x2, y2, z2, w2 = q2
    x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2
    y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2
    z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2
    w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2
    return x, y, z, w

def rotate_vector_by_quaternion(vector, quaternion):
    """Rotate a vector using a quaternion."""
    vector_quaternion = (*vector, 0)  # Convert vector to quaternion form
    q_conjugate = quaternion_conjugate(quaternion)
    temp_result = quaternion_multiply(quaternion, vector_quaternion)
    rotated_vector_quaternion = quaternion_multiply(temp_result, q_conjugate)
    return rotated_vector_quaternion[:3]  # Return only the vector part

# Step 1: Define inputs
# Linear accelerations in local IMU frames
LA1 = [0.2, 0.3, 9.9]  # IMU1 acceleration
LA2 = [0.1, 0.4, 9.7]  # IMU2 acceleration
LA3 = [0.0, 0.0, 9.81]  # IMU3 acceleration (stationary)

# Quaternions (rotations)
R1 = [0, 0, 0.7071, 0.7071]  # IMU1 orientation (90° rotation about Z-axis)
R2 = [0, 0.7071, 0, 0.7071]  # IMU2 orientation (90° rotation about Y-axis)
R3 = [0, 0, 0, 1]  # IMU3 orientation (identity quaternion)

# Step 2: Transform accelerations to the global frame
# For IMU1
R1_relative = quaternion_multiply(R3, quaternion_conjugate(R1))  # Relative quaternion for IMU1
LA1_global = rotate_vector_by_quaternion(LA1, R1_relative)

# For IMU2
R2_relative = quaternion_multiply(R3, quaternion_conjugate(R2))  # Relative quaternion for IMU2
LA2_global = rotate_vector_by_quaternion(LA2, R2_relative)

# Step 3: Gravity compensation
g = [0, 0, 9.81]  # Gravity vector
LA1_globalG = np.subtract(LA1_global, g)
LA2_globalG = np.subtract(LA2_global, g)

# Step 4: Integration to compute velocity and position
dt = 0.1  # Time step

# Velocity
v1 = np.multiply(LA1_globalG, dt)
v2 = np.multiply(LA2_globalG, dt)

# Position
p1 = np.multiply(v1, dt)
p2 = np.multiply(v2, dt)

# Step 5: Compute relative positions
p1_relative = p1  # Relative to stationary IMU3
p2_relative = p2  # Relative to stationary IMU3
p_relative = np.subtract(p2_relative, p1_relative)  # Relative position between IMU1 and IMU2

# Output results
print("IMU1 Global Acceleration:", LA1_global)
print("IMU2 Global Acceleration:", LA2_global)
print("IMU1 Gravity-Compensated Acceleration:", LA1_globalG)
print("IMU2 Gravity-Compensated Acceleration:", LA2_globalG)
print("IMU1 Velocity:", v1)
print("IMU2 Velocity:", v2)
print("IMU1 Position:", p1_relative)
print("IMU2 Position:", p2_relative)
print("Relative Position (IMU2 - IMU1):", p_relative)

标签:0.7071,overrightarrow,LA,位置,IMU1,quaternion,IMU2,IMU,计算
From: https://www.cnblogs.com/zhengshufang/p/18623712

相关文章

  • 第一章计算机思维
    主机:内存储器​运算器​控制器外设:外存储器​IO数据给运算器指令给控制器01二进制存储在存储器中程序是指令的有效组合CPU(中央处理单元)是计算机的核心处理器,它负责执行程序指令、进行数据运算和控制其他硬件组件的工作。计算数据和处......
  • (免费源码)基于springboot的电影院订票系统设计与实现 计算机毕业设计 P10089
    项目说明本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传!项目源码获取方式放在文章末尾处注:项目仅供学习使用,不可商用,如涉及侵权请联系我删除项目技术数据库:mysql5.7......
  • Vue3——计算属性和监听
    一、computed作用:根据已有的数据计算出新数据,具有缓存性(如果依赖的计算数据不更新就只执行一次,更新再执行)只读写法:letfullName=computed(()=>{return计算结果;})可读可写:letfullName=computed({get(){return计算结果;},set(newVal){//......
  • 已知距离时,基于伪逆的解法进行三点法位置解算,MATLAB不构建函数
    已知参考点的坐标,通过待测点与参考点之间的距离,使用伪逆来解待测点的坐标。MATLAB函数示例%输入参考点的坐标(参考点)reference_points=[1,1;2,3;3,1];%Nx2矩阵,至少要有三个点%输入每个参考点到目标点的距离distances=[1.5;1.0;1.2......
  • 数智化医院分布式计算框架融合人工智能方向初步实现与能力转换浅析
    人工智能中心计算机一、引言1.1研究背景与意义近年来,人工智能(ArtificialIntelligence,AI)与大数据技术的迅猛发展为医疗行业带来了前所未有的变革机遇。医疗领域积累了海量的数据,如电子病历(ElectronicMedicalRecord,EMR)、医学影像、临床检验数据以及基因数据等。这些数......
  • 计算机电源管理模式详解:从待机到休眠的五种状态
    计算机电源管理模式详解:从待机到休眠的五种状态计算机状态S1Standby。即指说系统处于低电源供应状态,在windowsorBIOS中可设定屏幕信号输出关闭、硬盘停止运转进入待机状态、电源灯处于闪烁状态。此时动一动鼠标、按键盘任一键均可叫醒电脑。S2PowerStandby。......
  • 计算机的一些发展历程
    一、计算机的发展世界上第一台计算机ENIAC(ElectronicNumericalIntegratorAndCalculator,称为电子数字积分计算机)1946年2月诞生于美国。 从元器件来说,计算机发展大致经历了四代的变化: 第一代为1946-1957年,电子管计算机:数据处理; 第二代为1958-1964年,晶体管......
  • 信息学奥赛一本通:1170:计算2的N次方
    【题目描述】任意给定一个正整数N(N<=100),计算2的n次方的值。【输入】输入一个正整数N。【输出】输出2的N次方的值。【输入样例】5【输出样例】32【参考程序一】(1)数据的接收方法和存贮方法       数据的接收和存贮:当输入的数很长时,可采用字符......
  • 题解 - 换位置游戏
    题目描述N个小朋友(编号为1到N)正在玩一个换位置游戏。从左到右依次排列着N个凳子(编号为1到N,最左边的为1号凳子,最右边的为N号凳子),每个凳子上都有一个数字(凳脚处红色数字),每个数字互不相同,且都是不超过N的正整数。游戏开始前,1号小朋友坐在1号凳子上,2号小......
  • 对计算机网络中“层”的理解
    计算机网络中的“层”指的是不同的功能模块,每一层在通信中负责不同的任务,并且每一层之间的通信是通过封装和解封装的方式进行的。每一层在传输数据时会在原始数据的基础上加上一些控制信息(如头部和尾部),但这些信息的作用和添加位置各不相同。OSI模型与TCP/IP模型计算机网络的......