61
61
void SensorFusion::estimateNewState (const SensorData& newSensorData)
62
62
{
63
63
/* Calculate the physical Values via the Sensitivity Factors. */
64
- float physicalAccelerationX =
65
- static_cast <float >(newSensorData.accelerationX ) * SensorConstants::ACCELEROMETER_SENSITIVITY_FACTOR;
66
- float physicalTurnRate = static_cast <float >(newSensorData.turnRate ) * SensorConstants::GYRO_SENSITIVITY_FACTOR;
64
+ float physicalAccelerationX = static_cast <float >(newSensorData.accelerationX ) *
65
+ SensorConstants::ACCELEROMETER_SENSITIVITY_FACTOR; /* In mm/s^2 */
66
+ float physicalTurnRate =
67
+ static_cast <float >(newSensorData.turnRate ) * SensorConstants::GYRO_SENSITIVITY_FACTOR; /* In mrad/s */
67
68
68
69
KalmanParameter kalmanParameter;
69
70
if (true == m_isFirstIteration)
70
71
{
71
72
/* Directely use the Position calculated via Odometry in the first iteration */
72
- kalmanParameter.positionOdometryX = static_cast <float >(newSensorData.positionOdometryX );
73
- kalmanParameter.positionOdometryY = static_cast <float >(newSensorData.positionOdometryY );
74
- kalmanParameter.angleOdometry = static_cast <float >(newSensorData.orientationOdometry );
75
- kalmanParameter.turnRate = physicalTurnRate;
76
- kalmanParameter.accelerationX = physicalAccelerationX;
77
- kalmanParameter.velocityOdometry = 0 .0F ;
73
+ kalmanParameter.positionOdometryX = static_cast <float >(newSensorData.positionOdometryX ); /* In mm */
74
+ kalmanParameter.positionOdometryY = static_cast <float >(newSensorData.positionOdometryY ); /* In mm */
75
+ kalmanParameter.angleOdometry = static_cast <float >(newSensorData.orientationOdometry ); /* In mrad */
76
+ kalmanParameter.turnRate = physicalTurnRate; /* In mrad/s */
77
+ kalmanParameter.accelerationX = physicalAccelerationX; /* In mm/s^2 */
78
+ kalmanParameter.velocityOdometry = 0 .0F ; /* In mm/s */
78
79
m_kalmanFilter.init (kalmanParameter);
79
80
m_estimatedPosition = {kalmanParameter.positionOdometryX , kalmanParameter.positionOdometryY ,
80
81
kalmanParameter.angleOdometry };
@@ -83,14 +84,17 @@ void SensorFusion::estimateNewState(const SensorData& newSensorData)
83
84
else
84
85
{
85
86
/* Calculate the traveled euclidean Distance based upon the Odometry Values. */
86
- float deltaXOdometry = static_cast <float >(newSensorData.positionOdometryX ) - m_lastOdometryPosition.positionX ;
87
- float deltaYOdometry = static_cast <float >(newSensorData.positionOdometryY ) - m_lastOdometryPosition.positionY ;
88
- float euclideanDistance = sqrtf (powf (deltaXOdometry, 2 .0F ) + powf (deltaYOdometry, 2 .0F ));
87
+ float deltaXOdometry =
88
+ static_cast <float >(newSensorData.positionOdometryX ) - m_lastOdometryPosition.positionX ; /* In mm */
89
+ float deltaYOdometry =
90
+ static_cast <float >(newSensorData.positionOdometryY ) - m_lastOdometryPosition.positionY ; /* In mm */
91
+ float euclideanDistance = sqrtf (powf (deltaXOdometry, 2 .0F ) + powf (deltaYOdometry, 2 .0F )); /* In mm */
89
92
90
- float deltaAngleOdometry = static_cast <float >(newSensorData.orientationOdometry ) - m_lastOdometryPosition.angle ;
91
- float updatedOrientationOdometry = m_estimatedPosition.angle + deltaAngleOdometry;
93
+ float deltaAngleOdometry =
94
+ static_cast <float >(newSensorData.orientationOdometry ) - m_lastOdometryPosition.angle ; /* In mrad */
95
+ float updatedOrientationOdometry = m_estimatedPosition.angle + deltaAngleOdometry; /* In mrad */
92
96
93
- float duration = static_cast <float >(newSensorData.timePeriod ) / 1000 .0F ;
97
+ float duration = static_cast <float >(newSensorData.timePeriod ) / 1000 .0F ; /* In seconds */
94
98
95
99
/* Calculate the mean velocity since the last Iteration instead of using the momentary Speed.
96
100
Correct the sign of the distance via the measured velocity if the velocity is negative, hence the robot drives
@@ -104,38 +108,38 @@ void SensorFusion::estimateNewState(const SensorData& newSensorData)
104
108
{
105
109
directionCorrection = -1 .0F ;
106
110
}
107
- float meanVelocityOdometry = directionCorrection * euclideanDistance / duration;
111
+ float meanVelocityOdometry = directionCorrection * euclideanDistance / duration; /* In mm/s */
108
112
109
113
/* If the robot moves slowly, the odometry might not be updated in the scope of one iteration.
110
114
The velocity would be falsely assumed to be 0. In this case, the last Velocity shall be used. */
111
115
if (0 .0F == meanVelocityOdometry)
112
116
{
113
117
meanVelocityOdometry = m_lastOdometryVelocity;
114
118
}
115
- m_lastOdometryVelocity = meanVelocityOdometry;
119
+ m_lastOdometryVelocity = meanVelocityOdometry; /* In mm/s */
116
120
117
121
/* Update the measured position assuming the robot drives in the estimated Direction.
118
122
Use the Correction Factor in case the robot drives Backwards. */
119
123
kalmanParameter.positionOdometryX =
120
124
m_estimatedPosition.positionX +
121
- directionCorrection * cosf (m_estimatedPosition.angle / 1000 .0F ) * euclideanDistance;
125
+ directionCorrection * cosf (m_estimatedPosition.angle / 1000 .0F ) * euclideanDistance; /* In mm */
122
126
kalmanParameter.positionOdometryY =
123
127
m_estimatedPosition.positionY +
124
- directionCorrection * sinf (m_estimatedPosition.angle / 1000 .0F ) * euclideanDistance;
125
- kalmanParameter.angleOdometry = updatedOrientationOdometry;
126
- kalmanParameter.turnRate = physicalTurnRate;
127
- kalmanParameter.velocityOdometry = meanVelocityOdometry;
128
- kalmanParameter.accelerationX = physicalAccelerationX;
128
+ directionCorrection * sinf (m_estimatedPosition.angle / 1000 .0F ) * euclideanDistance; /* In mm */
129
+ kalmanParameter.angleOdometry = updatedOrientationOdometry; /* In mrad */
130
+ kalmanParameter.turnRate = physicalTurnRate; /* In mrad/s */
131
+ kalmanParameter.velocityOdometry = meanVelocityOdometry; /* In mm/s */
132
+ kalmanParameter.accelerationX = physicalAccelerationX; /* In mm/s^2 */
129
133
130
134
/* Perform the Prediction Step and the Update Step of the Kalman Filter. */
131
135
m_kalmanFilter.predictionStep (newSensorData.timePeriod );
132
136
m_estimatedPosition = m_kalmanFilter.updateStep (kalmanParameter);
133
137
}
134
138
135
139
/* Save the last Odometry values */
136
- m_lastOdometryPosition.positionX = static_cast <float >(newSensorData.positionOdometryX );
137
- m_lastOdometryPosition.positionY = static_cast <float >(newSensorData.positionOdometryY );
138
- m_lastOdometryPosition.angle = static_cast <float >(newSensorData.orientationOdometry );
140
+ m_lastOdometryPosition.positionX = static_cast <float >(newSensorData.positionOdometryX ); /* In mm */
141
+ m_lastOdometryPosition.positionY = static_cast <float >(newSensorData.positionOdometryY ); /* In mm */
142
+ m_lastOdometryPosition.angle = static_cast <float >(newSensorData.orientationOdometry ); /* In mm */
139
143
}
140
144
141
145
/* *****************************************************************************
0 commit comments