33 std::chrono::milliseconds timeout,
36 const Eigen::Matrix3f rotMat)
38 sampleOption(sampleOption), antPosA(antPosA), antPosB(antPosB),
57 preSampleBin1 =
"$VNBOM,1*749D\n";
59 preSampleBin1 =
"$VNBOM,1*45\n";
67 LOG_ERR(
logger,
"Unable to initialize the receive VN300 string");
81 LOG_ERR(
logger,
"Unable to disable async messages from vn300");
87 LOG_ERR(
logger,
"Unable to config the user vn300 serial port");
98 if (!setBinaryOutput())
104 if (!setAntennaA(antPosA))
110 if (!setCompassBaseline(antPosB))
116 if (!setReferenceFrame(rotMat))
126 LOG_ERR(
logger,
"Unable to set the vn300 user selected CRC");
132 LOG_ERR(
logger,
"Unable to disable async messages from vn300");
148 D(assert(
isInit &&
"init() was not called"));
159 return sampleReduced();
172 VN300Defs::BinaryDataFull bindataFull;
178 bool validChecksum =
false;
181 getBinaryOutput<VN300Defs::BinaryDataFull>(bindataFull, preSampleBin1);
188 sizeof(bindataFull)) == 0;
189 if (sampleOutcome && !validChecksum)
193 sampleOutcome = sampleOutcome && validChecksum;
197 buildBinaryDataFull(bindataFull, data, timestamp);
207VN300Data VN300::sampleReduced()
210 VN300Defs::BinaryDataReduced binDataReduced;
216 bool validChecksum =
false;
218 sampleOutcome = getBinaryOutput<VN300Defs::BinaryDataReduced>(
219 binDataReduced, preSampleBin1);
226 sizeof(binDataReduced)) == 0;
227 if (sampleOutcome && !validChecksum)
231 sampleOutcome = sampleOutcome && validChecksum;
235 buildBinaryDataReduced(binDataReduced, data, timestamp);
245void VN300::buildBinaryDataFull(
const VN300Defs::BinaryDataFull& rawData,
246 VN300Data& data,
const uint64_t timestamp)
250 data.quaternionW = rawData.quaternionW;
251 data.quaternionX = rawData.quaternionX;
252 data.quaternionY = rawData.quaternionY;
253 data.quaternionZ = rawData.quaternionZ;
256 data.accelerationTimestamp = timestamp;
257 data.accelerationX = rawData.accelX;
258 data.accelerationY = rawData.accelY;
259 data.accelerationZ = rawData.accelZ;
262 data.magneticFieldTimestamp = timestamp;
263 data.magneticFieldX = rawData.magneticX;
264 data.magneticFieldY = rawData.magneticY;
265 data.magneticFieldZ = rawData.magneticZ;
268 data.angularSpeedTimestamp = timestamp;
269 data.angularSpeedX = rawData.angularX;
270 data.angularSpeedY = rawData.angularY;
271 data.angularSpeedZ = rawData.angularZ;
274 data.insTimestamp = timestamp;
275 data.gpsFix = rawData.gpsFix;
276 data.insStatus = rawData.insStatus;
277 data.yaw = rawData.yaw;
278 data.pitch = rawData.pitch;
279 data.roll = rawData.roll;
280 data.latitude = rawData.latitude;
281 data.longitude = rawData.longitude;
282 data.altitude = rawData.altitude;
283 data.velocityX = rawData.velocityX;
284 data.velocityY = rawData.velocityY;
285 data.velocityZ = rawData.velocityZ;
288void VN300::buildBinaryDataReduced(
const VN300Defs::BinaryDataReduced& rawData,
289 VN300Data& data,
const uint64_t timestamp)
294 data.insTimestamp = timestamp;
295 data.latitude = rawData.latitude;
296 data.longitude = rawData.longitude;
297 data.altitude = rawData.altitude;
298 data.gpsFix = rawData.gpsFix;
301 data.angularSpeedTimestamp = timestamp;
302 data.angularSpeedX = rawData.angularX;
303 data.angularSpeedY = rawData.angularY;
304 data.angularSpeedZ = rawData.angularZ;
307 data.yaw = rawData.yaw;
308 data.pitch = rawData.pitch;
309 data.roll = rawData.roll;
312 data.quaternionTimestamp = timestamp;
313 data.quaternionW = rawData.quaternionW;
314 data.quaternionX = rawData.quaternionX;
315 data.quaternionY = rawData.quaternionY;
316 data.quaternionZ = rawData.quaternionZ;
319 data.accelerationTimestamp = timestamp;
320 data.accelerationX = rawData.accelX;
321 data.accelerationY = rawData.accelY;
322 data.accelerationZ = rawData.accelZ;
325bool VN300::setAntennaA(VN300Defs::AntennaPosition antPos)
327 std::string command = fmt::format(
"{}{},{},{}",
"VNWRG,57,", antPos.posX,
328 antPos.posY, antPos.posZ);
343bool VN300::setCompassBaseline(VN300Defs::AntennaPosition antPos)
345 std::string command = fmt::format(
"{}{},{},{},{},{},{}",
"VNWRG,93,",
346 antPos.posX, antPos.posY, antPos.posZ,
347 antPos.uncX, antPos.uncY, antPos.uncZ);
362bool VN300::setReferenceFrame(Eigen::Matrix3f rotMat)
364 std::string command =
365 fmt::format(
"{}{},{},{},{},{},{},{},{},{}",
"VNWRG,26,", rotMat(0, 0),
366 rotMat(0, 1), rotMat(0, 2), rotMat(1, 0), rotMat(1, 1),
367 rotMat(1, 2), rotMat(2, 0), rotMat(2, 1), rotMat(2, 2));
382bool VN300::setBinaryOutput()
384 uint16_t outputGroup = 0, commonGroup = 0, gnssGroup = 0;
386 switch (sampleOption)
418 const char*
const comp =
"VNWRG,75,0,8";
420 std::string command = fmt::format(
"{},{},{:x},{:x}", comp, outputGroup,
421 commonGroup, gnssGroup);
430 LOG_WARN(
logger,
"Unable to sample due to serial communication error");
#define LOG_WARN(logger,...)
#define LOG_ERR(logger,...)
Driver for STM32F4 low level USART/UART peripheral.
void clearQueue()
Clears the rxQueue.
VN300(USART &usart, int userBaudRate, VN300Defs::SampleOptions sampleOption, CRCOptions crc, std::chrono::milliseconds timeout, VN300Defs::AntennaPosition antPosA={0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, VN300Defs::AntennaPosition antPosB={1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, Eigen::Matrix3f rotMat=Eigen::Matrix3f::Identity())
Constructor.
bool selfTest() override
Check if the sensor is working.
bool init() override
Initialize the sensor.
VN300Data sampleImpl() override
Sample action implementation.
uint8_t checkErrorVN(const char *message)
Check if the message received from the sensor contains an error.
uint16_t calculateChecksum16(const uint8_t *message, int length)
Calculate the 16bit array on the given array.
bool setCrc(bool waitResponse=true)
Sets the user selected crc method.
static const uint8_t recvStringMaxDimension
Maximum size of the receiving string.
bool verifyModelNumber(const char *expectedModelNumber)
Verify the model number of the sensor.
bool disableAsyncMessages(bool waitResponse)
Disables the async messages that the sensor is default configured to send at 40Hz on startup.
std::array< char, recvStringMaxDimension > recvString
Buffer used to store the string received from the sensor.
bool recvStringCommand(char *command, int maxLength)
Receives a command from the sensor but swaps the first with a \0 to close the message.
bool configUserSerialPort()
Configures the user defined serial communication.
void configDefaultSerialPort()
Configures the default serial communication.
bool sendStringCommand(std::string command)
Sends the command to the sensor with the correct checksum added so '*' symbol is not needed at the en...
USART & usart
Serial interface that is needed to communicate with the sensor via ASCII codes.
uint64_t getTimestamp()
Returns the current timer value in microseconds.
@ COMMONGROUP_VELOCITY
Velocity.
@ COMMONGROUP_YAWPITCHROLL
Yaw pitch roll.
@ COMMONGROUP_ACCEL
Acceleration compensated (body).
@ COMMONGROUP_ANGULARRATE
Angular Rate.
@ COMMONGROUP_INSSTATUS
Ins status.
@ COMMONGROUP_QUATERNION
Quaternion.
@ COMMONGROUP_MAGPRES
Compensated magnetic, temperature and pressure.
@ BINARYGROUP_COMMON
Common group.
@ BINARYGROUP_GPS
GPS group.
SampleOptions
Sample options (data output packets) available.
@ REDUCED
Only data needed for the reduced data packet.
@ FULL
All data is sampled.
@ GPSGROUP_NUMSATS
Number of tracked satellites.
@ GPSGROUP_POSLLA
Gps position (latitude, longitude, altitude).
This file includes all the types the logdecoder script will decode.
SensorErrors
Generic error codes that a sensor can generate.
uint64_t quaternionTimestamp
Structure to handle antenna A position units [m].