Commit from zer0 on branch b_zer0 (2008-04-06 19:33 CEST)
=================================
fix some bugs in trajectory, pwm, position_manager
aversive config/Configure.help
1.13.4.14
aversive config/config.in
1.42.4.19
aversive config/prog_fuses.sh
1.3.4.5
aversive mk/aversive_project.mk
1.32.4.13
aversive
modules/devices/robot/blocking_detection_manager/blocking_detection_manager.c
1.1.2.4
aversive modules/devices/robot/position_manager/position_manager.c
1.6.4.4
aversive modules/devices/robot/robot_system/robot_system.c
1.6.4.6
aversive modules/devices/robot/robot_system/robot_system.h
1.5.4.3
aversive modules/devices/robot/trajectory_manager/trajectory_manager.c
1.4.4.11
aversive modules/hardware/pwm/pwm.c
1.8.4.8
aversive modules/hardware/pwm/pwm.h
1.7.4.7
==============================
aversive/config/Configure.help (1.13.4.13 -> 1.13.4.14)
==============================
@@ -216,6 +216,10 @@
wheels. It provides a virtual angle/distance PWM and a virtual
angle/distance encoder.
+CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
+ If the robot has external and motor encoder, you can use both
+ by defining this option.
+
CONFIG_MODULE_POSITION_MANAGER
This module processes the position of the robot, depending of the
value returned by the associated robot system, and some physical
=========================
aversive/config/config.in (1.42.4.18 -> 1.42.4.19)
=========================
@@ -318,6 +318,9 @@
dep_bool 'Robot System' CONFIG_MODULE_ROBOT_SYSTEM \
$CONFIG_MODULE_FIXED_POINT
+dep_bool ' |-- Allow motor and external encoders'
CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT \
+ $CONFIG_MODULE_ROBOT_SYSTEM
+
#### POSITION_MANAGER
dep_bool 'Position manager' CONFIG_MODULE_POSITION_MANAGER \
$CONFIG_MODULE_ROBOT_SYSTEM
=============================
aversive/config/prog_fuses.sh (1.3.4.4 -> 1.3.4.5)
=============================
@@ -140,7 +140,7 @@
do
rm -f $f 2> /dev/null
echo 0x00 > ${f}_new
- ${AVRDUDE} -p ${MCU} -P `echo ${AVRDUDE_PORT} | sed 's,",,g'` -c
${AVRDUDE_PROGRAMMER} -U ${f}:r:${f}:i ${DELAY}
+ ${AVRDUDE} ${DELAY} -p ${MCU} -P `echo ${AVRDUDE_PORT} | sed 's,",,g'` -c
${AVRDUDE_PROGRAMMER} -U ${f}:r:${f}:i
if [ ! -f $f ]; then
CANNOT_READ=1
fi
===============================
aversive/mk/aversive_project.mk (1.32.4.12 -> 1.32.4.13)
===============================
@@ -111,7 +111,7 @@
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).$(FORMAT_EXTENSION)
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
-AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -q
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
ifneq ($(AVRDUDE_DELAY),)
AVRDUDE_FLAGS += -i $(AVRDUDE_DELAY)
======================================================================================
aversive/modules/devices/robot/blocking_detection_manager/blocking_detection_manager.c
(1.1.2.3 -> 1.1.2.4)
======================================================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: blocking_detection_manager.c,v 1.1.2.3 2008-03-30 22:00:56
zer0 Exp $
+ * Revision : $Id: blocking_detection_manager.c,v 1.1.2.4 2008-04-06 17:33:57
zer0 Exp $
*
* Olivier MATZ <[EMAIL PROTECTED]>
*/
@@ -74,7 +74,7 @@
i = bd->k1 * cmd - bd->k2 * speed;
if (ABS(i) > bd->i_thres) {
if (bd->cpt == bd->cpt_thres - 1)
- DEBUG(E_BLOCKING_DETECTION_MANAGER,
+ WARNING(E_BLOCKING_DETECTION_MANAGER,
"BLOCKING cmd=%ld, speed=%ld i=%ld",
cmd, speed, i);
if(bd->cpt < bd->cpt_thres)
==================================================================
aversive/modules/devices/robot/position_manager/position_manager.c (1.6.4.3 ->
1.6.4.4)
==================================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: position_manager.c,v 1.6.4.3 2008-03-31 16:51:27 zer0 Exp $
+ * Revision : $Id: position_manager.c,v 1.6.4.4 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -89,6 +89,7 @@
IRQ_UNLOCK(flags);
}
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
void position_use_mot(struct robot_position * pos)
{
struct rs_polar encoders;
@@ -101,6 +102,9 @@
pos->use_ext = 0;
IRQ_UNLOCK(flags);
}
+#endif
+
+extern int8_t toto;
/**
* Process the absolute position (x,y,a) depending on the delta on
@@ -125,6 +129,7 @@
IRQ_UNLOCK(flags);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
if(pos->use_ext) {
encoders.distance = rs_get_ext_distance(rs);
encoders.angle = rs_get_ext_angle(rs);
@@ -133,6 +138,10 @@
encoders.distance = rs_get_mot_distance(rs);
encoders.angle = rs_get_mot_angle(rs);
}
+#else
+ encoders.distance = rs_get_ext_distance(rs);
+ encoders.angle = rs_get_ext_angle(rs);
+#endif
/* process difference between 2 measures.
* No lock for prev_encoders since we are the only one to use
@@ -149,23 +158,29 @@
y = pos->pos_d.y;
IRQ_UNLOCK(flags);
-
- if (delta.angle == 0) {
- /* we go straight */
- x = x + cos(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
- y = y + sin(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
- }
- else {
- /* r the radius of the circle arc */
- r = (double)delta.distance * pos->phys.track_cm / (double)
delta.angle;
- arc_angle = (double) delta.angle / (pos->phys.track_cm *
pos->phys.distance_imp_per_cm);
-
- x += r * (-sin(a) + sin(a+arc_angle));
- y += r * (cos(a) - cos(a+arc_angle));
- a += arc_angle;
+ if (toto) {
+ a += 2 * (double) delta.angle / (pos->phys.track_cm *
pos->phys.distance_imp_per_cm);
+ x += cos(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
+ y += sin(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
+ } else {
+
+ if (delta.angle == 0) {
+ /* we go straight */
+ x = x + cos(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
+ y = y + sin(a) * ((double) delta.distance /
(pos->phys.distance_imp_per_cm)) ;
+ }
+ else {
+ /* r the radius of the circle arc */
+ r = (double)delta.distance * pos->phys.track_cm /
((double) delta.angle * 2);
+ arc_angle = 2 * (double) delta.angle /
(pos->phys.track_cm * pos->phys.distance_imp_per_cm);
+
+ x += r * (-sin(a) + sin(a+arc_angle));
+ y += r * (cos(a) - cos(a+arc_angle));
+ a += arc_angle;
+ }
}
- if(a < -M_PI)
+ if (a < -M_PI)
a += (M_PI*2);
else if (a > (M_PI))
a -= (M_PI*2);
==========================================================
aversive/modules/devices/robot/robot_system/robot_system.c (1.6.4.5 -> 1.6.4.6)
==========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: robot_system.c,v 1.6.4.5 2007-12-31 16:25:01 zer0 Exp $
+ * Revision : $Id: robot_system.c,v 1.6.4.6 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -90,10 +90,13 @@
IRQ_LOCK(flags);
memset(rs, 0, sizeof(struct robot_system));
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
rs_set_ratio(rs, 1.0);
+#endif
IRQ_UNLOCK(flags);
}
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/** define ratio between mot and ext track. (track_mot / track_ext) */
void rs_set_ratio(struct robot_system * rs, double ratio)
{
@@ -103,6 +106,7 @@
rs->ratio_mot_ext = f64_from_double(ratio);
IRQ_UNLOCK(flags);
}
+#endif
/** define left PWM function and param */
void rs_set_left_pwm(struct robot_system * rs, void (*left_pwm)(void *,
int32_t), void *left_pwm_param)
@@ -126,6 +130,7 @@
IRQ_UNLOCK(flags);
}
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/** define left motor encoder function and param */
void rs_set_left_mot_encoder(struct robot_system * rs, int32_t
(*left_mot_encoder)(void *),
void *left_mot_encoder_param, double gain)
@@ -151,6 +156,7 @@
rs->right_mot_gain = f64_from_double(gain);
IRQ_UNLOCK(flags);
}
+#endif
/** define left external encoder function and param */
void rs_set_left_ext_encoder(struct robot_system * rs, int32_t
(*left_ext_encoder)(void *),
@@ -280,6 +286,7 @@
return distance;
}
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
int32_t rs_get_mot_angle(void * data)
{
struct robot_system * rs = data;
@@ -303,6 +310,7 @@
IRQ_UNLOCK(flags);
return distance;
}
+#endif
int32_t rs_get_ext_left(void * data)
{
@@ -328,6 +336,7 @@
return right;
}
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
int32_t rs_get_mot_left(void * data)
{
struct robot_system * rs = data;
@@ -351,6 +360,7 @@
IRQ_UNLOCK(flags);
return right;
}
+#endif
void rs_set_flags(struct robot_system * rs, uint8_t flags)
{
@@ -370,8 +380,12 @@
void rs_update(void * data)
{
struct robot_system * rs = data;
- struct rs_wheels wext, wmot;
- struct rs_polar pext, pmot;
+ struct rs_wheels wext;
+ struct rs_polar pext;
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
+ struct rs_wheels wmot;
+ struct rs_polar pmot;
+#endif
int32_t delta_angle, delta_distance;
uint8_t flags;
@@ -379,36 +393,49 @@
wext.left = safe_getencoder(rs->left_ext_encoder,
rs->left_ext_encoder_param);
wext.right = safe_getencoder(rs->right_ext_encoder,
rs->right_ext_encoder_param);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
wmot.left = safe_getencoder(rs->left_mot_encoder,
rs->left_mot_encoder_param);
wmot.right = safe_getencoder(rs->right_mot_encoder,
rs->right_mot_encoder_param);
+#endif
- DEBUG(E_ROBOT_SYSTEM, "ENCODERS : %ld %ld %ld %ld", wmot.left,
wmot.right, wext.left, wext.right);
-
/* apply gains to each wheel */
- wext.left = f64_msb_mul(f64_from_lsb(wext.left), rs->left_ext_gain);
- wext.right = f64_msb_mul(f64_from_lsb(wext.right), rs->right_ext_gain);
+ if( ! (rs->flags & RS_IGNORE_EXT_GAIN ) ) {
+ wext.left = f64_msb_mul(f64_from_lsb(wext.left),
rs->left_ext_gain);
+ wext.right = f64_msb_mul(f64_from_lsb(wext.right),
rs->right_ext_gain);
+ }
- wmot.left = f64_msb_mul(f64_from_lsb(wmot.left), rs->left_mot_gain);
- wmot.right = f64_msb_mul(f64_from_lsb(wmot.right), rs->right_mot_gain);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
+ if( ! (rs->flags & RS_IGNORE_MOT_GAIN ) ) {
+ wmot.left = f64_msb_mul(f64_from_lsb(wmot.left),
rs->left_mot_gain);
+ wmot.right = f64_msb_mul(f64_from_lsb(wmot.right),
rs->right_mot_gain);
+ }
+#endif
rs_get_polar_from_wheels(&pext, &wext);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
rs_get_polar_from_wheels(&pmot, &wmot);
/* apply ratio to polar and reupdate wheels for ext coders */
pext.angle = f64_msb_mul(f64_from_lsb(pext.angle), rs->ratio_mot_ext);
+#endif
rs_get_wheels_from_polar(&wext, &pext);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/* update from external encoders */
if( rs->flags & RS_USE_EXT ) {
- delta_angle = pext.angle - rs->pext_prev.angle;
+ delta_angle = pext.angle - rs->pext_prev.angle;
delta_distance = pext.distance - rs->pext_prev.distance;
}
/* update from motor encoders */
else {
- delta_angle = pmot.angle - rs->pmot_prev.angle;
+ delta_angle = pmot.angle - rs->pmot_prev.angle;
delta_distance = pmot.distance - rs->pmot_prev.distance;
}
+#else
+ delta_angle = pext.angle - rs->pext_prev.angle;
+ delta_distance = pext.distance - rs->pext_prev.distance;
+#endif
IRQ_LOCK(flags);
rs->virtual_encoders.angle += delta_angle;
@@ -419,11 +446,13 @@
IRQ_LOCK(flags);
rs->pext_prev = pext;
- rs->pmot_prev = pmot;
+ rs->wext_prev = wext;
IRQ_UNLOCK(flags);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
IRQ_LOCK(flags);
- rs->wext_prev = wext;
+ rs->pmot_prev = pmot;
rs->wmot_prev = wmot;
IRQ_UNLOCK(flags);
+#endif
}
==========================================================
aversive/modules/devices/robot/robot_system/robot_system.h (1.5.4.2 -> 1.5.4.3)
==========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: robot_system.h,v 1.5.4.2 2007-05-23 17:18:14 zer0 Exp $
+ * Revision : $Id: robot_system.h,v 1.5.4.3 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -36,46 +36,45 @@
/* flags */
#define RS_USE_EXT 1
+#define RS_IGNORE_EXT_GAIN 2
+#define RS_IGNORE_MOT_GAIN 4
struct robot_system
{
uint8_t flags;
- struct rs_polar pmot_prev;
- struct rs_polar pext_prev;
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
+ struct rs_polar pmot_prev;
struct rs_wheels wmot_prev;
- struct rs_wheels wext_prev;
- struct rs_polar virtual_pwm;
- struct rs_polar virtual_encoders;
f64 ratio_mot_ext;
- /* blocking */
- uint16_t nb_blocking;
- uint16_t nb_blocking_max;
- uint16_t nb_blocking_detect;
- int32_t blocking_min_speed;
- double blocking_ext_mot_ratio;
-
/* Motor encoders */
int32_t (*left_mot_encoder)(void *);
void* left_mot_encoder_param;
- f64 left_ext_gain;
+ f64 left_mot_gain;
int32_t (*right_mot_encoder)(void *);
void* right_mot_encoder_param;
- f64 right_ext_gain;
-
+ f64 right_mot_gain;
+#endif
+
+ struct rs_polar virtual_pwm;
+ struct rs_polar virtual_encoders;
+
+ struct rs_polar pext_prev;
+ struct rs_wheels wext_prev;
+
/* External encoders */
int32_t (*left_ext_encoder)(void *);
void* left_ext_encoder_param;
- f64 left_mot_gain;
+ f64 left_ext_gain;
int32_t (*right_ext_encoder)(void *);
void* right_ext_encoder_param;
- f64 right_mot_gain;
-
+ f64 right_ext_gain;
+
/* PWM */
void (*left_pwm)(void *, int32_t);
void *left_pwm_param;
@@ -88,24 +87,10 @@
/**** ACCESSORS */
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/** define ratio between mot and ext track. (track_mot / track_ext) */
void rs_set_ratio(struct robot_system * rs, double ratio);
-
-/** define blocking detection params */
-void rs_set_blocking(struct robot_system * rs,
- uint16_t nb_blocking_max,
- uint16_t nb_blocking_detect,
- int32_t blocking_min_speed,
- double blocking_ext_mot_ratio);
-
-/** reset blocking counter */
-void rs_reset_blocking(struct robot_system * rs);
-
-/** return blocking counter */
-uint16_t rs_get_blocking(struct robot_system * rs);
-
-/** true if robot is blocked */
-uint8_t rs_is_blocked(struct robot_system * rs);
+#endif
/** define left PWM function and param */
void rs_set_left_pwm(struct robot_system * rs, void (*left_pwm)(void *,
int32_t), void *left_pwm_param);
@@ -113,6 +98,7 @@
/** define right PWM function and param */
void rs_set_right_pwm(struct robot_system * rs, void (*right_pwm)(void *,
int32_t), void *right_pwm_param);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/** define left motor encoder function and param */
void rs_set_left_mot_encoder(struct robot_system * rs, int32_t
(*left_mot_encoder)(void *),
void *left_mot_encoder_param, double gain);
@@ -120,6 +106,7 @@
/** define right motor encoder function and param */
void rs_set_right_mot_encoder(struct robot_system * rs, int32_t
(*right_mot_encoder)(void *),
void *right_mot_encoder_param, double gain);
+#endif
/** define left external encoder function and param */
void rs_set_left_ext_encoder(struct robot_system * rs, int32_t
(*left_ext_encoder)(void *),
@@ -163,6 +150,7 @@
*/
int32_t rs_get_ext_distance(void * rs);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
/**
* get the angle according to mot encoders value.
*/
@@ -172,12 +160,15 @@
* get the distance according to mot encoders value.
*/
int32_t rs_get_mot_distance(void * rs);
+#endif
/* same for left/right */
int32_t rs_get_ext_left(void * rs);
int32_t rs_get_ext_right(void * rs);
+#ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
int32_t rs_get_mot_left(void * rs);
int32_t rs_get_mot_right(void * rs);
+#endif
/**
======================================================================
aversive/modules/devices/robot/trajectory_manager/trajectory_manager.c
(1.4.4.10 -> 1.4.4.11)
======================================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: trajectory_manager.c,v 1.4.4.10 2008-04-01 22:45:09 zer0
Exp $
+ * Revision : $Id: trajectory_manager.c,v 1.4.4.11 2008-04-06 17:33:57 zer0
Exp $
*
*/
@@ -243,7 +243,7 @@
}
else {
a_consign = (int32_t)(a_rad *
(traj->position->phys.distance_imp_per_cm) *
- (traj->position->phys.track_cm) /
2.0);
+ (traj->position->phys.track_cm) /
2);
traj->target.pol.angle = a_consign;
}
cs_set_consign(traj->csm_angle, a_consign +
rs_get_angle(traj->robot));
@@ -532,10 +532,10 @@
d_consign += rs_get_distance(traj->robot);
/* angle consign */
- /* XXX here we specify 1.1 instead of 1.0 to avoid oscillations
*/
+ /* XXX here we specify 2.2 instead of 2.0 to avoid oscillations
*/
a_consign = (int32_t)(v2pol_target.theta *
-
(traj->position->phys.distance_imp_per_cm)*
- (traj->position->phys.track_cm) / 1.1);
+
(traj->position->phys.distance_imp_per_cm) *
+ (traj->position->phys.track_cm) / 2.2);
a_consign += rs_get_angle(traj->robot);
break;
@@ -591,13 +591,13 @@
/* step 3 : send the processed commands to cs */
- DEBUG(E_TRAJECTORY, "EVENT XY cart=(%f,%f) pol=(%f,%f)",
- v2cart_pos.x, v2cart_pos.y, v2pol_target.r, v2pol_target.theta);
+ DEBUG(E_TRAJECTORY, "EVENT XY cur=(%f,%f,%f) cart=(%f,%f) pol=(%f,%f)",
+ x, y, a, v2cart_pos.x, v2cart_pos.y, v2pol_target.r,
v2pol_target.theta);
- DEBUG(E_TRAJECTORY,"d_consign=%" PRIi32 ", d_speed=%" PRIi32 ", "
- "a_consign=%" PRIi32 ", a_speed=%" PRIi32,
- d_consign, get_quadramp_distance_speed(traj),
- a_consign, get_quadramp_angle_speed(traj));
+ DEBUG(E_TRAJECTORY,"d_cur=%" PRIi32 ", d_consign=%" PRIi32 ",
d_speed=%" PRIi32 ", "
+ "a_cur=%" PRIi32 ", a_consign=%" PRIi32 ", a_speed=%" PRIi32,
+ rs_get_distance(traj->robot), d_consign,
get_quadramp_distance_speed(traj),
+ rs_get_angle(traj->robot), a_consign,
get_quadramp_angle_speed(traj));
cs_set_consign(traj->csm_angle, a_consign);
cs_set_consign(traj->csm_distance, d_consign);
===================================
aversive/modules/hardware/pwm/pwm.c (1.8.4.7 -> 1.8.4.8)
===================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pwm.c,v 1.8.4.7 2007-11-15 11:15:37 zer0 Exp $
+ * Revision : $Id: pwm.c,v 1.8.4.8 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -286,7 +286,7 @@
pwm_invert_value(mode, value); \
} \
else { \
- pwm##n##_sign_reset(); \
+ pwm##n##_sign_reset(); \
} \
} \
else { \
===================================
aversive/modules/hardware/pwm/pwm.h (1.7.4.6 -> 1.7.4.7)
===================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pwm.h,v 1.7.4.6 2007-09-06 08:18:22 zer0 Exp $
+ * Revision : $Id: pwm.h,v 1.7.4.7 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -51,7 +51,7 @@
/** value to be used for limiting inputs */
#define PWM_MAX ((1<< PWM_SIGNIFICANT_BITS)-1)
-#define PWM_MIN (-(1<< PWM_SIGNIFICANT_BITS))
+#define PWM_MIN (-PWM_MAX)
/** global functions*/
Commit from zer0 (2008-04-06 19:33 CEST)
================
fix some bugs in trajectory, pwm, position_manager
aversive_projects microb2008/main/.config 1.15
aversive_projects microb2008/main/Makefile 1.6
aversive_projects microb2008/main/commands.c 1.22
aversive_projects microb2008/main/main.c 1.30
aversive_projects microb2008/main/main.h 1.18
aversive_projects microb2008/main/sensor.c 1.5
aversive_projects microb2008/main/strat.c 1.14
=========================================
aversive_projects/microb2008/main/.config (1.14 -> 1.15)
=========================================
@@ -147,6 +147,7 @@
# Robot specific modules
#
CONFIG_MODULE_ROBOT_SYSTEM=y
+# CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT is not set
CONFIG_MODULE_POSITION_MANAGER=y
CONFIG_MODULE_TRAJECTORY_MANAGER=y
CONFIG_MODULE_BLOCKING_DETECTION_MANAGER=y
==========================================
aversive_projects/microb2008/main/Makefile (1.5 -> 1.6)
==========================================
@@ -18,6 +18,8 @@
# care about how the name is spelled on its command-line.
ASRC =
+AVRDUDE_DELAY=5
+
########################################
-include .aversive_conf
============================================
aversive_projects/microb2008/main/commands.c (1.21 -> 1.22)
============================================
@@ -361,6 +361,73 @@
},
};
+/**********************************************************/
+/* rs_gains window configuration */
+
+/* this structure is filled when cmd_rs_gains is parsed successfully */
+struct cmd_rs_gains_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ float left;
+ float right;
+};
+
+/* function called when cmd_rs_gains is parsed successfully */
+static void cmd_rs_gains_parsed(void * parsed_result, void * data)
+{
+ struct cmd_rs_gains_result * res = parsed_result;
+
+ if (!strcmp_P(res->arg1, PSTR("set"))) {
+ rs_set_left_ext_encoder(&robot.rs, encoders_microb_get_value,
+ LEFT_ENCODER_EXT, res->left); // en
augmentant on tourne à gauche
+ rs_set_right_ext_encoder(&robot.rs, encoders_microb_get_value,
+ RIGHT_ENCODER_EXT, res->right); //en
augmentant on tourne à droite
+ }
+ printf_P(PSTR("rs_gains set "));
+ f64_print(robot.rs.left_ext_gain);
+ printf_P(PSTR(" "));
+ f64_print(robot.rs.right_ext_gain);
+ printf_P(PSTR("\r\n"));
+}
+
+prog_char str_rs_gains_arg0[] = "rs_gains";
+parse_pgm_token_string_t cmd_rs_gains_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_rs_gains_result, arg0, str_rs_gains_arg0);
+prog_char str_rs_gains_arg1[] = "set";
+parse_pgm_token_string_t cmd_rs_gains_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_rs_gains_result, arg1, str_rs_gains_arg1);
+parse_pgm_token_num_t cmd_rs_gains_l = TOKEN_NUM_INITIALIZER(struct
cmd_rs_gains_result, left, FLOAT);
+parse_pgm_token_num_t cmd_rs_gains_r = TOKEN_NUM_INITIALIZER(struct
cmd_rs_gains_result, right, FLOAT);
+
+prog_char help_rs_gains[] = "Set rs_gains (left, right)";
+parse_pgm_inst_t cmd_rs_gains = {
+ .f = cmd_rs_gains_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_rs_gains,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_rs_gains_arg0,
+ (prog_void *)&cmd_rs_gains_arg1,
+ (prog_void *)&cmd_rs_gains_l,
+ (prog_void *)&cmd_rs_gains_r,
+ NULL,
+ },
+};
+
+/* show */
+
+prog_char str_rs_gains_show_arg[] = "show";
+parse_pgm_token_string_t cmd_rs_gains_show_arg =
TOKEN_STRING_INITIALIZER(struct cmd_rs_gains_result, arg1,
str_rs_gains_show_arg);
+
+prog_char help_rs_gains_show[] = "Show rs_gains";
+parse_pgm_inst_t cmd_rs_gains_show = {
+ .f = cmd_rs_gains_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_rs_gains_show,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_rs_gains_arg0,
+ (prog_void *)&cmd_rs_gains_show_arg,
+ NULL,
+ },
+};
+
/**********************************************************/
/* Pt_Lists for testing traj */
@@ -926,7 +993,8 @@
static void cmd_goto_parsed(void * parsed_result, void * data)
{
struct cmd_goto_result * res = parsed_result;
-
+ uint8_t err;
+
interrupt_traj_reset();
if (!strcmp_P(res->arg1, PSTR("a_rel"))) {
trajectory_a_rel(&robot.traj, res->arg2);
@@ -962,8 +1030,9 @@
printf_P(PSTR("not implemented\r\n"));
//trajectory_goto_xya(&robot.traj, res->arg2, res->arg3,
res->arg4);
}
- wait_traj_end(0xFF);
- trajectory_stop(&robot.traj);
+ err = wait_traj_end(0xFF);
+ if (err != END_TRAJ && err != END_NEAR)
+ trajectory_stop(&robot.traj);
}
prog_char str_goto_arg0[] = "goto";
@@ -1057,22 +1126,16 @@
/* display encoders from robot_system left/right */
else if (!strcmp_P(res->arg1, PSTR("rs_lr"))) {
while(uart0_recv_nowait() == -1) {
- struct rs_wheels wext, wmot, wvir;
- struct rs_polar pext, pmot, pvir;
+ struct rs_wheels wext;
+ struct rs_polar pext;
pext.distance = rs_get_ext_distance(&robot.rs);
pext.angle = rs_get_ext_angle(&robot.rs);
- pmot.distance = rs_get_mot_distance(&robot.rs);
- pmot.angle = rs_get_mot_angle(&robot.rs);
- pvir.distance = rs_get_distance(&robot.rs);
- pvir.angle = rs_get_angle(&robot.rs);
rs_get_wheels_from_polar(&wext, &pext);
- rs_get_wheels_from_polar(&wmot, &pmot);
- rs_get_wheels_from_polar(&wvir, &pvir);
- printf_P(PSTR("ext l=% .8ld r=% .8ld | mot l=% .8ld r=%
.8ld | vir l=% .8ld r=% .8ld\r\n"),
- wext.left, wext.right, wmot.left, wmot.right,
wvir.left, wvir.right);
+ printf_P(PSTR("ext l=% .8ld r=% .8ld\r\n"),
+ wext.left, wext.right);
wait_ms(100);
}
}
@@ -1080,13 +1143,9 @@
/* display encoders from robot_system distance/angle */
else if (!strcmp_P(res->arg1, PSTR("rs_da"))) {
while(uart0_recv_nowait() == -1) {
- printf_P(PSTR("ext d=% .8ld a=% .8ld | mot d=% .8ld a=%
.8ld | vir d=% .8ld a=% .8ld\r\n"),
+ printf_P(PSTR("ext d=% .8ld a=% .8ld\r\n"),
rs_get_ext_distance(&robot.rs),
- rs_get_ext_angle(&robot.rs),
- rs_get_mot_distance(&robot.rs),
- rs_get_mot_angle(&robot.rs),
- rs_get_distance(&robot.rs),
- rs_get_angle(&robot.rs));
+ rs_get_ext_angle(&robot.rs));
}
}
}
@@ -1190,7 +1249,7 @@
static void auto_position(void)
{
- trajectory_set_speed(&robot.traj, 100, 100);
+ trajectory_set_speed(&robot.traj, 400, 400);
trajectory_d_rel(&robot.traj, -20);
wait_traj_end(END_TRAJ|END_BLOCKING);
@@ -1326,48 +1385,30 @@
/**********************************************************/
/* Test */
+int8_t toto = 0;
+int8_t modulo = 2;
+
/* this structure is filled when cmd_test is parsed successfully */
struct cmd_test_result {
fixed_string_t arg0;
+ int8_t arg1;
+ int8_t arg2;
};
/* function called when cmd_test is parsed successfully */
-static void cmd_test_parsed(void * parsed_result, void * data)
+static void cmd_test_parsed(void *parsed_result, void *data)
{
-#define MIN_SHOT_DIST 60
-#define MAX_SHOT_DIST 275
- double posx = position_get_x_double(&robot.pos);
- double posy = position_get_y_double(&robot.pos);
- uint16_t dist_to_container;
- double goal_angle_width;
-
- dist_to_container = distance_from_robot(GOAL_X, GOAL_Y);
-
- if (dist_to_container < MIN_SHOT_DIST) {
- printf("too close\n");
- return;
- }
+ struct cmd_test_result *res = parsed_result;
- if (dist_to_container > MAX_SHOT_DIST) {
- printf("too far\n");
- return;
- }
-
- goal_angle_width = atan2(GOAL_Y+GOAL_HALF_WIDTH - posy, GOAL_X - posx) -
- atan2(GOAL_Y-GOAL_HALF_WIDTH - posy, GOAL_X - posx);
- goal_angle_width = (180. / M_PI) * ABS(goal_angle_width);
-
- /* we want at least 10° */
- if (goal_angle_width < 10.) {
- printf("bad angle %2.2f\n", goal_angle_width);
- return;
- }
-
- printf("can shot\n");
+ toto = res->arg1;
+ modulo = res->arg2;
+ printf_P(PSTR("use_seg=%d, modulo=%d, %d\r\n"), toto, modulo,
res->arg2);
}
prog_char str_test_arg0[] = "test";
parse_pgm_token_string_t cmd_test_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_test_result, arg0, str_test_arg0);
+parse_pgm_token_num_t cmd_test_arg1 = TOKEN_NUM_INITIALIZER(struct
cmd_position_result, arg1, INT8);
+parse_pgm_token_num_t cmd_test_arg2 = TOKEN_NUM_INITIALIZER(struct
cmd_position_result, arg2, INT8);
prog_char help_test[] = "Test function";
parse_pgm_inst_t cmd_test = {
@@ -1376,6 +1417,8 @@
.help_str = help_test,
.tokens = { /* token list, NULL terminated */
(prog_void *)&cmd_test_arg0,
+ (prog_void *)&cmd_test_arg1,
+ (prog_void *)&cmd_test_arg2,
NULL,
},
};
@@ -1650,6 +1693,7 @@
{
struct cmd_cam_result *res = parsed_result;
int8_t n;
+ uint8_t err;
if (!strcmp_P(res->type, PSTR("init"))) {
cam_init();
@@ -1674,8 +1718,9 @@
trajectory_goto_d_a_rel(&robot.traj,
cam_ball_tab[0].distance,
cam_ball_tab[0].angle);
- wait_traj_end(0xFF);
- trajectory_stop(&robot.traj);
+ err = wait_traj_end(0xFF);
+ if (err != END_TRAJ && err != END_NEAR)
+ trajectory_stop(&robot.traj);
}
}
}
@@ -1706,42 +1751,46 @@
fixed_string_t name;
};
-void test_square(void)
+void test_square(uint8_t flags)
{
+ uint8_t i = 0;
position_set(&robot.pos, 0, 0, 0);
- while(uart0_recv_nowait() == -1) {
+ while(uart0_recv_nowait() == -1 && i<10) {
trajectory_goto_forward_xy_abs(&robot.traj, 0, 60);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 60, 60);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 60, 0);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 0, 0);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
+ i++;
}
}
-void test_hourglass(void)
+void test_hourglass(uint8_t flags)
{
+ uint8_t i = 0;
position_set(&robot.pos, 0, 0, 0);
- while(uart0_recv_nowait() == -1) {
+ while(uart0_recv_nowait() == -1 && i<10) {
trajectory_goto_forward_xy_abs(&robot.traj, 60, 60);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 0, 60);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 60, 0);
- wait_traj_end(0xFF);
+ wait_traj_end(flags);
trajectory_goto_forward_xy_abs(&robot.traj, 0, 0);
- wait_traj_end(0xFF);
- }
+ wait_traj_end(flags);
+ i++;
+ }
}
@@ -1759,16 +1808,22 @@
strat_eject_balls();
}
else if (!strcmp_P(res->name, PSTR("square"))) {
- test_square();
+ test_square(END_TRAJ|END_BLOCKING|END_INTR);
}
else if (!strcmp_P(res->name, PSTR("hourglass"))) {
- test_hourglass();
+ test_hourglass(END_TRAJ|END_BLOCKING|END_INTR);
+ }
+ else if (!strcmp_P(res->name, PSTR("square_near"))) {
+ test_square(0xFF);
+ }
+ else if (!strcmp_P(res->name, PSTR("hourglass_near"))) {
+ test_hourglass(0xFF);
}
}
prog_char str_substrat_arg0[] = "substrat";
parse_pgm_token_string_t cmd_substrat_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_substrat_result, arg0, str_substrat_arg0);
-prog_char str_substrat_name[] = "shot#eject#square#hourglass";
+prog_char str_substrat_name[] =
"shot#eject#square#hourglass#square_near#hourglass_near";
parse_pgm_token_string_t cmd_substrat_name = TOKEN_STRING_INITIALIZER(struct
cmd_substrat_result, name, str_substrat_name);
prog_char help_substrat[] = "Test sub-strats";
@@ -1992,6 +2047,61 @@
},
};
+
+/**********************************************************/
+/* Strat_Params */
+
+
+/* this structure is filled when cmd_strat_params is parsed successfully */
+struct cmd_strat_params_type_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ fixed_string_t arg2;
+};
+
+/* function called when cmd_strat_params is parsed successfully */
+static void cmd_strat_params_type_parsed(void * parsed_result, void * data)
+{
+ // struct cmd_strat_params_type_result *res = parsed_result;
+
+}
+
+prog_char str_strat_params_arg0[] = "strat_params";
+parse_pgm_token_string_t cmd_strat_params_arg0 =
TOKEN_STRING_INITIALIZER(struct cmd_strat_params_type_result, arg0,
str_strat_params_arg0);
+prog_char str_strat_params_arg1_type[] =
"h_disp#static_balls#col_v_disp#white_v_disp";
+parse_pgm_token_string_t cmd_strat_params_arg1_type =
TOKEN_STRING_INITIALIZER(struct cmd_strat_params_type_result, arg1,
str_strat_params_arg1_type);
+prog_char str_strat_params_arg2[] = "on#off";
+parse_pgm_token_string_t cmd_strat_params_arg2 =
TOKEN_STRING_INITIALIZER(struct cmd_strat_params_type_result, arg2,
str_strat_params_arg2);
+
+prog_char help_strat_params_type[] = "Set strat_params";
+parse_pgm_inst_t cmd_strat_params_type = {
+ .f = cmd_strat_params_type_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_strat_params_type,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_strat_params_arg0,
+ (prog_void *)&cmd_strat_params_arg1_type,
+ (prog_void *)&cmd_strat_params_arg2,
+ NULL,
+ },
+};
+
+prog_char str_strat_params_arg1_show[] = "show";
+parse_pgm_token_string_t cmd_strat_params_arg1_show =
TOKEN_STRING_INITIALIZER(struct cmd_strat_params_type_result, arg1,
str_strat_params_arg1_type);
+
+prog_char help_strat_params_show[] = "Show strat_params";
+parse_pgm_inst_t cmd_strat_params_show = {
+ .f = cmd_strat_params_type_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_strat_params_show,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_strat_params_arg0,
+ (prog_void *)&cmd_strat_params_arg1_show,
+ NULL,
+ },
+};
+
+
/**********************************************************/
/* Debug */
@@ -2636,6 +2746,8 @@
(parse_pgm_inst_t *)&cmd_log,
(parse_pgm_inst_t *)&cmd_log_show,
(parse_pgm_inst_t *)&cmd_log_type,
+ (parse_pgm_inst_t *)&cmd_strat_params_type,
+ (parse_pgm_inst_t *)&cmd_strat_params_show,
(parse_pgm_inst_t *)&cmd_debug,
(parse_pgm_inst_t *)&cmd_start,
(parse_pgm_inst_t *)&cmd_cam,
@@ -2654,6 +2766,8 @@
(parse_pgm_inst_t *)&cmd_pt_list_show,
(parse_pgm_inst_t *)&cmd_trajectory,
(parse_pgm_inst_t *)&cmd_trajectory_show,
+ (parse_pgm_inst_t *)&cmd_rs_gains,
+ (parse_pgm_inst_t *)&cmd_rs_gains_show,
(parse_pgm_inst_t *)&cmd_opponent,
(parse_pgm_inst_t *)&cmd_opponent_set,
(parse_pgm_inst_t *)&cmd_extension,
========================================
aversive_projects/microb2008/main/main.c (1.29 -> 1.30)
========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.c,v 1.29 2008-04-04 08:24:15 zer0 Exp $
+ * Revision : $Id: main.c,v 1.30 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -83,6 +83,7 @@
a = !a;
#endif
}
+extern int8_t modulo;
/* called every 5 ms */
void do_cs(void * dummy)
@@ -92,6 +93,10 @@
/* used for cs debugging */
static uint32_t debug_cs_cpt = 0;
uint8_t flags;
+#if DEBUG_TIME == 1
+ uint8_t old_time;
+ uint8_t rs_time=0, cs_time=0, pos_time=0;
+#endif
if (robot.cs_events & DO_POWER)
BRAKE_OFF();
@@ -99,11 +104,25 @@
BRAKE_ON();
if(robot.cs_events & DO_RS) {
+#if DEBUG_TIME == 1
+ old_time = TCNT2;
+#endif
+ /* about 0.5ms */
rs_update(&robot.rs);
+#if DEBUG_TIME == 1
+ rs_time = TCNT2 - old_time;
+#endif
}
if(robot.cs_events & DO_CS) {
+#if DEBUG_TIME == 1
+ old_time = TCNT2;
+#endif
+ /* about 2ms in worst case for both */
cs_manage(&robot.cs_a);
cs_manage(&robot.cs_d);
+#if DEBUG_TIME == 1
+ cs_time = TCNT2 - old_time;
+#endif
if (robot.debug & DEBUG_CS) {
debug_cs_cpt++;
@@ -136,8 +155,15 @@
}
- if((cpt % 4 == 0) && robot.cs_events & DO_POS) {
+ if(((cpt % modulo) == 0) && robot.cs_events & DO_POS) {
+#if DEBUG_TIME == 1
+ old_time = TCNT2;
+#endif
+ /* about 1.5ms in worst case */
position_manage(&robot.pos);
+#if DEBUG_TIME == 1
+ pos_time = TCNT2 - old_time;
+#endif
}
if(robot.cs_events & DO_BD) {
@@ -151,7 +177,11 @@
}
if (cpt % 512 == 0) {
+#if DEBUG_TIME == 1
+ printf("rs=%d, cs=%d, pos=%d\n", rs_time, cs_time, pos_time);
+#endif
DEBUG(E_USER_STRAT, "time %d, position=%d,%d,%d",
+ (int16_t)time_get_s(),
position_get_x_s16(&robot.pos),
position_get_y_s16(&robot.pos),
position_get_a_deg_s16(&robot.pos));
@@ -176,6 +206,11 @@
/* used to process blocking detection on wheels motors */
void pwm_set_and_save(void *enc, int32_t val)
{
+ if (val > 4095)
+ val = 4095;
+ if (val < -4095)
+ val = -4095;
+
if (enc == LEFT_PWM)
robot.pwm_l = val;
else if (enc == RIGHT_PWM)
@@ -212,7 +247,7 @@
u16 stream_flags = stdout->flags;
uint8_t i;
- if (e->severity < ERROR_SEVERITY_ERROR) {
+ if (e->severity > ERROR_SEVERITY_ERROR) {
if (robot.log_level < e->severity)
return;
@@ -376,10 +411,10 @@
const char * history;
/* check eeprom to avoid to run the bad program */
- if (eeprom_read_byte(EEPROM_MAGIC_ADDRESS) !=
+ if (eeprom_read_byte(EEPROM_MAGIC_ADDRESS) !=
EEPROM_MAGIC_MAIN)
while(1);
-
+
sbi(DDR(LED1PORT), LED1BIT);
sbi(DDR(LED2PORT), LED2BIT);
sbi(DDR(LED3PORT), LED3BIT);
@@ -437,12 +472,11 @@
/* increase left and it will turn more left */
/* EXT encoders */
rs_set_left_ext_encoder(&robot.rs, encoders_microb_get_value,
- LEFT_ENCODER_EXT, 1.0); // en augmentant on
tourne à droite
+ LEFT_ENCODER_EXT, 9.9909); // en augmentant on
tourne à gauche
rs_set_right_ext_encoder(&robot.rs, encoders_microb_get_value,
- RIGHT_ENCODER_EXT, -1.0); //en augmentant on
tourne à gauche
+ RIGHT_ENCODER_EXT, -10.0361); //en augmentant
on tourne à droite
- /* MOTORS encoders, nothing: we only use external encoders */
- rs_set_flags(&robot.rs, 1); /* rs use ext encoders */
+ rs_set_flags(&robot.rs, RS_USE_EXT); /* rs use ext encoders */
/* POSITION MANAGER */
position_init(&robot.pos);
@@ -452,14 +486,14 @@
/* CS DISTANCE */
pid_init(&robot.pid_d);
- pid_set_gains(&robot.pid_d, 400, 5, 11000);
+ pid_set_gains(&robot.pid_d, 20, 2, 800);
pid_set_maximums(&robot.pid_d, 0, 50000, 0);
pid_set_out_shift(&robot.pid_d, 6);
pid_set_derivate_filter(&robot.pid_d, 6);
quadramp_init(&robot.qr_d);
- quadramp_set_1st_order_vars(&robot.qr_d, 300, 300); /* set speed */
- quadramp_set_2nd_order_vars(&robot.qr_d, 10, 10); /* set accel */
+ quadramp_set_1st_order_vars(&robot.qr_d, 2500, 2500); /* set speed */
+ quadramp_set_2nd_order_vars(&robot.qr_d, 20, 20); /* set accel */
cs_init(&robot.cs_d);
cs_set_consign_filter(&robot.cs_d, quadramp_do_filter, &robot.qr_d);
@@ -470,14 +504,14 @@
/* CS ANGLE */
pid_init(&robot.pid_a);
- pid_set_gains(&robot.pid_a, 500, 5, 7000);
+ pid_set_gains(&robot.pid_a, 20, 2, 1000);
pid_set_maximums(&robot.pid_a, 0, 100000, 0);
pid_set_out_shift(&robot.pid_a, 6);
pid_set_derivate_filter(&robot.pid_a, 6);
quadramp_init(&robot.qr_a);
- quadramp_set_1st_order_vars(&robot.qr_a, 300, 300); /* set speed */
- quadramp_set_2nd_order_vars(&robot.qr_a, 3, 3); /* set accel */
+ quadramp_set_1st_order_vars(&robot.qr_a, 2000, 2000); /* set speed */
+ quadramp_set_2nd_order_vars(&robot.qr_a, 20, 20); /* set accel */
cs_init(&robot.cs_a);
cs_set_consign_filter(&robot.cs_a, quadramp_do_filter, &robot.qr_a);
@@ -490,15 +524,15 @@
trajectory_init(&robot.traj);
trajectory_set_cs(&robot.traj, &robot.cs_d, &robot.cs_a);
trajectory_set_robot_params(&robot.traj, &robot.rs, &robot.pos);
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, 2000, 2000); /* d, a */
/* distance window, angle window, angle start */
- trajectory_set_windows(&robot.traj, 20.0, 10.0, 50.0);
+ trajectory_set_windows(&robot.traj, 10.0, 5.0, 50.0);
/* Blocking detection */
bd_init(&robot.bd_l);
- bd_set_current_thresholds(&robot.bd_l, 500, 3000, 1200000, 60);
+ bd_set_current_thresholds(&robot.bd_l, 500, 8000, 1800000, 60);
bd_init(&robot.bd_r);
- bd_set_current_thresholds(&robot.bd_r, 500, 3000, 1200000, 60);
+ bd_set_current_thresholds(&robot.bd_r, 500, 8000, 1800000, 60);
/* CS EVENT */
scheduler_add_periodical_event_priority(do_cs, NULL,
@@ -524,6 +558,9 @@
TCNT2 = 0;
TCCR2 = 4;
sbi(TIMSK, OCIE2);
+#else /* else we use timer 2 for debug time measuring */
+ TCNT2 = 0;
+ TCCR2 = 5;
#endif
sei();
========================================
aversive_projects/microb2008/main/main.h (1.17 -> 1.18)
========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.h,v 1.17 2008-04-01 11:47:19 zer0 Exp $
+ * Revision : $Id: main.h,v 1.18 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -39,14 +39,14 @@
#define MATCH_TIME 90
/* decrease track to decrease angle */
-#define EXT_TRACK_CM 29.9
+#define EXT_TRACK_CM 29.858
#define VIRTUAL_TRACK_CM EXT_TRACK_CM
/* it is a 2000 imps -> 8000 because we see 1/4 period
* and diameter: 40.5mm -> perimeter 127.23mm
* 8000/12.723 -> 628.78 */
/* increase it to go further */
-#define DIST_IMP_CM 635.0
+#define DIST_IMP_CM 6350.0 /* rapport 10. [voir main()] */
#define LEFT_ENCODER_MOT ((void *)1)
#define RIGHT_ENCODER_MOT ((void *)0)
@@ -78,7 +78,9 @@
#define I2C_POLL_PRIO 20
/* debug flags */
-#define DEBUG_CS 1
+#define DEBUG_CS 0
+#define DEBUG_TIME 0
+
#define NB_LOGS 4
struct robot {
==========================================
aversive_projects/microb2008/main/sensor.c (1.4 -> 1.5)
==========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: sensor.c,v 1.4 2008-03-31 22:22:52 zer0 Exp $
+ * Revision : $Id: sensor.c,v 1.5 2008-04-06 17:33:57 zer0 Exp $
*
*/
@@ -99,8 +99,8 @@
* can call the same func during
* limitation... in this case the restoration
* will be wrong */
- trajectory_set_speed(&robot.traj, LIMITED_SPEED,
- robot.traj.a_speed);
+/* trajectory_set_speed(&robot.traj, LIMITED_SPEED, */
+/* robot.traj.a_speed); */
}
}
else {
@@ -109,8 +109,8 @@
}
else if (saved_speed != -1) {
DEBUG(E_USER_SENSOR, "Restoring speed from %d to %d",
LIMITED_SPEED, saved_speed);
- trajectory_set_speed(&robot.traj, saved_speed,
- robot.traj.a_speed);
+/* trajectory_set_speed(&robot.traj, saved_speed, */
+/* robot.traj.a_speed); */
saved_speed = -1;
}
}
@@ -137,7 +137,8 @@
uint8_t
sensor_obstacle(void)
{
- return !disable && (filter_us > (FILTER_US_CPT_MAX/2));
+ return 0;
+ // return !disable && (filter_us > (FILTER_US_CPT_MAX/2));
}
uint8_t
=========================================
aversive_projects/microb2008/main/strat.c (1.13 -> 1.14)
=========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: strat.c,v 1.13 2008-04-04 15:21:28 zer0 Exp $
+ * Revision : $Id: strat.c,v 1.14 2008-04-06 17:33:58 zer0 Exp $
*
*/
@@ -38,6 +38,9 @@
#define CATAPULT_SPEED_H_DISP 200
#define CATAPULT_POS_H_DISP 8000
+#define SPEED_SLOW 1000
+#define SPEED_FAST 2500
+
#define DISP_MAX_TRIES 2
#define TRAJ_SUCCESS(f) (f & (END_TRAJ|END_NEAR))
@@ -72,7 +75,7 @@
//position_set(&robot.pos, START_X, START_Y, START_A);
i2c_set_roller(1);
i2c_set_arm(I2C_EXTENSION_ARM_HARVEST);
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
time_reset();
interrupt_traj_reset();
colored_disp.count = 5;
@@ -256,14 +259,18 @@
if (!TRAJ_SUCCESS(err))
return err;
- trajectory_set_speed(&robot.traj, 100, 300);
+ trajectory_set_speed(&robot.traj, SPEED_SLOW, 3000);
trajectory_goto_forward_xy_abs(&robot.traj, V_WHI_DISP_X, V_WHI_DISP_Y);
err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
DEBUG(E_USER_STRAT, "%s end=%d", __FUNCTION__, err);
+ if (err == END_BLOCKING) {
+ bd_reset(&robot.bd_l);
+ bd_reset(&robot.bd_r);
+ }
trajectory_d_rel(&robot.traj, -1);
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
strat_pickup_v_disp(&white_disp);
@@ -285,23 +292,27 @@
colored_disp.count);
trajectory_goto_forward_xy_abs(&robot.traj, V_COL_DISP_X,
PREPARE_V_COL_DISP_Y);
- err = wait_traj_end(TRAJ_STD_FLAGS);
+ err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
if (!TRAJ_SUCCESS(err))
return err;
trajectory_a_abs(&robot.traj, V_COL_DISP_A);
- err = wait_traj_end(TRAJ_STD_FLAGS);
+ err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
if (!TRAJ_SUCCESS(err))
return err;
- trajectory_set_speed(&robot.traj, 100, 300);
+ trajectory_set_speed(&robot.traj, SPEED_SLOW, 3000);
trajectory_goto_forward_xy_abs(&robot.traj, V_COL_DISP_X, V_COL_DISP_Y);
err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
DEBUG(E_USER_STRAT, "%s end=%d", __FUNCTION__, err);
+ if (err == END_BLOCKING) {
+ bd_reset(&robot.bd_l);
+ bd_reset(&robot.bd_r);
+ }
trajectory_d_rel(&robot.traj, -1);
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
strat_pickup_v_disp(&colored_disp);
@@ -342,6 +353,8 @@
i2c_prepare_ball(I2C_BALL_TYPE_COLORED,
I2C_DST_DROP_SHOT);
}
+ /* XXX en cas d'echec, si le barillet est plein, il faut reessayer */
+
return END_TRAJ;
}
@@ -376,10 +389,19 @@
if (!TRAJ_SUCCESS(err) && err != END_TIMER)
return err;
+ trajectory_set_speed(&robot.traj, SPEED_SLOW, 3000);
trajectory_goto_forward_xy_abs(&robot.traj, STD_CONT_X_MID, STD_CONT_Y);
- wait_traj_end(TRAJ_FLAGS_NO_NEAR);
+ err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
+ /* we should be blocked on the border */
+ if (err == END_BLOCKING) {
+ DEBUG(E_USER_STRAT, "%s, reset blocking");
+ bd_reset(&robot.bd_l);
+ bd_reset(&robot.bd_r);
+ }
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
+
trajectory_d_rel(&robot.traj, -5);
- wait_traj_end(TRAJ_FLAGS_NO_NEAR);
+ err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
trajectory_a_abs(&robot.traj, STD_CONT_A);
err = wait_traj_end(TRAJ_FLAGS_NO_NEAR);
@@ -408,13 +430,15 @@
if (col != I2C_BALL_TYPE_EMPTY)
i2c_prepare_ball(col, side);
}
+
+ /* XXX en cas d'echec, si le barillet est plein, il faut reessayer */
+
return END_TRAJ;
}
/* drop (shot or eject) balls if necessary */
static uint8_t strat_drop_balls(void)
{
- /* XXX improve it here, use force and time */
if (barrel_colored_count() == 0 && barrel_white_count() == 0)
return END_TRAJ;
@@ -440,7 +464,7 @@
return strat_eject_balls();
}
- /* if we are close of col disp, */
+ /* if we are close of col disp, XXX wrong if colored_disp==0 */
if (distance_from_robot(V_COL_DISP_X, V_COL_DISP_Y) < 60) {
/* if there is some balls in container, just shot our
* colored balls */
@@ -454,13 +478,18 @@
if (barrel_white_count() + barrel_colored_count() >= 4) {
/* if we don't have lots of white */
- if (barrel_white_count() <= 1)
+ if (barrel_white_count() <= 1) {
+ DEBUG(E_USER_STRAT, "%s lot of balls, shot",
__FUNCTION__);
return strat_shot_balls();
+ }
/* else eject */
+ DEBUG(E_USER_STRAT, "%s lot of balls, eject", __FUNCTION__);
return strat_eject_balls();
}
+ DEBUG(E_USER_STRAT, "%s do it later", __FUNCTION__);
+
/* else do nothing... we will be called later */
return END_TRAJ;
}
@@ -500,7 +529,7 @@
if (!TRAJ_SUCCESS(err))
goto err;
- trajectory_set_speed(&robot.traj, 100, 300);
+ trajectory_set_speed(&robot.traj, SPEED_SLOW, 3000);
i2c_catapult_out();
/* backwards */
@@ -524,7 +553,7 @@
if (!TRAJ_SUCCESS(err))
goto err;
- trajectory_set_speed(&robot.traj, 100, 300);
+ trajectory_set_speed(&robot.traj, SPEED_SLOW, 3000);
i2c_catapult_out();
/* backwards */
@@ -535,14 +564,14 @@
}
i2c_harvest();
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
h_disp_enabled = 1;
return END_TRAJ;
err_restore_params:
i2c_harvest();
- trajectory_set_speed(&robot.traj, 300, 300);
+ trajectory_set_speed(&robot.traj, SPEED_FAST, 3000);
err:
return err;
}
Commit from zer0 (2008-04-07 00:33 CEST)
================
fix bug in 'test' command
aversive_projects microb2008/main/commands.c 1.23
============================================
aversive_projects/microb2008/main/commands.c (1.22 -> 1.23)
============================================
@@ -1407,8 +1407,8 @@
prog_char str_test_arg0[] = "test";
parse_pgm_token_string_t cmd_test_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_test_result, arg0, str_test_arg0);
-parse_pgm_token_num_t cmd_test_arg1 = TOKEN_NUM_INITIALIZER(struct
cmd_position_result, arg1, INT8);
-parse_pgm_token_num_t cmd_test_arg2 = TOKEN_NUM_INITIALIZER(struct
cmd_position_result, arg2, INT8);
+parse_pgm_token_num_t cmd_test_arg1 = TOKEN_NUM_INITIALIZER(struct
cmd_test_result, arg1, INT8);
+parse_pgm_token_num_t cmd_test_arg2 = TOKEN_NUM_INITIALIZER(struct
cmd_test_result, arg2, INT8);
prog_char help_test[] = "Test function";
parse_pgm_inst_t cmd_test = {
_______________________________________________
Avr-list mailing list
[email protected]
CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive
WIKI : http://wiki.droids-corp.org/index.php/Aversive
DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/
BUGZILLA : http://bugzilla.droids-corp.org
COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog