summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/motor/motor.cc
diff options
context:
space:
mode:
Diffstat (limited to '2004/i/nono/src/motor/motor.cc')
-rw-r--r--2004/i/nono/src/motor/motor.cc25
1 files changed, 15 insertions, 10 deletions
diff --git a/2004/i/nono/src/motor/motor.cc b/2004/i/nono/src/motor/motor.cc
index 81b801a..7bbae46 100644
--- a/2004/i/nono/src/motor/motor.cc
+++ b/2004/i/nono/src/motor/motor.cc
@@ -34,6 +34,7 @@ Motor *Motor::instance_ = 0;
Motor::Motor (void)
: asserv_ (*this), log_ ("motor"),
s_ (1.0), vs_ (1.0), as_ (1.0),
+ brakeDistance_ (0.0),
movement_ (0), maxSpeed_ (0x40), minSpeed_ (0x04)
{
// Mémorise le pointeur d'instance.
@@ -46,13 +47,13 @@ Motor::Motor (void)
rc.get ("scale", s_) ||
rc.get ("speedscale", vs_) ||
rc.get ("accelscale", as_) ||
+ rc.get ("brakedistance", brakeDistance_) ||
rc.get ("maxspeed", maxSpeed_) ||
rc.get ("minspeed", minSpeed_)
))
rc.noId ();
}
asserv_.reset ();
- asserv_.setPosAsserv ();
}
/// Destructeur.
@@ -62,7 +63,7 @@ Motor::~Motor (void)
delete movement_;
}
-/// Appelée lors d'une mise à jour des compteurs.
+/// Appelée lors d'une mise à jour des compteurs (unit).
void
Motor::updateCounter (int l, int r)
{
@@ -125,16 +126,16 @@ Motor::waitStopped (void)
void
Motor::speed (double l, double r)
{
- int vL = (int) ((vs_ > 0 ? l : -l) * maxSpeed_);
- int vR = (int) ((vs_ > 0 ? r : -r) * maxSpeed_);
+ int vL = (int) ((vs_ > 0 ? l : -l) * maxSpeed_ * 0.5);
+ int vR = (int) ((vs_ > 0 ? r : -r) * maxSpeed_ * 0.5);
// Teste le dépassement de vitesse minimale.
while ((l != 0.0 || r != 0.0) && vL > -minSpeed_ && vL < minSpeed_ && vR >
-minSpeed_ && vR < minSpeed_)
{
l *= 1.5;
r *= 1.5;
- vL = (int) ((vs_ > 0 ? l : -l) * maxSpeed_);
- vR = (int) ((vs_ > 0 ? r : -r) * maxSpeed_);
+ vL = (int) ((vs_ > 0 ? l : -l) * maxSpeed_ * 0.5);
+ vR = (int) ((vs_ > 0 ? r : -r) * maxSpeed_ * 0.5);
}
// Teste le dépassement de vitesse maximal.
if (vL > maxSpeed_)
@@ -163,11 +164,15 @@ Motor::speed (double l, double r)
asserv_.speed (vL, vR);
}
-/// Va vers un point, renvois faux si atteind.
-bool
-Motor::goTo (double x, double y, double eps/*5.0*/)
+/// Calcule la vitesse en ligne droit afin de pouvoir freiner au bout
+/// d'une distance (mm).
+double
+Motor::computeSpeed (double dist) const
{
- return false;
+ if (dist > brakeDistance_)
+ return 1.0;
+ else
+ return dist / brakeDistance_;
}
/// Va vers un point, en formant un arc de cercle, renvois faux si atteind.