测量目标坐标点的计算
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=VT∗TOF2D3+D3=VT∗TOF3D4+D3=VT∗TOF4
第一步计算距离
D
3
D_3
D3
D
3
=
V
T
∗
T
O
F
3
2
D_3 = \frac{V_T*TOF_3}{2}
D3=2VT∗TOF3
接下来计算距离
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=VT∗TOF2−D3D4=VT∗TOF4−D3
当然,在实际工程应用中,可以不考虑这个误差,直接算出这三个距离值。
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=2VT∗TOF2D3=2VT∗TOF3D4=2VT∗TOF4
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=arctanx24−x23y24−y23
α 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=arctanx23−x22y23−y22 - 计算角度 β \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=arccos2∗D3∗L1D32+L12−D42
β
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=arccos2∗D2∗L2D22+L22−D32
- 计算目标位置坐标
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]+[D3∗cos(α1+β1)D3∗sin(α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]+[D2∗cos(α2+β2)D2∗sin(α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 L1 | 42.3792(cm) |
L 2 L_2 L2 | 60(cm) |
α 1 \alpha_1 α1 | 250.71(°) |
α 2 \alpha_2 α2 | 270(°) |
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);
}