add simple overload fault recovery
This commit is contained in:
parent
8d5c40deb3
commit
dce686f500
2 changed files with 47 additions and 22 deletions
|
@ -80,17 +80,20 @@ void loop() {
|
||||||
|
|
||||||
static unsigned long last_servo_send_millis;
|
static unsigned long last_servo_send_millis;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (loopmillis-last_loop_movement_millis>50) {
|
if (loopmillis-last_loop_movement_millis>50) {
|
||||||
last_loop_movement_millis=loopmillis;
|
last_loop_movement_millis=loopmillis;
|
||||||
//int state_switch_programm = digitalRead(switch_programm); //currently not used
|
int state_switch_programm = digitalRead(switch_programm); //currently not used
|
||||||
//Serial.println(digitalRead(switch_programm));
|
//Serial.println(digitalRead(switch_programm));
|
||||||
|
|
||||||
|
|
||||||
//move_protesis_with_sensor_data(); //old movement function
|
//move_protesis_with_sensor_data(); //old movement function
|
||||||
//slither();
|
//slither();
|
||||||
|
|
||||||
readMPU();
|
readMPU();
|
||||||
update_mood();
|
update_mood();
|
||||||
move_protesis_organic();
|
map_servos_by_weights_with_initial_position_and_move(current_mpu_inertia.roll_acceleration,current_mpu_inertia.pitch_acceleration);
|
||||||
last_servo_send_millis=millis();
|
last_servo_send_millis=millis();
|
||||||
|
|
||||||
//Serial.println("moved servos");
|
//Serial.println("moved servos");
|
||||||
|
@ -98,7 +101,7 @@ void loop() {
|
||||||
|
|
||||||
if (loopmillis-last_loop_readpos_millis>100 && loopmillis-last_servo_send_millis>=4) { //limit frequency and minimum delay after send positions
|
if (loopmillis-last_loop_readpos_millis>100 && loopmillis-last_servo_send_millis>=4) { //limit frequency and minimum delay after send positions
|
||||||
last_loop_readpos_millis=loopmillis;
|
last_loop_readpos_millis=loopmillis;
|
||||||
//read_servos_positions(); //takes around 8000us for all servos. read and send over serial.
|
read_servos_positions(); //takes around 8000us for all servos. read and send over serial.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ void loop() {
|
||||||
void update_mood() {
|
void update_mood() {
|
||||||
#define GYROSCOPE_FILTER_SHAKINESS 0.8
|
#define GYROSCOPE_FILTER_SHAKINESS 0.8
|
||||||
float gyro=constrain(sqrt(pow(current_mpu_measurement.gyroscope.x,2)+pow(current_mpu_measurement.gyroscope.y,2)) / 10000.0 ,0.0, 1.0);
|
float gyro=constrain(sqrt(pow(current_mpu_measurement.gyroscope.x,2)+pow(current_mpu_measurement.gyroscope.y,2)) / 10000.0 ,0.0, 1.0);
|
||||||
mood.shakiness = constrain(mood.shakiness*GYROSCOPE_FILTER_SHAKINESS + (1-GYROSCOPE_FILTER_SHAKINESS)*gyro, 0,1.) ;
|
mood.shakiness = constrain(mood.shakiness*GYROSCOPE_FILTER_SHAKINESS + (1-GYROSCOPE_FILTER_SHAKINESS)*gyro, 0,1.);
|
||||||
#define GYROSCOPE_FILTER_WAKEFULNESS 0.99
|
#define GYROSCOPE_FILTER_WAKEFULNESS 0.99
|
||||||
mood.wakefulness = constrain(mood.wakefulness*GYROSCOPE_FILTER_WAKEFULNESS + (1-GYROSCOPE_FILTER_WAKEFULNESS)*gyro, 0,1.);
|
mood.wakefulness = constrain(mood.wakefulness*GYROSCOPE_FILTER_WAKEFULNESS + (1-GYROSCOPE_FILTER_WAKEFULNESS)*gyro, 0,1.);
|
||||||
|
|
||||||
|
@ -162,19 +165,6 @@ void readMPU() {
|
||||||
denoise_inertia_with_complementary_filter();
|
denoise_inertia_with_complementary_filter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void move_protesis_organic() {
|
|
||||||
|
|
||||||
//substract_gyroscope_offset(current_mpu_measurement);
|
|
||||||
//mpu_measurement_with_precission(current_mpu_measurement_dp, current_mpu_measurement);
|
|
||||||
//denoise_mpu_measurement_with_complementary_filter();
|
|
||||||
|
|
||||||
//servos_collect_current_torque();
|
|
||||||
map_servos_by_weights_with_initial_position_and_move(current_mpu_inertia.roll_acceleration,current_mpu_inertia.pitch_acceleration);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void denoise_inertia_with_complementary_filter() {
|
void denoise_inertia_with_complementary_filter() {
|
||||||
current_mpu_inertia.roll_gyroscope = previous_mpu_inertia.roll_gyroscope
|
current_mpu_inertia.roll_gyroscope = previous_mpu_inertia.roll_gyroscope
|
||||||
* DENOISE_PREVIOUS_INERTIA_RATE
|
* DENOISE_PREVIOUS_INERTIA_RATE
|
||||||
|
|
|
@ -48,11 +48,12 @@ void matrix_weights_update(){
|
||||||
map_mode_slither/=map_sum;
|
map_mode_slither/=map_sum;
|
||||||
map_mode_sleeping/=map_sum;
|
map_mode_sleeping/=map_sum;
|
||||||
|
|
||||||
|
/*
|
||||||
Serial.print(map_mode_noise); Serial.print(",");
|
Serial.print(map_mode_noise); Serial.print(",");
|
||||||
Serial.print(map_mode_rollpitch); Serial.print(",");
|
Serial.print(map_mode_rollpitch); Serial.print(",");
|
||||||
Serial.print(map_mode_slither); Serial.print(",");
|
Serial.print(map_mode_slither); Serial.print(",");
|
||||||
Serial.print(map_mode_sleeping); Serial.println();
|
Serial.print(map_mode_sleeping); Serial.println();
|
||||||
|
*/
|
||||||
|
|
||||||
//Mode Noise
|
//Mode Noise
|
||||||
matrix_weights[0][W_NOISE]=90.0 *map_mode_noise;
|
matrix_weights[0][W_NOISE]=90.0 *map_mode_noise;
|
||||||
|
@ -85,9 +86,9 @@ void matrix_weights_update(){
|
||||||
matrix_weights[4][W_COS]=30 *map_mode_slither;
|
matrix_weights[4][W_COS]=30 *map_mode_slither;
|
||||||
|
|
||||||
//Mode Sleeping
|
//Mode Sleeping
|
||||||
matrix_weights[0][W_NOISESLOW]=5 *map_mode_sleeping;
|
matrix_weights[0][W_NOISESLOW]=20 *map_mode_sleeping;
|
||||||
matrix_weights[1][W_NOISESLOW]=10 *map_mode_sleeping;
|
matrix_weights[1][W_NOISESLOW]=20 *map_mode_sleeping;
|
||||||
matrix_weights[2][W_NOISESLOW]=20 *map_mode_sleeping;
|
matrix_weights[2][W_NOISESLOW]=30 *map_mode_sleeping;
|
||||||
matrix_weights[3][W_NOISESLOW]=15 *map_mode_sleeping;
|
matrix_weights[3][W_NOISESLOW]=15 *map_mode_sleeping;
|
||||||
matrix_weights[4][W_NOISESLOW]=10 *map_mode_sleeping;
|
matrix_weights[4][W_NOISESLOW]=10 *map_mode_sleeping;
|
||||||
|
|
||||||
|
@ -167,6 +168,7 @@ void servos_init_with_current_position() {
|
||||||
servos_init();
|
servos_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void servos_init() {
|
void servos_init() {
|
||||||
for(int i = 0; i< SERVO_COUNT; i++) {
|
for(int i = 0; i< SERVO_COUNT; i++) {
|
||||||
dxlSetStatusReturnLevel(servos[i].id, AX_RETURN_READ); // Incorporated to avoid the colapsing of data found it with the osciloscope when the motors are sending data to te board
|
dxlSetStatusReturnLevel(servos[i].id, AX_RETURN_READ); // Incorporated to avoid the colapsing of data found it with the osciloscope when the motors are sending data to te board
|
||||||
|
@ -314,9 +316,10 @@ void map_servos_by_weights_with_initial_position_and_move(const int roll, const
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
|
||||||
void read_servos_positions()
|
void read_servos_positions()
|
||||||
{
|
{
|
||||||
|
int errors[SERVO_COUNT];
|
||||||
Serial.print("dxlgp");
|
Serial.print("dxlgp");
|
||||||
for (uint8_t i=0;i<SERVO_COUNT;i++) {
|
for (uint8_t i=0;i<SERVO_COUNT;i++) {
|
||||||
//Serial.print("servo "); Serial.print(i); Serial.print( "(id="); Serial.print(servos[i].id); Serial.print(")"); Serial.print("="); Serial.println(dxlGetPosition(servos[i].id));
|
//Serial.print("servo "); Serial.print(i); Serial.print( "(id="); Serial.print(servos[i].id); Serial.print(")"); Serial.print("="); Serial.println(dxlGetPosition(servos[i].id));
|
||||||
|
@ -324,9 +327,41 @@ void read_servos_positions()
|
||||||
Serial.print(",");
|
Serial.print(",");
|
||||||
|
|
||||||
Serial.print(dxlGetPosition(servos[i].id));
|
Serial.print(dxlGetPosition(servos[i].id));
|
||||||
|
errors[i]=ax12GetLastError();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.print("error");
|
||||||
|
for (uint8_t i=0;i<SERVO_COUNT;i++) {
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(errors[i]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for(int i = 0; i< SERVO_COUNT; i++) {
|
||||||
|
int errorcode=errors[i];
|
||||||
|
if (errorcode!=0) {
|
||||||
|
Serial.print("Error present on "); Serial.print(i); Serial.print("errorcode="); Serial.println(errorcode);
|
||||||
|
}
|
||||||
|
if (CHECK_BIT(errorcode,5)) { //overload error
|
||||||
|
Serial.print("Init Servo "); Serial.println(i);
|
||||||
|
delay(1000);
|
||||||
|
dxlSetStatusReturnLevel(servos[i].id, AX_RETURN_READ); // Incorporated to avoid the colapsing of data found it with the osciloscope when the motors are sending data to te board
|
||||||
|
dxlSetJointMode(servos[i].id, servos[i].min_position, servos[i].max_position);
|
||||||
|
dxlSetGoalSpeed(servos[i].id, servos[i].initial_speed);
|
||||||
|
dxlTorqueOn(servos[i].id);
|
||||||
|
dxlSetRunningTorqueLimit(servos[i].id,MOTOR_TORQUE_LIMIT / MOTOR_TORQUE_RATIO);
|
||||||
|
dxlSetGoalPosition(servos[i].id, servos[i].initial_position);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue