Skip to content

Commit 78367c4

Browse files
committed
Add miruLowPassFilterConverter to sensorInterfaces
1 parent eed1942 commit 78367c4

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include "miruLowPassFilterConverter.h"
2+
#include "architecture/utilities/avsEigenSupport.h"
3+
4+
/*! This method checks the input message to ensure it is linked.
5+
@return void
6+
@param callTime [ns] Time the method is called
7+
*/
8+
void MiruLowPassFilterConverter::Reset(uint64_t callTime) {
9+
if (!this->imuAccelDataInMsg.isLinked()) {
10+
this->bskLogger->bskLog(BSK_ERROR, "miruLowPassFilterConverter.imuAccelDataInMsg wasn't connected.");
11+
}
12+
}
13+
14+
/*! This method writes the module output message using the given input message.
15+
@return void
16+
@param callTime [ns] Time the method is called
17+
*/
18+
void MiruLowPassFilterConverter::UpdateState(uint64_t callTime) {
19+
auto lowPass = LowPassFilter();
20+
int smallestFutureIndex = 0;
21+
int numberOfValidGyroMeasurements = 0;
22+
double firstFutureTime = -1;
23+
double meanMeasurementTime = 0;
24+
AccDataMsgPayload gyrBuffer = this->imuAccelDataInMsg();
25+
for (int index = 0; index < MAX_ACC_BUF_PKT; index++) {
26+
double gyroMeasuredTime = gyrBuffer.accPkts[index].measTime*NANO2SEC;
27+
if (gyroMeasuredTime < firstFutureTime || firstFutureTime<0){
28+
smallestFutureIndex = index;
29+
firstFutureTime = gyroMeasuredTime;
30+
}
31+
meanMeasurementTime += gyroMeasuredTime;
32+
numberOfValidGyroMeasurements += 1;
33+
}
34+
lowPass.setFilterCutoff(this->cutOffFrequency);
35+
lowPass.setFilterStep(this->hStep);
36+
if (numberOfValidGyroMeasurements > 0){
37+
meanMeasurementTime /= numberOfValidGyroMeasurements;
38+
/*! - Loop through buffer for all future measurements since the previous time to filter omega_BN_B*/
39+
for (int index = 0; index < MAX_ACC_BUF_PKT; index++) {
40+
int shiftedIndex = (index + smallestFutureIndex) % MAX_ACC_BUF_PKT;
41+
auto omega_BN_B = Eigen::Map<Eigen::Vector3d>(gyrBuffer.accPkts[shiftedIndex].gyro_B);
42+
/*! - Apply low-pass filter to gyro measurements to get smoothed body rate*/
43+
lowPass.processMeasurement(omega_BN_B);
44+
}
45+
}
46+
47+
// Write the output message
48+
IMUSensorMsgPayload imuSensorOut = IMUSensorMsgPayload();
49+
imuSensorOut.timeTag = meanMeasurementTime;
50+
imuSensorOut.numberOfValidGyroMeasurements = numberOfValidGyroMeasurements;
51+
Eigen::Vector3d omega_BN_B = lowPass.getCurrentState();
52+
eigenVector3d2CArray(omega_BN_B, imuSensorOut.AngVelPlatform);
53+
this->imuSensorOutMsg.write(&imuSensorOut, moduleID, callTime);
54+
}
55+
56+
/*! Set the low pass filter parameters
57+
@param double step
58+
@param double frequencyCutOff
59+
*/
60+
void MiruLowPassFilterConverter::setLowPassFilter(double step, double frequencyCutOff) {
61+
this->hStep = step;
62+
this->cutOffFrequency = frequencyCutOff;
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#ifndef _MIRULOWPASSFILTERCONVERTER_
2+
#define _MIRULOWPASSFILTERCONVERTER_
3+
4+
#include "architecture/_GeneralModuleFiles/sys_model.h"
5+
#include "architecture/messaging/messaging.h"
6+
#include "architecture/utilities/bskLogging.h"
7+
#include "architecture/utilities/macroDefinitions.h"
8+
#include "architecture/msgPayloadDefC/AccDataMsgPayload.h"
9+
#include "architecture/msgPayloadDefC/IMUSensorMsgPayload.h"
10+
#include "architecture/utilities/signalProcessing.h"
11+
#include <Eigen/Core>
12+
13+
/*! @brief Convert AccDataMsgPayload to IMUSensorMsgPayload Class */
14+
class MiruLowPassFilterConverter: public SysModel {
15+
public:
16+
MiruLowPassFilterConverter() = default; //!< Constructor
17+
~MiruLowPassFilterConverter() = default; //!< Destructor
18+
19+
void Reset(uint64_t CurrentSimNanos); //!< Reset member function
20+
void UpdateState(uint64_t CurrentSimNanos); //!< Update member function
21+
void setLowPassFilter(double step, double frequencyCutOff); //!< Setter method for the low pass filter
22+
23+
ReadFunctor<AccDataMsgPayload> imuAccelDataInMsg; //!< Input msg for the imu data
24+
Message<IMUSensorMsgPayload> imuSensorOutMsg; //!< Output msg for the imu data
25+
26+
BSKLogger *bskLogger; //!< BSK Logging
27+
28+
private:
29+
double cutOffFrequency = 15.0/(2*M_PI); //!< Low pass filter parameter
30+
double hStep = 0.5; //!< Low pass filter parameter
31+
};
32+
33+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
%module miruLowPassFilterConverter
2+
%{
3+
#include "miruLowPassFilterConverter.h"
4+
%}
5+
6+
%pythoncode %{
7+
from Basilisk.architecture.swig_common_model import *
8+
%}
9+
%include "std_string.i"
10+
%include "swig_conly_data.i"
11+
12+
%include "sys_model.i"
13+
%include "miruLowPassFilterConverter.h"
14+
15+
%include "architecture/msgPayloadDefC/AccDataMsgPayload.h"
16+
%include "architecture/msgPayloadDefC/IMUSensorMsgPayload.h"
17+
18+
%pythoncode %{
19+
import sys
20+
protectAllClasses(sys.modules[__name__])
21+
%}

0 commit comments

Comments
 (0)