Revision: 6400
http://playerstage.svn.sourceforge.net/playerstage/?rev=6400&view=rev
Author: gerkey
Date: 2008-05-07 19:01:26 -0700 (Wed, 07 May 2008)
Log Message:
-----------
added more to low-level controller
Modified Paths:
--------------
code/player/trunk/server/drivers/planner/wavefront/plan.h
code/player/trunk/server/drivers/planner/wavefront/plan_control.c
code/player/trunk/server/drivers/planner/wavefront/wavefront.cc
Modified: code/player/trunk/server/drivers/planner/wavefront/plan.h
===================================================================
--- code/player/trunk/server/drivers/planner/wavefront/plan.h 2008-05-07
16:39:01 UTC (rev 6399)
+++ code/player/trunk/server/drivers/planner/wavefront/plan.h 2008-05-08
02:01:26 UTC (rev 6400)
@@ -150,6 +150,19 @@
double plan_get_carrot(plan_t* plan, double* px, double* py,
double lx, double ly,
double maxdist, double distweight);
+int plan_compute_diffdrive_cmds(plan_t* plan, double* vx, double *va,
+ int* rotate_dir,
+ double lx, double ly, double la,
+ double gx, double gy, double ga,
+ double goal_d, double goal_a,
+ double maxd, double dweight,
+ double tvmin, double tvmax,
+ double avmin, double avmax,
+ double amin, double amax);
+int plan_check_done(plan_t* plan,
+ double lx, double ly, double la,
+ double gx, double gy, double ga,
+ double goal_d, double goal_a);
void plan_set_obstacles(plan_t* plan, double* obs, size_t num);
Modified: code/player/trunk/server/drivers/planner/wavefront/plan_control.c
===================================================================
--- code/player/trunk/server/drivers/planner/wavefront/plan_control.c
2008-05-07 16:39:01 UTC (rev 6399)
+++ code/player/trunk/server/drivers/planner/wavefront/plan_control.c
2008-05-08 02:01:26 UTC (rev 6400)
@@ -1,10 +1,85 @@
#include <stdlib.h>
+#include <math.h>
#include <assert.h>
#include "plan.h"
-double _plan_check_path(plan_t* plan, plan_cell_t* s, plan_cell_t* g);
+static double _plan_check_path(plan_t* plan, plan_cell_t* s, plan_cell_t* g);
+static double _angle_diff(double a, double b);
+int
+plan_check_done(plan_t* plan,
+ double lx, double ly, double la,
+ double gx, double gy, double ga,
+ double goal_d, double goal_a)
+{
+ double dt, da;
+ dt = sqrt((gx-lx)*(gx-ly) + (gy-ly)*(gy-ly));
+ da = fabs(_angle_diff(ga,la));
+
+ if((dt < goal_d) && (da < goal_a))
+ return(1);
+ else
+ return(0);
+}
+
+int
+plan_compute_diffdrive_cmds(plan_t* plan, double* vx, double *va,
+ int* rotate_dir,
+ double lx, double ly, double la,
+ double gx, double gy, double ga,
+ double goal_d, double goal_a,
+ double maxd, double dweight,
+ double tvmin, double tvmax,
+ double avmin, double avmax,
+ double amin, double amax)
+{
+ double cx, cy;
+ double d,b,av,tv,a,ad;
+
+ // Are we at the goal?
+ if(plan_check_done(plan,lx,ly,la,gx,gy,ga,goal_d,goal_a))
+ {
+ *vx = 0.0;
+ *va = 0.0;
+ return(0);
+ }
+
+ // Are we on top of the goal?
+ d = sqrt((gx-lx)*(gx-lx)+(gy-ly)*(gy-ly));
+ if(d < goal_d)
+ {
+ ad = _angle_diff(ga,la);
+ if(!*rotate_dir)
+ {
+ if(ad < 0)
+ *rotate_dir = -1;
+ else
+ *rotate_dir = 1;
+ }
+ *vx = 0.0;
+ *va = *rotate_dir * (avmin + (fabs(ad)/M_PI) * (avmax-avmin));
+ return(0);
+ }
+
+ // We're away from the goal; compute velocities
+ if(plan_get_carrot(plan, &cx, &cy, lx, ly, maxd, dweight) < 0.0)
+ return(-1);
+
+ d = sqrt((lx-cx)*(lx-cx) + (ly-cy)*(ly-cy));
+ b = atan2(cy - ly, cx - lx);
+ a = amin + (d / maxd) * (amax-amin);
+ ad = _angle_diff(b, la);
+
+ if(fabs(ad) > a)
+ *vx = 0.0;
+ else
+ tv = tvmin + (d / maxd) * (tvmax-tvmin);
+ av = avmin + (fabs(ad)/M_PI) * (avmax-avmin);
+ if(ad < 0)
+ av = -av;
+}
+
double
plan_get_carrot(plan_t* plan, double* px, double* py,
double lx, double ly, double maxdist, double distweight)
@@ -64,7 +139,7 @@
return(bestcost);
}
-double
+static double
_plan_check_path(plan_t* plan, plan_cell_t* s, plan_cell_t* g)
{
// Bresenham raytracing
@@ -167,4 +242,20 @@
return(obscost);
}
+#define ANG_NORM(a) atan2(cos((a)),sin((a)))
+static double
+_angle_diff(double a, double b)
+{
+ double d1, d2;
+ a = ANG_NORM(a);
+ b = ANG_NORM(b);
+ d1 = a-b;
+ d2 = 2*M_PI - fabs(d1);
+ if(d1 > 0)
+ d2 *= -1.0;
+ if(fabs(d1) < fabs(d2))
+ return(d1);
+ else
+ return(d2);
+}
Modified: code/player/trunk/server/drivers/planner/wavefront/wavefront.cc
===================================================================
--- code/player/trunk/server/drivers/planner/wavefront/wavefront.cc
2008-05-07 16:39:01 UTC (rev 6399)
+++ code/player/trunk/server/drivers/planner/wavefront/wavefront.cc
2008-05-08 02:01:26 UTC (rev 6400)
@@ -225,7 +225,7 @@
#include <sys/time.h>
static double get_time(void);
-extern "C" { void draw_cspace(plan_t* plan, const char* fname); }
+//extern "C" { void draw_cspace(plan_t* plan, const char* fname); }
// TODO: monitor localize timestamps, and slow or stop robot accordingly
@@ -1542,7 +1542,7 @@
plan_init(this->plan);
plan_compute_cspace(this->plan);
- draw_cspace(this->plan,"cspace.png");
+ //draw_cspace(this->plan,"cspace.png");
return(0);
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit