Program Listing for File ubx_nav_relposned.hpp
↰ Return to documentation for file (/tmp/ws/src/ublox_dgnss/ublox_dgnss_node/include/ublox_dgnss_node/ubx/nav/ubx_nav_relposned.hpp
)
// Copyright 2021 Australian Robotics Supplies & Technology
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef UBLOX_DGNSS_NODE__UBX__NAV__UBX_NAV_RELPOSNED_HPP_
#define UBLOX_DGNSS_NODE__UBX__NAV__UBX_NAV_RELPOSNED_HPP_
#include <unistd.h>
#include <memory>
#include <tuple>
#include <string>
#include "ublox_dgnss_node/ubx/ubx.hpp"
#include "ublox_dgnss_node/ubx/utils.hpp"
namespace ubx::nav::relposned
{
enum carrier_solution_status_t : u1_t {no_carrier_range_solution = 0,
carrier_phase_solution_with_floating_ambiguities = 1,
carrier_phase_solution_with_fixed_ambiguities = 2 };
struct status_flags_t
{
union {
x4_t all;
struct
{
l_t gnssFixOK : 1; // 1 = A valid fix (i.e within DOP & accuracy masks)
l_t diffSoln : 1; // 1 = differential corrections were applied
l_t relPosValid : 1; // 1 = relative position components and accuracies are valid
// and, in moving base mode only, if baseline is valid
carrier_solution_status_t carrSoln : 2; // carrier phase range solution
l_t isMoving : 1; // 1 if the received is operating in moving base mode
l_t refPosMiss : 1; // 1 if extrapolated reference position was used to compute
// moving base solution this epoch.
l_t refObsMiss : 1; // 1 if extrapolated reference observations were used to
// compute moving base solution this epoch.
l_t relPosHeadingValid : 1; // 1 = relPosHeading is valid
l_t relPosNormalized : 1; // 1 = components of the relative position vector
// (including the high-precision parts) are normalized
} bits;
};
};
class NavRelPosNedPayload : UBXPayload
{
public:
static const msg_class_t MSG_CLASS = UBX_NAV;
static const msg_id_t MSG_ID = UBX_NAV_RELPOSNED;
u1_t version; // message version (0x01 for this version)
u1_t reserved0; // reserved
u2_t refStationId; // reference station ID. Must be in the range 0..4095
u4_t iTOW; // ms - GPS Time of week of the navigation epoch.
i4_t relPosN; // cm - North component of relative position vector
i4_t relPosE; // cm - East component of relative position vector
i4_t relPosD; // cm - Down component of relative position vector
i4_t relPosLength; // cm - Length of the relative position vector
i4_t relPosHeading; // deg scale 1e-5 - Heading of the relative position vector
u1_t reserved1[4]; // reserved
i1_t relPosHPN; // mm scale 0.1 - full HP North is given by relPosN + (relPosHPN * 1e-2)
i1_t relPosHPE; // mm scale 0.1 - full HP East is given by relPosE + (relPosHPE * 1e-2)
i1_t relPosHPD; // mm scale 0.1 - full HP Down is given by relPosD + (relPosHPD * 1e-2)
i1_t relPosHPLength; // mm scale 0.1 - full HP length is given by
// relPosLength + (relPosHPLength * 1e-2)
u4_t accN; // mm scale 0.1 - Accuracy of relative position North Component
u4_t accE; // mm scale 0.1 - Accuracy of relative position East Component
u4_t accD; // mm scale 0.1 - Accuracy of relative position Down Component
u4_t accLength; // mm scale 0.1 - Accuracy of length of the relative position vector
u4_t accHeading; // deg scale 1e-5 - Accuracy of heading of the relative position vector
u1_t reserved2[4]; // reserved
status_flags_t flags; // navigation status flags
public:
NavRelPosNedPayload()
: UBXPayload(MSG_CLASS, MSG_ID)
{
}
NavRelPosNedPayload(ch_t * payload_polled, u2_t size)
: UBXPayload(MSG_CLASS, MSG_ID)
{
payload_.clear();
payload_.reserve(size);
payload_.resize(size);
memcpy(payload_.data(), payload_polled, size);
version = buf_offset<u1_t>(&payload_, 0);
refStationId = buf_offset<u2_t>(&payload_, 2);
iTOW = buf_offset<u4_t>(&payload_, 4);
relPosN = buf_offset<i4_t>(&payload_, 8);
relPosE = buf_offset<i4_t>(&payload_, 12);
relPosD = buf_offset<i4_t>(&payload_, 16);
relPosLength = buf_offset<i4_t>(&payload_, 20);
relPosHeading = buf_offset<i4_t>(&payload_, 24);
relPosHPN = buf_offset<i1_t>(&payload_, 32);
relPosHPE = buf_offset<i1_t>(&payload_, 33);
relPosHPD = buf_offset<i1_t>(&payload_, 34);
relPosHPLength = buf_offset<i1_t>(&payload_, 35);
accN = buf_offset<u4_t>(&payload_, 36);
accE = buf_offset<u4_t>(&payload_, 40);
accD = buf_offset<u4_t>(&payload_, 44);
accLength = buf_offset<u4_t>(&payload_, 48);
accHeading = buf_offset<u4_t>(&payload_, 52);
flags = buf_offset<status_flags_t>(&payload_, 60);
}
std::tuple<u1_t *, size_t> make_poll_payload()
{
payload_.clear();
return std::make_tuple(payload_.data(), payload_.size());
}
std::string to_string()
{
std::ostringstream oss;
oss << std::fixed;
oss << "ver: " << +version;
oss << " refStationId: " << +refStationId;
oss << " iTOW: " << iTOW;
oss << " relPos - N: " << +relPosN;
oss << " E: " << +relPosE;
oss << " D: " << +relPosD;
oss << " length: " << +relPosLength;
oss << std::setprecision(5);
oss << " heading:" << +relPosHeading * 1e-5;
oss << std::setprecision(1);
oss << " relPosHP - N: " << +relPosHPN * 0.1;
oss << " E: " << +relPosHPE * 0.1;
oss << " D: " << +relPosHPD * 0.1;
oss << " length: " << +relPosHPLength * 0.1;
oss << std::setprecision(2);
oss << " precise HP - N: " << +(relPosN + (relPosHPN * 1e-2));
oss << " E: " << +(relPosE + (relPosHPE * 1e-2));
oss << " D: " << +(relPosD + (relPosHPD * 1e-2));
oss << " length: " << +(relPosLength + (relPosHPLength * 1e-2));
oss << std::setprecision(1);
oss << " acc - N: " << +accN * 0.1;
oss << " E: " << +accE * 0.1;
oss << " D: " << +accD * 0.1;
oss << " length: " << +accLength * 0.1;
oss << std::setprecision(5);
oss << " heading: " << +accHeading * 1e-5;
oss << " flags - ";
oss << std::setprecision(0);
oss << " gnssFixOK: " << +flags.bits.gnssFixOK;
oss << " diffSoln: " << +flags.bits.diffSoln;
oss << " relPosValid: " << +flags.bits.relPosValid;
oss << " carrSoln: " << +flags.bits.carrSoln;
oss << " isMoving: " << +flags.bits.isMoving;
oss << " refPosMiss: " << +flags.bits.refPosMiss;
oss << " refObsMiss: " << +flags.bits.refObsMiss;
oss << " relPosHeadingValid: " << +flags.bits.relPosHeadingValid;
oss << " relPosNormalized: " << +flags.bits.relPosNormalized;
return oss.str();
}
};
} // namespace ubx::nav::relposned
#endif // UBLOX_DGNSS_NODE__UBX__NAV__UBX_NAV_RELPOSNED_HPP_