A class for calculating steering angle calculations based on current and desired heading and specified intercept distance along the new path.

Dependents:   AVC_20110423

Files at this revision

API Documentation at this revision

Comitter:
shimniok
Date:
Wed Apr 27 18:55:38 2011 +0000
Commit message:
Initial release

Changed in this revision

Steering.cpp Show annotated file Show diff for this revision Revisions of this file
Steering.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a3b128cdb78b Steering.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Steering.cpp	Wed Apr 27 18:55:38 2011 +0000
@@ -0,0 +1,42 @@
+#include "Steering.h"
+#include "math.h"
+
+/** create a new steering calculator for a particular vehicle
+ *
+ */
+Steering::Steering(float wheelbase, float track)
+    : _wheelbase(wheelbase)
+    , _track(track)
+    , _intercept(2.0)
+{
+}
+
+void Steering::setIntercept(float intercept)
+{
+    _intercept = intercept;
+}
+
+/** Calculate a steering angle based on relative bearing
+ *
+ */
+float Steering::calcSA(float theta) {
+    float radius;
+    float SA;
+    bool neg = (theta < 0);
+
+    // I haven't had time to work out why the equation is slightly offset such
+    // that negative angle produces slightly less steering angle
+    //
+    if (neg) theta *= -1.0;    
+    
+    // The equation peaks out at 90* so clamp theta artifically to 90, so that
+    // if theta is actually > 90, we select max steering
+    if (theta > 90.0) theta = 90.0;
+    
+    radius = _intercept/(2*sin(angle_radians(theta)));
+    SA = angle_degrees(asin(_wheelbase / (radius - _track/2)));
+
+    if (neg) SA *= -1.0;
+
+    return SA;
+}
diff -r 000000000000 -r a3b128cdb78b Steering.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Steering.h	Wed Apr 27 18:55:38 2011 +0000
@@ -0,0 +1,45 @@
+
+#define PI 3.141592653589
+
+/** A class for managing steering angle calculations based on current and desired heading
+ *  and specified intercept distance along the new path.  
+ *
+ *  See Notebook entry: http://mbed.org/users/shimniok/notebook/smooth-steering-for-rc-car/
+ */
+class Steering
+{
+  public:
+    /** create a new steering calculator
+     *
+     * @param wheelbase vehicle wheelbase
+     * @param track vehicle track width
+     * @param intercept new course intercept distance
+     */
+    Steering(float wheelbase, float track);
+
+    /** set intercept distance
+     * @param intercept distance along new course at which turn arc will intercept
+     */
+    void setIntercept(float intercept);
+
+    /** convert course change to average steering angle
+     * assumes Ackerman steering, with track and wheelbase
+     * and course intercept distance specified.
+     *
+     * See notebook: http://mbed.org/users/shimniok/notebook/smooth-steering-for-rc-car/
+     *
+     * @param theta relative bearing of the new course
+     * @returns steering angle in degrees
+     */ 
+    float calcSA(float theta);
+    
+  private:
+
+    inline static float angle_radians(float deg) {return (PI/180.0)*deg;}
+
+    inline static float angle_degrees(float rad) {return (180/PI)*rad;}
+
+    float _wheelbase;
+    float _track;
+    float _intercept;
+};
\ No newline at end of file