summaryrefslogtreecommitdiff
path: root/2004/i
diff options
context:
space:
mode:
authorschodet2005-03-13 19:43:14 +0000
committerschodet2005-03-13 19:43:14 +0000
commita97cc79b734a1070a2e9977c52dec960eeb2d22c (patch)
tree81020b6b661e788b33053fb792c0effdd9f1db84 /2004/i
parenta993f4f6e06695b1c4b75f8cf9f6290f9b7b3169 (diff)
Automate complet.
Diffstat (limited to '2004/i')
-rw-r--r--2004/i/nono/src/ai/ai.cc126
-rw-r--r--2004/i/nono/src/ai/ai.h14
2 files changed, 122 insertions, 18 deletions
diff --git a/2004/i/nono/src/ai/ai.cc b/2004/i/nono/src/ai/ai.cc
index 5531805..86f416f 100644
--- a/2004/i/nono/src/ai/ai.cc
+++ b/2004/i/nono/src/ai/ai.cc
@@ -32,11 +32,11 @@
/// Constructeur.
Ai::Ai (void)
- : ana_ (gspp_),
+ : tracker_ (motor_.getTracker ()),
+ ana_ (gspp_),
ga_ (motor_.getAsserv ()),
gc_ (ga_, gspp_, ga_.getNbIo ()),
gp_ (gc_),
- v4l_ ("/dev/video", ImageLoader::yuv),
lastCapture_ (0),
front_ (135), bigFront_ (182), width_ (260), rear_ (135),
roulOn_ (false), roulRev_ (false)
@@ -58,7 +58,6 @@ Ai::init (void)
benneUp (false);
rouleau (false, false);
motor_.go ();
- //v4l_.calibrate ();
}
/// Arrète le robot.
@@ -71,7 +70,33 @@ Ai::stop (void)
/// Lance le robot.
void
-Ai::run (void)
+Ai::run (int strat)
+{
+ switch (strat)
+ {
+ case 0:
+ default:
+ run0 ();
+ break;
+ case 1:
+ run1 ();
+ break;
+ }
+}
+
+/// Mises à jour périodiques.
+void
+Ai::update (void)
+{
+ // Mise à jour moteur.
+ motor_.waitOk ();
+ // Mise à jour capteurs.
+ gspp_.update ();
+}
+
+/// Lance le robot.
+void
+Ai::run0 (void)
{
try
{
@@ -117,16 +142,54 @@ Ai::run (void)
}
}
-/// Mises à jour périodiques.
void
-Ai::update (void)
+Ai::run1 (void)
{
- // Mise à jour moteur.
- motor_.waitOk ();
- // Mise à jour capteurs.
- gspp_.update ();
- // Mise à jour camera.
- if (lastCapture_ + captureInterval_ < Date::getInstance ().start ())
+ try
+ {
+ waitJack (false);
+ rouleau (true, false);
+ wait (500);
+ rouleau (false, false);
+ waitJack (true);
+ Date::getInstance ().startRound ();
+ rouleau (true, false);
+ int noball = 0;
+ while (1)
+ {
+ if (trackBall ())
+ {
+ basic (0.5, 130);
+ double butX, butY, cY;
+ butX = 8 * 300;
+ cY = tracker_.getY ();
+ if (cY > 1050)
+ butY = 5 * 300 + 200;
+ else
+ butY = 1 * 300 + 100;
+ goTo (butX, butY);
+ benneUp (true);
+ recaleX (9 * 300 - front_, 0);
+ decharge (1500);
+ basic (-0.5, 150);
+ benneUp (false);
+ rotation (M_PI);
+ }
+ else
+ {
+ if (noball++ < 8)
+ {
+ rotation (tracker_.getAngle () + M_PI / 4);
+ }
+ else
+ {
+ noball = 0;
+ goTo (1350, 1050);
+ }
+ }
+ }
+ }
+ catch (FinDeMatch &e)
{
}
}
@@ -161,7 +224,8 @@ Ai::updateWait (int t)
void
Ai::benneUp (bool f)
{
- gspp_.moveTo (1, f ? 5 : 57);
+ gspp_.moveTo (1, !f ? 5 : 57);
+ updateWait (f ? 1000 : 1000);
}
/// Fait tourner le rouleau.
@@ -229,6 +293,40 @@ void
Ai::recaleX (double x, double a)
{
recale ();
+ tracker_.adjustX (x);
+ tracker_.adjustAngle (a);
+}
+
+/// Track une balle, renvois true en cas de succés.
+bool
+Ai::trackBall (void)
+{
+ double x, y;
+ ovision_.TakeShoot ();
+ update ();
+ ovision_.Update ();
+ update ();
+ if (!ovision_.GetBall (x, y))
+ return false;
+ GotoTracker *gt = new GotoTracker ();
+ Movement *m = new MovementGoto (gt);
+ motor_.addMovement (m);
+ do
+ {
+std::cout << "track ball " << x << ' ' << y << std::endl;
+ gt->setTracked (true, y, -x);
+ ovision_.GetVideo4Linux ().wait (0);
+ updateWait (captureInterval_);
+ // Mise à jour camera.
+ ovision_.TakeShoot ();
+ update ();
+ ovision_.Update ();
+ update ();
+ } while (ovision_.GetBall (x, y));
+std::cout << "track ball stop" << std::endl;
+ gt->setTracked (false, 0, 0);
+ updateToEnd ();
+ return true;
}
/// Mouvement basic.
@@ -263,6 +361,6 @@ main (int argc, char **argv)
{
Ai qdai_;
qdai_.init ();
- qdai_.run ();
+ qdai_.run (1);
qdai_.stop ();
}
diff --git a/2004/i/nono/src/ai/ai.h b/2004/i/nono/src/ai/ai.h
index 0cacf23..8753883 100644
--- a/2004/i/nono/src/ai/ai.h
+++ b/2004/i/nono/src/ai/ai.h
@@ -30,7 +30,7 @@
#include "io/gpio_concat.h"
#include "io/gpio_servo_pp.h"
#include "io/gpio_param.h"
-#include "video4linux/video4linux.h"
+#include "ovision/ovision.h"
/// Intelligence (heu...) artificielle.
class Ai
@@ -39,14 +39,15 @@ class Ai
{
};
Motor motor_;
+ Tracker &tracker_;
GpioServoPp gspp_;
AnalogServoPp ana_;
GpioAsserv ga_;
GpioConcat gc_;
GpioParam gp_;
- Video4Linux v4l_;
+ OVision ovision_;
static const int roundDuration_ = 90000;
- static const int captureInterval_ = 500;
+ static const int captureInterval_ = 200;
int lastCapture_;
double front_, bigFront_, width_, rear_;
int gpioJack_;
@@ -65,7 +66,7 @@ class Ai
/// Arrète le robot.
void stop (void);
/// Lance le robot.
- void run (void);
+ void run (int strat);
/// Mises à jour périodiques.
void update (void);
/// Mises à jour jusqu'à fin du mouvement en cours.
@@ -73,6 +74,9 @@ class Ai
/// Mises à jour jusqu'à timeout.
void updateWait (int t);
protected:
+ /// Lance le robot.
+ void run0 (void);
+ void run1 (void);
/// Lève (true) ou baisse (false) la benne.
void benneUp (bool f);
/// Fait tourner le rouleau.
@@ -87,6 +91,8 @@ class Ai
void recale (void);
/// Recale et ajuste en X contre une bordure.
void recaleX (double x, double a);
+ /// Track une balle, renvois true en cas de succés.
+ bool trackBall (void);
/// Mouvement basic.
void basic (double v, double d);
/// Rotation.