@@ -538,12 +538,39 @@ void sensorWorkerSteeringPoller( void* z ) {
538
538
wheelAngleTmp *= ( float ) -1 ;
539
539
}
540
540
541
- wheelAngleTmp -= steerConfig.wheelAngleOffset ;
541
+ // Ackermann (ignore everything below 0,5°)
542
+ if ( (steerConfig.wheelAngleSensorType == SteerConfig::WheelAngleSensorType::AckermannLeft
543
+ || steerConfig.wheelAngleSensorType == SteerConfig::WheelAngleSensorType::AckermannRight)
544
+ && (wheelAngleTmp > 0.5 || wheelAngleTmp < 0.5 )) {
545
+ // just for the human, nicer names
546
+ float wheelbase = steerConfig.wheelAngleFirstArmLenght ;
547
+ float trackWidth = steerConfig.wheelAngleSecondArmLenght ;
548
+ bool negativeAngel = wheelAngleTmp < 0 ;
549
+ float mathAngle = abs (wheelAngleTmp) * PI / 180 ;
550
+
551
+ // calculate the distance of the adjacent side of the triangle (turning point rear axle <-> turn circle center)
552
+ float distance = wheelbase / tan ( mathAngle );
553
+ // add or substract half the trackWidth
554
+ if ( ( negativeAngel && steerConfig.wheelAngleSensorType == SteerConfig::WheelAngleSensorType::AckermannLeft )
555
+ || ( ! negativeAngel && steerConfig.wheelAngleSensorType == SteerConfig::WheelAngleSensorType::AckermannRight ) ) {
556
+ distance += trackWidth / 2 ;
557
+ } else {
558
+ distance -= trackWidth / 2 ;
559
+ }
542
560
561
+ // now calculate the virtual wheel in the center
562
+ mathAngle = atan (wheelbase / distance);
563
+
564
+ // convert back to degrees and add go back to negative/positive
565
+ if (negativeAngel) {
566
+ wheelAngleTmp = mathAngle * 180 / PI * -1 ;
567
+ } else {
568
+ wheelAngleTmp = mathAngle * 180 / PI;
569
+ }
570
+ }
543
571
wheelAngleTmp = wheelAngleSensorFilter.step ( wheelAngleTmp );
544
572
steerSetpoints.actualSteerAngle = wheelAngleTmp;
545
573
}
546
-
547
574
}
548
575
549
576
{
0 commit comments