Revision f336542d
| components/Odometry.cpp | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
|
| 21 | 21 |
Odometry::Odometry(MotorIncrements* mi, L3G4200D* gyroscope) |
| 22 |
: BaseStaticThread<1024>(),
|
|
| 22 |
: BaseStaticThread<512>(),
|
|
| 23 | 23 |
motorIncrements(mi), |
| 24 | 24 |
gyro(gyroscope), |
| 25 | 25 |
eventSource(), |
| ... | ... | |
| 82 | 82 |
|
| 83 | 83 |
void Odometry::setError(float* Cp3x3) {
|
| 84 | 84 |
chSysLock(); |
| 85 |
// float** test; |
|
| 86 | 85 |
Matrix::copy<float>(Cp3x3,3,3, &(this->Cp3x3[0]),3,3); |
| 87 |
// Matrix::copy<float>(Cp3x3,3,3, test,3,3); |
|
| 88 | 86 |
chSysUnlock(); |
| 89 | 87 |
} |
| 90 | 88 |
|
| 91 | 89 |
void Odometry::resetError() {
|
| 92 |
// float zeroMatrix[9] = {};
|
|
| 93 |
// this->setError(&(zeroMatrix[0])); |
|
| 94 | 90 |
Matrix::init<float>(&(this->Cp3x3[0]),3,3,0.0f); |
| 95 | 91 |
} |
| 96 | 92 |
|
| ... | ... | |
| 105 | 101 |
while (!this->shouldTerminate()) {
|
| 106 | 102 |
time += MS2ST(this->period); |
| 107 | 103 |
|
| 108 |
// Update the base distance, because it may change after a calibration
|
|
| 104 |
// Update the base distance, because it may have changed after a calibration
|
|
| 109 | 105 |
this->updateWheelBaseDistance(); |
| 110 | 106 |
|
| 111 | 107 |
// Get the actual speed |
| ... | ... | |
| 120 | 116 |
// chprintf((BaseSequentialStream*) &global.sercanmux1, "distance_left:%f distance_right:%f", this->distance[0],this->distance[1]); |
| 121 | 117 |
// chprintf((BaseSequentialStream*) &global.sercanmux1, "\r\n"); |
| 122 | 118 |
|
| 123 |
if (time >= System::getTime()) {
|
|
| 124 |
chThdSleepUntil(time); |
|
| 119 |
if (time >= System::getTime()) {
|
|
| 120 |
chThdSleepUntil(time);
|
|
| 125 | 121 |
} else {
|
| 126 |
chprintf((BaseSequentialStream*) &global.sercanmux1, "WARNING Odometry: Unable to keep track\r\n"); |
|
| 127 |
} |
|
| 122 |
chprintf((BaseSequentialStream*) &global.sercanmux1, "WARNING Odometry: Unable to keep track\r\n");
|
|
| 123 |
}
|
|
| 128 | 124 |
} |
| 129 | 125 |
|
| 130 | 126 |
return true; |
| ... | ... | |
| 134 | 130 |
|
| 135 | 131 |
// Get the temporary position and error |
| 136 | 132 |
float Cp3x3[9]; |
| 137 |
uint32_t angular_ud; |
|
| 133 |
int32_t angular_ud; |
|
| 134 |
int32_t angularRate_udps; |
|
| 138 | 135 |
chSysLock(); |
| 139 | 136 |
float pX = this->pX; |
| 140 | 137 |
float pY = this->pY; |
| 141 | 138 |
float pPhi = this->pPhi; |
| 142 | 139 |
Matrix::copy<float>(this->Cp3x3,3,3,Cp3x3,3,3); |
| 143 |
// Get the differentail gyro information and reset it
|
|
| 144 |
angular_ud = gyro->getAngular_ud(L3G4200D::AXIS_Z); |
|
| 145 |
gyro->angularReset();
|
|
| 140 |
// TODO Get the gyro (or gyro rate) information and do something with it
|
|
| 141 |
// angular_ud = gyro->getAngular_ud(L3G4200D::AXIS_Z);
|
|
| 142 |
// angularRate_udps = gyro->getAngularRate_udps(L3G4200D::AXIS_Z);
|
|
| 146 | 143 |
chSysUnlock(); |
| 147 | 144 |
|
| 148 | 145 |
//////////////// |
| ... | ... | |
| 150 | 147 |
//////////////// |
| 151 | 148 |
|
| 152 | 149 |
// TMP: Rotated angular |
| 153 |
// float dPhi = (this->distance[RIGHT_WHEEL] - this->distance[LEFT_WHEEL]) / this->wheelBaseDistanceSI; |
|
| 154 |
float dPhi = ((float(angular_ud * 1e-3) * M_PI ) * 1e-3) / 180.0f; |
|
| 150 |
float dPhi = (this->distance[RIGHT_WHEEL] - this->distance[LEFT_WHEEL]) / this->wheelBaseDistanceSI; |
|
| 151 |
// TODO Calculate the differential angel dPhi from either the angular (1. line) or angular rate (2.+3. line) |
|
| 152 |
// float dPhi = ((float(angular_ud * 1e-3) * M_PI ) * 1e-3) / 180.0f; |
|
| 153 |
// const float angular_md = float((angularRate_udps * this->period / constants::millisecondsPerSecond) * 1e-3); |
|
| 154 |
// float dPhi = ((angular_md * M_PI) * 1e-3) / 180.0f; |
|
| 155 | 155 |
|
| 156 | 156 |
// TMP: Moved distance |
| 157 | 157 |
float dDistance = (this->distance[RIGHT_WHEEL] + this->distance[LEFT_WHEEL]) / 2.0f; |
| components/gyro/l3g4200d.cpp | ||
|---|---|---|
| 37 | 37 |
this->setName("l3g4200d");
|
| 38 | 38 |
|
| 39 | 39 |
while (!this->shouldTerminate()) {
|
| 40 |
time += this->period_st; |
|
| 40 |
time += this->period_st;
|
|
| 41 | 41 |
|
| 42 | 42 |
updateSensorData(); |
| 43 | 43 |
calcAngular(); |
| ... | ... | |
| 48 | 48 |
chThdSleepUntil(time); |
| 49 | 49 |
} else {
|
| 50 | 50 |
chprintf((BaseSequentialStream*) &global.sercanmux1, "WARNING l3g4200d: Unable to keep track\r\n"); |
| 51 |
} |
|
| 51 |
}
|
|
| 52 | 52 |
} |
| 53 | 53 |
return RDY_OK; |
| 54 | 54 |
} |
| ... | ... | |
| 62 | 62 |
int32_t |
| 63 | 63 |
L3G4200D:: |
| 64 | 64 |
getAngularRate_udps(const uint8_t axis) {
|
| 65 |
return uint32_t(this->angularRate[axis]) * this->udpsPerTic;
|
|
| 65 |
return int32_t(this->angularRate[axis]) * this->udpsPerTic; |
|
| 66 | 66 |
} |
| 67 | 67 |
|
| 68 | 68 |
int32_t |
| ... | ... | |
| 160 | 160 |
case L3G4200D::DR_400_HZ: this->period_us = 2500; break; |
| 161 | 161 |
case L3G4200D::DR_800_HZ: this->period_us = 1250; break; |
| 162 | 162 |
} |
| 163 |
this->period_st = US2ST(this->period_st); |
|
| 163 |
this->period_st = US2ST(this->period_us); |
|
| 164 |
this->period_ms = this->period_us * 1e-3; |
|
| 164 | 165 |
|
| 165 | 166 |
// Handle the new full scale |
| 166 | 167 |
switch(config->ctrl1 & L3G4200D::FS_MASK) {
|
| devices/DiWheelDrive/main.cpp | ||
|---|---|---|
| 849 | 849 |
|
| 850 | 850 |
global.increments.start(); // Start the qei driver |
| 851 | 851 |
|
| 852 |
// Start the three axes gyroscope |
|
| 853 |
global.l3g4200d.configure(&global.gyro_run_config); |
|
| 854 |
global.l3g4200d.start(NORMALPRIO+5); |
|
| 855 |
|
|
| 852 | 856 |
global.odometry.start(NORMALPRIO + 20); |
| 853 | 857 |
|
| 854 | 858 |
global.robot.start(HIGHPRIO - 1); |
| ... | ... | |
| 867 | 871 |
global.lis331dlh.configure(&global.accel_run_config); |
| 868 | 872 |
global.lis331dlh.start(NORMALPRIO+4); |
| 869 | 873 |
|
| 870 |
// Start the three axes gyroscope |
|
| 871 |
global.l3g4200d.configure(&global.gyro_run_config); |
|
| 872 |
global.l3g4200d.start(NORMALPRIO+5); |
|
| 873 |
|
|
| 874 | 874 |
// Start the user thread |
| 875 | 875 |
global.userThread.start(NORMALPRIO); |
| 876 | 876 |
|
| include/amiro/Odometry.h | ||
|---|---|---|
| 8 | 8 |
|
| 9 | 9 |
namespace amiro {
|
| 10 | 10 |
|
| 11 |
class Odometry : public chibios_rt::BaseStaticThread<1024> {
|
|
| 11 |
class Odometry : public chibios_rt::BaseStaticThread<512> {
|
|
| 12 | 12 |
public: |
| 13 | 13 |
/** |
| 14 | 14 |
* Constructor |
Also available in: Unified diff