From: Xavier L. <Ba...@us...> - 2011-03-31 15:05:00
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via d8a4ed321466b4ff28df5fad95e14a763c15ade3 (commit) from 260df9f53355a424386ccc2b72d403d43ba6b83f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d8a4ed321466b4ff28df5fad95e14a763c15ade3 Author: Xavier Lagorce <Xav...@cr...> Date: Thu Mar 31 17:02:51 2011 +0200 [Controller_Motor_STM32] new features in command_generator * When a composition generator is started (like GEN_RAMP2), it will not automatically start the other generator ot reads the output from. * Added a Differential drive generator to compute wheel speeds based on robot global parameters (i.e. linear and rotational speeds). ----------------------------------------------------------------------- Changes: diff --git a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c index 4d07057..ac57d5d 100644 --- a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c +++ b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c @@ -41,13 +41,31 @@ command_generator_t* new_ramp2_generator(command_generator_t *generator, float s return generator; } - -command_generator_t* adjust_value(command_generator_t *generator, float value) { - generator->type.last_output = value; +command_generator_t* new_dd_generator(command_generator_t *generator, + command_generator_t *linear_speed, + command_generator_t *rotational_speed, + float wheel_radius, float shaft_width, + uint8_t type) { + generator->type.t = (type == 1) ? GEN_DD_RIGHT : GEN_DD_LEFT; + generator->type.callback.type = GEN_CALLBACK_NONE; + generator->dd.linear_speed = linear_speed; + generator->dd.rotational_speed = rotational_speed; + generator->dd.wheel_radius = wheel_radius; + generator->dd.shaft_width = shaft_width; return generator; } + +command_generator_t* adjust_value(command_generator_t *generator, float value) { + if (generator->type.t != GEN_DD_RIGHT && generator->type.t != GEN_DD_LEFT) { + generator->type.last_output = value; + return generator; + } else { + return NULL; + } +} + command_generator_t* adjust_speed(command_generator_t *generator, float speed) { switch (generator->type.t) { case GEN_RAMP: @@ -64,7 +82,6 @@ command_generator_t* start_generator(command_generator_t *generator) { generator->ramp.last_time = ticks_to_us(timer_clock()); break; case GEN_RAMP2: - start_generator(generator->ramp2.speed); generator->ramp2.last_time = ticks_to_us(timer_clock()); } generator->type.state = GEN_STATE_RUNNING; @@ -78,9 +95,6 @@ command_generator_t* pause_generator(command_generator_t *generator) { // pause the generator generator->type.state = GEN_STATE_PAUSE; - if (generator->type.t == GEN_RAMP2) - pause_generator(generator->ramp2.speed); - return generator; } @@ -101,7 +115,7 @@ command_generator_t* remove_callback(command_generator_t *generator) { float get_output_value(command_generator_t *generator) { int32_t cur_time; - float speed, dt; + float speed, dt, u1, u2; if (generator->type.state != GEN_STATE_RUNNING) return generator->type.last_output; @@ -123,6 +137,16 @@ float get_output_value(command_generator_t *generator) { generator->type.last_output += dt*speed; generator->ramp2.last_time = cur_time; break; + case GEN_DD_RIGHT: + u1 = get_output_value(generator->dd.linear_speed); + u2 = get_output_value(generator->dd.rotational_speed); + generator->type.last_output = (4.0*u1+u2*generator->dd.shaft_width) / (4.0 * generator->dd.wheel_radius); + break; + case GEN_DD_LEFT: + u1 = get_output_value(generator->dd.linear_speed); + u2 = get_output_value(generator->dd.rotational_speed); + generator->type.last_output = (4.0*u1-u2*generator->dd.shaft_width) / (4.0 * generator->dd.wheel_radius); + break; } switch (generator->type.callback.type) { hooks/post-receive -- krobot |