Skip to content

Commit 0fe62e0

Browse files
committed
feat: kinematics theta simulating magnetic field
1 parent 28fb1d2 commit 0fe62e0

File tree

4 files changed

+32
-5
lines changed

4 files changed

+32
-5
lines changed

src/Arduino_AlvikCarrier.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,8 @@ int Arduino_AlvikCarrier::beginImu(){
686686
ipKnobs->modx = MOTION_FX_DECIMATION;
687687

688688
MotionFX_setKnobs(mfxstate, ipKnobs);
689-
MotionFX_enable_6X(mfxstate, MFX_ENGINE_ENABLE);
690-
MotionFX_enable_9X(mfxstate, MFX_ENGINE_DISABLE);
689+
MotionFX_enable_6X(mfxstate, MFX_ENGINE_DISABLE);
690+
MotionFX_enable_9X(mfxstate, MFX_ENGINE_ENABLE);
691691

692692
return 0;
693693
}
@@ -701,6 +701,10 @@ void Arduino_AlvikCarrier::updateImu(){
701701
imu_data.acc[0] = (float)accelerometer[0] * FROM_MG_TO_G;
702702
imu_data.acc[1] = (float)accelerometer[1] * FROM_MG_TO_G;
703703
imu_data.acc[2] = (float)accelerometer[2] * FROM_MG_TO_G;
704+
imu_data.mag[0] = -getSinTheta() * SIM_MAG_FILED_UT50;
705+
imu_data.mag[1] = getCosTheta() * SIM_MAG_FILED_UT50;
706+
imu_data.mag[2] = 0;
707+
704708

705709
if (sample_to_discard>MOTION_FX_SAMPLETODISCARD){
706710
MotionFX_propagate(mfxstate, &filter_data, &imu_data, &imu_delta_time);
@@ -884,6 +888,14 @@ float Arduino_AlvikCarrier::getTheta(){
884888
return kinematics->getTheta();
885889
}
886890

891+
float Arduino_AlvikCarrier::getSinTheta(){
892+
return kinematics->getSinTheta();
893+
}
894+
895+
float Arduino_AlvikCarrier::getCosTheta(){
896+
return kinematics->getCosTheta();
897+
}
898+
887899
void Arduino_AlvikCarrier::resetPose(const float x0, const float y0, const float theta0){
888900
kinematics->resetPose(x0,y0,theta0);
889901
}

src/Arduino_AlvikCarrier.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ class Arduino_AlvikCarrier{
252252
float getX(); // absolute position in mm
253253
float getY(); // absolute position in mm
254254
float getTheta(); // angle in deg
255+
float getSinTheta(); // stored sin of current theta
256+
float getCosTheta(); // stored cos of current theta
255257
void resetPose(const float x0=0.0, const float y0=0.0, const float theta0=0.0); // reset pose in kinematics
256258

257259
void move(const float distance); // move of distance millimeters

src/definitions/robot_definitions.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ const float MOTION_FX_PERIOD = (1000U / MOTION_FX_FREQ);
8888
#define GBIAS_ACC_TH_SC (2.0f*0.000765f)
8989
#define GBIAS_GYRO_TH_SC (2.0f*0.002f)
9090
#define MOTION_FX_DECIMATION 1U
91-
91+
#define FROM_MGAUSS_TO_UT50 (0.1f/50.0f)
92+
#define SIM_MAG_FIELD_MG 500 // simulated magnetic field intensity in mGauss
93+
#define SIM_MAG_FILED_UT50 SIM_MAG_FIELD_MG * FROM_MGAUSS_TO_UT50
9294

9395
// Library version
9496
#define VERSION_BYTE_HIGH 1

src/robotics/kinematics.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class Kinematics{
3030
float left_vel, right_vel;
3131

3232
float theta, delta_theta;
33+
float sin_theta, cos_theta;
3334
float x, y;
3435
float delta_left, delta_right;
3536
float delta_travel;
@@ -154,8 +155,10 @@ class Kinematics{
154155

155156
void updatePose(){
156157
delta_theta=angular_velocity*control_period;
157-
delta_x=linear_velocity*cos(theta)*control_period;
158-
delta_y=linear_velocity*sin(theta)*control_period;
158+
sin_theta = sin(theta);
159+
cos_theta = cos(theta);
160+
delta_x=linear_velocity*cos_theta*control_period;
161+
delta_y=linear_velocity*sin_theta*control_period;
159162
delta_travel=sqrt(delta_x*delta_x+delta_y*delta_y);
160163
x+=delta_x;
161164
y+=delta_y;
@@ -192,6 +195,14 @@ class Kinematics{
192195
return rads_to_degs(theta);
193196
}
194197

198+
float getSinTheta(){
199+
return sin_theta;
200+
}
201+
202+
float getCosTheta(){
203+
return cos_theta;
204+
}
205+
195206
float getTravel(){
196207
return m_to_mm(travel);
197208
}

0 commit comments

Comments
 (0)