感知算法-超声波三角定位测量方法

xiaoxiao2021-03-01  63

文章目录

测量目标坐标点的计算1、表述定义2、传感器工作状态描述3、测量距离计算4、目标位置计算5、计算过程中的常数6、软件代码

测量目标坐标点的计算

1、表述定义

定义目标位置的坐标为 ( x 2 T , y 2 T ) (x^T_2,y^T_2) (x2T,y2T),2号传感器的坐标为 ( x 2 2 , y 2 2 ) (x^2_2,y^2_2) (x22,y22)、3号传感器的坐标点为 ( x 2 3 , y 2 3 ) (x^3_2,y^3_2) (x23,y23)、4号传感器的坐标点为 ( x 2 4 , y 2 4 ) (x^4_2,y^4_2) (x24,y24)。2、3、4号传感器测得的实际距离定义为 D 2 D_2 D2 D 3 D_3 D3 D 4 D_4 D4。点 ( x 2 3 , y 2 3 ) (x^3_2,y^3_2) (x23,y23)和点 ( x 2 4 , y 2 4 ) (x^4_2,y^4_2) (x24,y24)之间的距离为 L 1 L_1 L1,点 ( x 2 2 , y 2 2 ) (x^2_2,y^2_2) (x22,y22)和点 ( x 2 3 , y 2 3 ) (x^3_2,y^3_2) (x23,y23)之间的距离为 L 2 L_2 L2。定义 L 1 L_1 L1相对 X X X轴旋转的角度为 α 1 \alpha_1 α1 L 2 L_2 L2相对 X X X轴旋转的角度为 α 2 \alpha_2 α2 D 3 D_3 D3 L 1 L_1 L1的夹角为 β 1 \beta_1 β1 D 2 D_2 D2 L 2 L_2 L2的夹角为 β 2 \beta_2 β2

2、传感器工作状态描述

3号传感器处于收发一体模式,2、4号传感器处于接收模式。3号传感器发射完超声波后,和2、4号传感器一样都处于接收状态,等待超声波的回波信号,分别产生3个飞行时间,分别为 T O F 2 TOF_2 TOF2 T O F 3 TOF_3 TOF3 T O F 4 TOF_4 TOF4

对上述状态的图像化描述,如下图所示:

3、测量距离计算

假设T℃温度时的声速为 V T V_T VT,建立距离关系式 D 2 + D 3 = V T ∗ T O F 2 D 3 + D 3 = V T ∗ T O F 3 D 4 + D 3 = V T ∗ T O F 4 \begin{matrix} D_2 + D_3 = V_T*TOF_2 \\ D_3 + D_3 = V_T*TOF_3 \\ D_4 + D_3 = V_T*TOF_4 \end{matrix} D2+D3=VTTOF2D3+D3=VTTOF3D4+D3=VTTOF4 第一步计算距离 D 3 D_3 D3 D 3 = V T ∗ T O F 3 2 D_3 = \frac{V_T*TOF_3}{2} D3=2VTTOF3 接下来计算距离 D 2 D_2 D2 D 4 D_4 D4 D 2 = V T ∗ T O F 2 − D 3 D 4 = V T ∗ T O F 4 − D 3 D_2 = V_T*TOF_2 - D_3\\ D_4 = V_T*TOF_4 - D_3 D2=VTTOF2D3D4=VTTOF4D3 当然,在实际工程应用中,可以不考虑这个误差,直接算出这三个距离值。 D 2 = V T ∗ T O F 2 2 D 3 = V T ∗ T O F 3 2 D 4 = V T ∗ T O F 4 2 D_2 = \frac{V_T*TOF_2}{2} \\ D_3 = \frac{V_T*TOF_3}{2} \\ D_4 = \frac{V_T*TOF_4}{2} D2=2VTTOF2D3=2VTTOF3D4=2VTTOF4

4、目标位置计算

根据坐标点 ( x 2 3 , y 2 3 ) (x^3_2,y^3_2) (x23,y23) ( x 2 4 , y 2 4 ) (x^4_2,y^4_2) (x24,y24)的位置,计算坐标点 ( x 2 T , y 2 T ) (x^T_2,y^T_2) (x2T,y2T)。 计算角度 α \alpha α α 1 = arctan ⁡ y 2 4 − y 2 3 x 2 4 − x 2 3 \alpha_1 = \arctan \frac{y^4_2 - y^3_2}{x^4_2 - x^3_2} α1=arctanx24x23y24y23 α 2 = arctan ⁡ y 2 3 − y 2 2 x 2 3 − x 2 2 \alpha_2 = \arctan \frac{y^3_2 - y^2_2}{x^3_2 - x^2_2} α2=arctanx23x22y23y22计算角度 β \beta β

根据余弦定理计算得 β 1 = arccos ⁡ D 3 2 + L 1 2 − D 4 2 2 ∗ D 3 ∗ L 1 \beta_1 = \arccos \frac{D_3^2 + L_1^2 - D_4^2}{2*D_3*L_1} β1=arccos2D3L1D32+L12D42 β 2 = arccos ⁡ D 2 2 + L 2 2 − D 3 2 2 ∗ D 2 ∗ L 2 \beta_2 = \arccos \frac{D_2^2 + L_2^2 - D_3^2}{2*D_2*L_2} β2=arccos2D2L2D22+L22D32

计算目标位置坐标

3、4号传感器组合测量结果为

[ x 2 T y 2 T ] = [ x 2 3 y 2 3 ] + [ D 3 ∗ cos ⁡ ( α 1 + β 1 ) D 3 ∗ sin ⁡ ( α 1 + β 1 ) ] \left[ \begin{matrix} x^T_2\\y^T_2 \end{matrix} \right]= \left[ \begin{matrix} x^3_2\\y^3_2 \end{matrix} \right]+ \left[ \begin{matrix} D_3*\cos (\alpha_1+\beta_1) \\ D_3*\sin (\alpha_1+\beta_1) \end{matrix} \right] [x2Ty2T]=[x23y23]+[D3cos(α1+β1)D3sin(α1+β1)]

2、3号传感器组合测量结果为

[ x 2 T y 2 T ] = [ x 2 2 y 2 2 ] + [ D 2 ∗ cos ⁡ ( α 2 + β 2 ) D 2 ∗ sin ⁡ ( α 2 + β 2 ) ] \left[ \begin{matrix} x^T_2\\y^T_2 \end{matrix} \right]= \left[ \begin{matrix} x^2_2\\y^2_2 \end{matrix} \right]+ \left[ \begin{matrix} D_2*\cos (\alpha_2+\beta_2) \\ D_2*\sin (\alpha_2+\beta_2) \end{matrix} \right] [x2Ty2T]=[x22y22]+[D2cos(α2+β2)D2sin(α2+β2)]

5、计算过程中的常数

由于传感器的安装位置是固定的,所以上述计算过程中,很多参数是确定的常量。

已知传感器安装位置点 传感器号坐标位置实际坐标点2号 ( x 2 2 , y 2 2 ) (x^2_2,y^2_2) (x22,y22) ( 360 , 30 ) (360,30) (360,30)3号 ( x 2 3 , y 2 3 ) (x^3_2,y^3_2) (x23,y23) ( 360 , − 30 ) (360,-30) (360,30)4号 ( x 2 4 , y 2 4 ) (x^4_2,y^4_2) (x24,y24) ( 346 , − 70 ) (346,-70) (346,70)

通过上述信息,可以计算出传感器的距离 L 1 L_1 L1 L 2 L_2 L2,以及对应的旋转角度 α 1 \alpha_1 α1 α 2 \alpha_2 α2

参数计算值 L 1 L_1 L142.3792(cm) L 2 L_2 L260(cm) α 1 \alpha_1 α1250.71(°) α 2 \alpha_2 α2270(°)

6、软件代码

/// <summary> /// 计算超声波的距离 /// </summary> /// <param name="m_318Data">输入原始超声波的原始数据</param> /// <param name="Distance">计算实际距离</param> private void DistanceCalculate(LIN_STP318_ReadData[] m_318Data,ref double [] Distance) { Distance[1] = m_318Data[1].TOF * 0.0157;//cm Distance[0] = m_318Data[0].TOF * 0.0314 - Distance[1];//cm Distance[2] = m_318Data[2].TOF * 0.0314 - Distance[1];//cm } //目标位置计算 /// <summary> /// 目标位置坐标点计算 /// </summary> /// <param name="base_position">基准点坐标点</param> /// <param name="base_angle">基准角度(弧度)</param> /// <param name="base_L">基准长度(cm)</param> /// <param name="distance1">临边长度(cm)</param> /// <param name="distance2">对角长度(cm)</param> /// <param name="TargetPosition">输出最终的目标位置坐标</param> private void TargetPositionCalculate(Axis base_position,double base_angle,double base_L,double distance1, double distance2,ref Axis TargetPosition) { double beta = Math.Acos((Math.Pow(base_L, 2) + Math.Pow(distance1, 2) - Math.Pow(distance2, 2)) / (2 * base_L * distance1)); TargetPosition.x = base_position.x + distance1 * Math.Cos(base_angle + beta); TargetPosition.y = base_position.y + distance1 * Math.Sin(base_angle + beta); }
转载请注明原文地址: https://www.6miu.com/read-4149968.html

最新回复(0)