refactor(device): move get/set params to channels adapter
This commit is contained in:
parent
52f1075182
commit
34283fda0c
|
@ -430,199 +430,6 @@ void Channels::StopImuTracking() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T _from_data(const std::uint8_t *data) {
|
|
||||||
std::size_t size = sizeof(T) / sizeof(std::uint8_t);
|
|
||||||
T value = 0;
|
|
||||||
for (std::size_t i = 0; i < size; i++) {
|
|
||||||
value |= data[i] << (8 * (size - i - 1));
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
double _from_data(const std::uint8_t *data) {
|
|
||||||
return *(reinterpret_cast<const double *>(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string _from_data(const std::uint8_t *data, std::size_t count) {
|
|
||||||
std::string s(reinterpret_cast<const char *>(data), count);
|
|
||||||
strings::trim(s);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(Channels::device_info_t *info, const std::uint8_t *data) {
|
|
||||||
std::size_t i = 4; // skip vid, pid
|
|
||||||
// name, 16
|
|
||||||
info->name = _from_data(data + i, 16);
|
|
||||||
i += 16;
|
|
||||||
// serial_number, 16
|
|
||||||
info->serial_number = _from_data(data + i, 16);
|
|
||||||
i += 16;
|
|
||||||
// firmware_version, 2
|
|
||||||
info->firmware_version.set_major(data[i]);
|
|
||||||
info->firmware_version.set_minor(data[i + 1]);
|
|
||||||
i += 2;
|
|
||||||
// hardware_version, 3
|
|
||||||
info->hardware_version.set_major(data[i]);
|
|
||||||
info->hardware_version.set_minor(data[i + 1]);
|
|
||||||
info->hardware_version.set_flag(std::bitset<8>(data[i + 2]));
|
|
||||||
i += 3;
|
|
||||||
// spec_version, 2
|
|
||||||
info->spec_version.set_major(data[i]);
|
|
||||||
info->spec_version.set_minor(data[i + 1]);
|
|
||||||
i += 2;
|
|
||||||
// lens_type, 4
|
|
||||||
info->lens_type.set_vendor(_from_data<std::uint16_t>(data + i));
|
|
||||||
info->lens_type.set_product(_from_data<std::uint16_t>(data + i + 2));
|
|
||||||
i += 4;
|
|
||||||
// imu_type, 4
|
|
||||||
info->imu_type.set_vendor(_from_data<std::uint16_t>(data + i));
|
|
||||||
info->imu_type.set_product(_from_data<std::uint16_t>(data + i + 2));
|
|
||||||
i += 4;
|
|
||||||
// nominal_baseline, 2
|
|
||||||
info->nominal_baseline = _from_data<std::uint16_t>(data + i);
|
|
||||||
i += 2;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(
|
|
||||||
Intrinsics *in, const std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// width, 2
|
|
||||||
in->width = _from_data<std::uint16_t>(data + i);
|
|
||||||
i += 2;
|
|
||||||
// height, 2
|
|
||||||
in->height = _from_data<std::uint16_t>(data + i);
|
|
||||||
i += 2;
|
|
||||||
// fx, 8
|
|
||||||
in->fx = _from_data<double>(data + i);
|
|
||||||
i += 8;
|
|
||||||
// fy, 8
|
|
||||||
in->fy = _from_data<double>(data + i);
|
|
||||||
i += 8;
|
|
||||||
// cx, 8
|
|
||||||
in->cx = _from_data<double>(data + i);
|
|
||||||
i += 8;
|
|
||||||
// cy, 8
|
|
||||||
in->cy = _from_data<double>(data + i);
|
|
||||||
i += 8;
|
|
||||||
// model, 1
|
|
||||||
in->model = data[i];
|
|
||||||
i += 1;
|
|
||||||
// coeffs, 40
|
|
||||||
for (std::size_t j = 0; j < 5; j++) {
|
|
||||||
in->coeffs[j] = _from_data<double>(data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 40;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(
|
|
||||||
ImuIntrinsics *in, const std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// scale
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
for (std::size_t k = 0; k < 3; k++) {
|
|
||||||
in->scale[j][k] = _from_data<double>(data + i + (j * 3 + k) * 8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += 72;
|
|
||||||
// drift
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
in->drift[j] = _from_data<double>(data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
// noise
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
in->noise[j] = _from_data<double>(data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
// bias
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
in->bias[j] = _from_data<double>(data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(
|
|
||||||
Extrinsics *ex, const std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// rotation
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
for (std::size_t k = 0; k < 3; k++) {
|
|
||||||
ex->rotation[j][k] = _from_data<double>(data + i + (j * 3 + k) * 8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += 72;
|
|
||||||
// translation
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
ex->translation[j] = _from_data<double>(data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(
|
|
||||||
Channels::img_params_t *img_params, const std::uint8_t *data,
|
|
||||||
const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// TODO(JohnZhao)
|
|
||||||
Intrinsics in_left, in_right;
|
|
||||||
Extrinsics ex_right_to_left;
|
|
||||||
|
|
||||||
if (spec_version->major() == 1) {
|
|
||||||
if (spec_version->minor() == 0) {
|
|
||||||
i += from_data(&in_left, data + i, spec_version);
|
|
||||||
i += from_data(&in_right, data + i, spec_version);
|
|
||||||
i += from_data(&ex_right_to_left, data + i, spec_version);
|
|
||||||
(*img_params)[{752, 480}] = {true, in_left, in_right, ex_right_to_left};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spec_version->minor() == 1) {
|
|
||||||
i += from_data(&in_left, data + i, spec_version);
|
|
||||||
i += from_data(&in_right, data + i, spec_version);
|
|
||||||
(*img_params)[{1280, 400}] = {true, in_left, in_right, ex_right_to_left};
|
|
||||||
|
|
||||||
i += from_data(&in_left, data + i, spec_version);
|
|
||||||
i += from_data(&in_right, data + i, spec_version);
|
|
||||||
(*img_params)[{2560, 800}] = {true, in_left, in_right, ex_right_to_left};
|
|
||||||
|
|
||||||
i += from_data(&ex_right_to_left, data + i, spec_version);
|
|
||||||
(*img_params)[{1280, 400}].ex_right_to_left = ex_right_to_left;
|
|
||||||
(*img_params)[{2560, 800}].ex_right_to_left = ex_right_to_left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t from_data(
|
|
||||||
Channels::imu_params_t *imu_params, const std::uint8_t *data,
|
|
||||||
const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
i += from_data(&imu_params->in_accel, data + i, spec_version);
|
|
||||||
i += from_data(&imu_params->in_gyro, data + i, spec_version);
|
|
||||||
i += from_data(&imu_params->ex_left_to_imu, data + i, spec_version);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
bool Channels::GetFiles(
|
bool Channels::GetFiles(
|
||||||
device_info_t *info, img_params_t *img_params, imu_params_t *imu_params,
|
device_info_t *info, img_params_t *img_params, imu_params_t *imu_params,
|
||||||
Version *spec_version) const {
|
Version *spec_version) const {
|
||||||
|
@ -650,7 +457,7 @@ bool Channels::GetFiles(
|
||||||
|
|
||||||
if (XuFileQuery(uvc::XU_QUERY_GET, 2000, data)) {
|
if (XuFileQuery(uvc::XU_QUERY_GET, 2000, data)) {
|
||||||
// header = std::bitset<8>(data[0]);
|
// header = std::bitset<8>(data[0]);
|
||||||
std::uint16_t size = _from_data<std::uint16_t>(data + 1);
|
std::uint16_t size = bytes::_from_data<std::uint16_t>(data + 1);
|
||||||
std::uint8_t checksum = data[3 + size];
|
std::uint8_t checksum = data[3 + size];
|
||||||
VLOG(2) << "GetFiles data size: " << size << ", checksum: 0x" << std::hex
|
VLOG(2) << "GetFiles data size: " << size << ", checksum: 0x" << std::hex
|
||||||
<< std::setw(2) << std::setfill('0') << static_cast<int>(checksum);
|
<< std::setw(2) << std::setfill('0') << static_cast<int>(checksum);
|
||||||
|
@ -673,13 +480,13 @@ bool Channels::GetFiles(
|
||||||
std::size_t end = 3 + size;
|
std::size_t end = 3 + size;
|
||||||
while (i < end) {
|
while (i < end) {
|
||||||
std::uint8_t file_id = *(data + i);
|
std::uint8_t file_id = *(data + i);
|
||||||
std::uint16_t file_size = _from_data<std::uint16_t>(data + i + 1);
|
std::uint16_t file_size = bytes::_from_data<std::uint16_t>(data + i + 1);
|
||||||
VLOG(2) << "GetFiles id: " << static_cast<int>(file_id)
|
VLOG(2) << "GetFiles id: " << static_cast<int>(file_id)
|
||||||
<< ", size: " << file_size;
|
<< ", size: " << file_size;
|
||||||
i += 3;
|
i += 3;
|
||||||
switch (file_id) {
|
switch (file_id) {
|
||||||
case FID_DEVICE_INFO: {
|
case FID_DEVICE_INFO: {
|
||||||
CHECK_EQ(from_data(info, data + i), file_size)
|
CHECK_EQ(bytes::from_data(info, data + i), file_size)
|
||||||
<< "The firmware not support getting device info, you could "
|
<< "The firmware not support getting device info, you could "
|
||||||
"upgrade to latest";
|
"upgrade to latest";
|
||||||
spec_ver = &info->spec_version;
|
spec_ver = &info->spec_version;
|
||||||
|
@ -688,16 +495,19 @@ bool Channels::GetFiles(
|
||||||
case FID_IMG_PARAMS: {
|
case FID_IMG_PARAMS: {
|
||||||
if (file_size > 0) {
|
if (file_size > 0) {
|
||||||
CheckSpecVersion(spec_ver);
|
CheckSpecVersion(spec_ver);
|
||||||
from_data(img_params, data + i, spec_ver);
|
/*auto &&n = */adapter_->GetImgParamsFromData(
|
||||||
|
data + i, spec_ver, img_params);
|
||||||
// Considering the upgrade, comment this
|
// Considering the upgrade, comment this
|
||||||
// CHECK_EQ(from_data(img_params, data + i, spec_ver), file_size);
|
// CHECK_EQ(n, file_size);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case FID_IMU_PARAMS: {
|
case FID_IMU_PARAMS: {
|
||||||
imu_params->ok = file_size > 0;
|
imu_params->ok = file_size > 0;
|
||||||
if (imu_params->ok) {
|
if (imu_params->ok) {
|
||||||
CheckSpecVersion(spec_ver);
|
CheckSpecVersion(spec_ver);
|
||||||
CHECK_EQ(from_data(imu_params, data + i, spec_ver), file_size);
|
auto &&n = adapter_->GetImuParamsFromData(
|
||||||
|
data + i, spec_ver, imu_params);
|
||||||
|
CHECK_EQ(n, file_size);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
|
@ -714,220 +524,6 @@ bool Channels::GetFiles(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
std::size_t _to_data(T value, std::uint8_t *data) {
|
|
||||||
std::size_t size = sizeof(T) / sizeof(std::uint8_t);
|
|
||||||
for (std::size_t i = 0; i < size; i++) {
|
|
||||||
data[i] = static_cast<std::uint8_t>((value >> (8 * (size - i - 1))) & 0xFF);
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
std::size_t _to_data(double value, std::uint8_t *data) {
|
|
||||||
std::uint8_t *val = reinterpret_cast<std::uint8_t *>(&value);
|
|
||||||
std::copy(val, val + 8, data);
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t _to_data(std::string value, std::uint8_t *data, std::size_t count) {
|
|
||||||
std::copy(value.begin(), value.end(), data);
|
|
||||||
for (std::size_t i = value.size(); i < count; i++) {
|
|
||||||
data[i] = ' ';
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const Channels::device_info_t *info, std::uint8_t *data,
|
|
||||||
const Version *spec_version) {
|
|
||||||
std::size_t i = 3; // skip id, size
|
|
||||||
i += 4; // skip vid, pid
|
|
||||||
// name, 16
|
|
||||||
_to_data(info->name, data + i, 16);
|
|
||||||
i += 16;
|
|
||||||
// serial_number, 16
|
|
||||||
_to_data(info->serial_number, data + i, 16);
|
|
||||||
i += 16;
|
|
||||||
// firmware_version, 2
|
|
||||||
data[i] = info->firmware_version.major();
|
|
||||||
data[i + 1] = info->firmware_version.minor();
|
|
||||||
i += 2;
|
|
||||||
// hardware_version, 3
|
|
||||||
data[i] = info->hardware_version.major();
|
|
||||||
data[i + 1] = info->hardware_version.minor();
|
|
||||||
data[i + 2] =
|
|
||||||
static_cast<std::uint8_t>(info->hardware_version.flag().to_ulong());
|
|
||||||
i += 3;
|
|
||||||
// spec_version, 2
|
|
||||||
data[i] = info->spec_version.major();
|
|
||||||
data[i + 1] = info->spec_version.minor();
|
|
||||||
i += 2;
|
|
||||||
// lens_type, 4
|
|
||||||
_to_data(info->lens_type.vendor(), data + i);
|
|
||||||
_to_data(info->lens_type.product(), data + i + 2);
|
|
||||||
i += 4;
|
|
||||||
// imu_type, 4
|
|
||||||
_to_data(info->imu_type.vendor(), data + i);
|
|
||||||
_to_data(info->imu_type.product(), data + i + 2);
|
|
||||||
i += 4;
|
|
||||||
// nominal_baseline, 2
|
|
||||||
_to_data(info->nominal_baseline, data + i);
|
|
||||||
i += 2;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
|
|
||||||
// others
|
|
||||||
std::size_t size = i - 3;
|
|
||||||
data[0] = Channels::FID_DEVICE_INFO;
|
|
||||||
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
|
||||||
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
|
||||||
return size + 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const Intrinsics *in, std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// width, 2
|
|
||||||
_to_data(in->width, data + i);
|
|
||||||
i += 2;
|
|
||||||
// height, 2
|
|
||||||
_to_data(in->height, data + i);
|
|
||||||
i += 2;
|
|
||||||
// fx, 8
|
|
||||||
_to_data(in->fx, data + i);
|
|
||||||
i += 8;
|
|
||||||
// fy, 8
|
|
||||||
_to_data(in->fy, data + i);
|
|
||||||
i += 8;
|
|
||||||
// cx, 8
|
|
||||||
_to_data(in->cx, data + i);
|
|
||||||
i += 8;
|
|
||||||
// cy, 8
|
|
||||||
_to_data(in->cy, data + i);
|
|
||||||
i += 8;
|
|
||||||
// model, 1
|
|
||||||
data[i] = in->model;
|
|
||||||
i += 1;
|
|
||||||
// coeffs, 40
|
|
||||||
for (std::size_t j = 0; j < 5; j++) {
|
|
||||||
_to_data(in->coeffs[j], data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 40;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const ImuIntrinsics *in, std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// scale
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
for (std::size_t k = 0; k < 3; k++) {
|
|
||||||
_to_data(in->scale[j][k], data + i + (j * 3 + k) * 8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += 72;
|
|
||||||
// drift
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
_to_data(in->drift[j], data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
// noise
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
_to_data(in->noise[j], data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
// bias
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
_to_data(in->bias[j], data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const Extrinsics *ex, std::uint8_t *data, const Version *spec_version) {
|
|
||||||
std::size_t i = 0;
|
|
||||||
|
|
||||||
// rotation
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
for (std::size_t k = 0; k < 3; k++) {
|
|
||||||
_to_data(ex->rotation[j][k], data + i + (j * 3 + k) * 8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += 72;
|
|
||||||
// translation
|
|
||||||
for (std::size_t j = 0; j < 3; j++) {
|
|
||||||
_to_data(ex->translation[j], data + i + j * 8);
|
|
||||||
}
|
|
||||||
i += 24;
|
|
||||||
|
|
||||||
MYNTEYE_UNUSED(spec_version)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const Channels::img_params_t *img_params, std::uint8_t *data,
|
|
||||||
const Version *spec_version) {
|
|
||||||
std::size_t i = 3; // skip id, size
|
|
||||||
|
|
||||||
// TODO(JohnZhao)
|
|
||||||
if (spec_version->major() == 1) {
|
|
||||||
if (spec_version->minor() == 0) {
|
|
||||||
auto &¶ms = (*img_params).at({752, 480});
|
|
||||||
i += to_data(¶ms.in_left, data + i, spec_version);
|
|
||||||
i += to_data(¶ms.in_right, data + i, spec_version);
|
|
||||||
i += to_data(¶ms.ex_right_to_left, data + i, spec_version);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spec_version->minor() == 1) {
|
|
||||||
{
|
|
||||||
auto &¶ms = (*img_params).at({1280, 400});
|
|
||||||
i += to_data(¶ms.in_left, data + i, spec_version);
|
|
||||||
i += to_data(¶ms.in_right, data + i, spec_version);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
auto &¶ms = (*img_params).at({2560, 800});
|
|
||||||
i += to_data(¶ms.in_left, data + i, spec_version);
|
|
||||||
i += to_data(¶ms.in_right, data + i, spec_version);
|
|
||||||
i += to_data(¶ms.ex_right_to_left, data + i, spec_version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// others
|
|
||||||
std::size_t size = i - 3;
|
|
||||||
data[0] = Channels::FID_IMG_PARAMS;
|
|
||||||
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
|
||||||
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
|
||||||
return size + 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t to_data(
|
|
||||||
const Channels::imu_params_t *imu_params, std::uint8_t *data,
|
|
||||||
const Version *spec_version) {
|
|
||||||
std::size_t i = 3; // skip id, size
|
|
||||||
i += to_data(&imu_params->in_accel, data + i, spec_version);
|
|
||||||
i += to_data(&imu_params->in_gyro, data + i, spec_version);
|
|
||||||
i += to_data(&imu_params->ex_left_to_imu, data + i, spec_version);
|
|
||||||
// others
|
|
||||||
std::size_t size = i - 3;
|
|
||||||
data[0] = Channels::FID_IMU_PARAMS;
|
|
||||||
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
|
||||||
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
|
||||||
return size + 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
bool Channels::SetFiles(
|
bool Channels::SetFiles(
|
||||||
device_info_t *info, img_params_t *img_params, imu_params_t *imu_params,
|
device_info_t *info, img_params_t *img_params, imu_params_t *imu_params,
|
||||||
Version *spec_version) {
|
Version *spec_version) {
|
||||||
|
@ -949,15 +545,15 @@ bool Channels::SetFiles(
|
||||||
std::uint16_t size = 0;
|
std::uint16_t size = 0;
|
||||||
if (info != nullptr) {
|
if (info != nullptr) {
|
||||||
header[0] = true;
|
header[0] = true;
|
||||||
size += to_data(info, data + 3 + size, spec_ver);
|
size += bytes::to_data(info, data + 3 + size, spec_ver);
|
||||||
}
|
}
|
||||||
if (img_params != nullptr) {
|
if (img_params != nullptr) {
|
||||||
header[1] = true;
|
header[1] = true;
|
||||||
size += to_data(img_params, data + 3 + size, spec_ver);
|
size += adapter_->SetImgParamsToData(img_params, spec_ver, data + 3 + size);
|
||||||
}
|
}
|
||||||
if (imu_params != nullptr) {
|
if (imu_params != nullptr) {
|
||||||
header[2] = true;
|
header[2] = true;
|
||||||
size += to_data(imu_params, data + 3 + size, spec_ver);
|
size += adapter_->SetImuParamsToData(imu_params, spec_ver, data + 3 + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
data[0] = static_cast<std::uint8_t>(header.to_ulong());
|
data[0] = static_cast<std::uint8_t>(header.to_ulong());
|
||||||
|
@ -1142,4 +738,309 @@ Channels::control_info_t Channels::XuControlInfo(Option option) const {
|
||||||
return {min, max, def};
|
return {min, max, def};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::size_t ChannelsAdapter::GetImuParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::imu_params_t *imu_params) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
i += bytes::from_data(&imu_params->in_accel, data + i, version);
|
||||||
|
i += bytes::from_data(&imu_params->in_gyro, data + i, version);
|
||||||
|
i += bytes::from_data(&imu_params->ex_left_to_imu, data + i, version);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t ChannelsAdapter::SetImuParamsToData(
|
||||||
|
const Channels::imu_params_t *imu_params, const Version *version,
|
||||||
|
std::uint8_t *data) {
|
||||||
|
std::size_t i = 3; // skip id, size
|
||||||
|
i += bytes::to_data(&imu_params->in_accel, data + i, version);
|
||||||
|
i += bytes::to_data(&imu_params->in_gyro, data + i, version);
|
||||||
|
i += bytes::to_data(&imu_params->ex_left_to_imu, data + i, version);
|
||||||
|
// others
|
||||||
|
std::size_t size = i - 3;
|
||||||
|
data[0] = Channels::FID_IMU_PARAMS;
|
||||||
|
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
||||||
|
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
||||||
|
return size + 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace bytes {
|
||||||
|
|
||||||
|
// from
|
||||||
|
|
||||||
|
std::string _from_data(const std::uint8_t *data, std::size_t count) {
|
||||||
|
std::string s(reinterpret_cast<const char *>(data), count);
|
||||||
|
strings::trim(s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t from_data(Channels::device_info_t *info, const std::uint8_t *data) {
|
||||||
|
std::size_t i = 4; // skip vid, pid
|
||||||
|
// name, 16
|
||||||
|
info->name = _from_data(data + i, 16);
|
||||||
|
i += 16;
|
||||||
|
// serial_number, 16
|
||||||
|
info->serial_number = _from_data(data + i, 16);
|
||||||
|
i += 16;
|
||||||
|
// firmware_version, 2
|
||||||
|
info->firmware_version.set_major(data[i]);
|
||||||
|
info->firmware_version.set_minor(data[i + 1]);
|
||||||
|
i += 2;
|
||||||
|
// hardware_version, 3
|
||||||
|
info->hardware_version.set_major(data[i]);
|
||||||
|
info->hardware_version.set_minor(data[i + 1]);
|
||||||
|
info->hardware_version.set_flag(std::bitset<8>(data[i + 2]));
|
||||||
|
i += 3;
|
||||||
|
// spec_version, 2
|
||||||
|
info->spec_version.set_major(data[i]);
|
||||||
|
info->spec_version.set_minor(data[i + 1]);
|
||||||
|
i += 2;
|
||||||
|
// lens_type, 4
|
||||||
|
info->lens_type.set_vendor(_from_data<std::uint16_t>(data + i));
|
||||||
|
info->lens_type.set_product(_from_data<std::uint16_t>(data + i + 2));
|
||||||
|
i += 4;
|
||||||
|
// imu_type, 4
|
||||||
|
info->imu_type.set_vendor(_from_data<std::uint16_t>(data + i));
|
||||||
|
info->imu_type.set_product(_from_data<std::uint16_t>(data + i + 2));
|
||||||
|
i += 4;
|
||||||
|
// nominal_baseline, 2
|
||||||
|
info->nominal_baseline = _from_data<std::uint16_t>(data + i);
|
||||||
|
i += 2;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t from_data(Intrinsics *in, const std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// width, 2
|
||||||
|
in->width = _from_data<std::uint16_t>(data + i);
|
||||||
|
i += 2;
|
||||||
|
// height, 2
|
||||||
|
in->height = _from_data<std::uint16_t>(data + i);
|
||||||
|
i += 2;
|
||||||
|
// fx, 8
|
||||||
|
in->fx = _from_data<double>(data + i);
|
||||||
|
i += 8;
|
||||||
|
// fy, 8
|
||||||
|
in->fy = _from_data<double>(data + i);
|
||||||
|
i += 8;
|
||||||
|
// cx, 8
|
||||||
|
in->cx = _from_data<double>(data + i);
|
||||||
|
i += 8;
|
||||||
|
// cy, 8
|
||||||
|
in->cy = _from_data<double>(data + i);
|
||||||
|
i += 8;
|
||||||
|
// model, 1
|
||||||
|
in->model = data[i];
|
||||||
|
i += 1;
|
||||||
|
// coeffs, 40
|
||||||
|
for (std::size_t j = 0; j < 5; j++) {
|
||||||
|
in->coeffs[j] = _from_data<double>(data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 40;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t from_data(ImuIntrinsics *in, const std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// scale
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
for (std::size_t k = 0; k < 3; k++) {
|
||||||
|
in->scale[j][k] = _from_data<double>(data + i + (j * 3 + k) * 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 72;
|
||||||
|
// drift
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
in->drift[j] = _from_data<double>(data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
// noise
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
in->noise[j] = _from_data<double>(data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
// bias
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
in->bias[j] = _from_data<double>(data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t from_data(Extrinsics *ex, const std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// rotation
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
for (std::size_t k = 0; k < 3; k++) {
|
||||||
|
ex->rotation[j][k] = _from_data<double>(data + i + (j * 3 + k) * 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 72;
|
||||||
|
// translation
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
ex->translation[j] = _from_data<double>(data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// to
|
||||||
|
|
||||||
|
std::size_t _to_data(std::string value, std::uint8_t *data, std::size_t count) {
|
||||||
|
std::copy(value.begin(), value.end(), data);
|
||||||
|
for (std::size_t i = value.size(); i < count; i++) {
|
||||||
|
data[i] = ' ';
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t to_data(const Channels::device_info_t *info, std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 3; // skip id, size
|
||||||
|
i += 4; // skip vid, pid
|
||||||
|
// name, 16
|
||||||
|
_to_data(info->name, data + i, 16);
|
||||||
|
i += 16;
|
||||||
|
// serial_number, 16
|
||||||
|
_to_data(info->serial_number, data + i, 16);
|
||||||
|
i += 16;
|
||||||
|
// firmware_version, 2
|
||||||
|
data[i] = info->firmware_version.major();
|
||||||
|
data[i + 1] = info->firmware_version.minor();
|
||||||
|
i += 2;
|
||||||
|
// hardware_version, 3
|
||||||
|
data[i] = info->hardware_version.major();
|
||||||
|
data[i + 1] = info->hardware_version.minor();
|
||||||
|
data[i + 2] =
|
||||||
|
static_cast<std::uint8_t>(info->hardware_version.flag().to_ulong());
|
||||||
|
i += 3;
|
||||||
|
// spec_version, 2
|
||||||
|
data[i] = info->spec_version.major();
|
||||||
|
data[i + 1] = info->spec_version.minor();
|
||||||
|
i += 2;
|
||||||
|
// lens_type, 4
|
||||||
|
_to_data(info->lens_type.vendor(), data + i);
|
||||||
|
_to_data(info->lens_type.product(), data + i + 2);
|
||||||
|
i += 4;
|
||||||
|
// imu_type, 4
|
||||||
|
_to_data(info->imu_type.vendor(), data + i);
|
||||||
|
_to_data(info->imu_type.product(), data + i + 2);
|
||||||
|
i += 4;
|
||||||
|
// nominal_baseline, 2
|
||||||
|
_to_data(info->nominal_baseline, data + i);
|
||||||
|
i += 2;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
|
||||||
|
// others
|
||||||
|
std::size_t size = i - 3;
|
||||||
|
data[0] = Channels::FID_DEVICE_INFO;
|
||||||
|
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
||||||
|
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
||||||
|
return size + 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t to_data(const Intrinsics *in, std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// width, 2
|
||||||
|
_to_data(in->width, data + i);
|
||||||
|
i += 2;
|
||||||
|
// height, 2
|
||||||
|
_to_data(in->height, data + i);
|
||||||
|
i += 2;
|
||||||
|
// fx, 8
|
||||||
|
_to_data(in->fx, data + i);
|
||||||
|
i += 8;
|
||||||
|
// fy, 8
|
||||||
|
_to_data(in->fy, data + i);
|
||||||
|
i += 8;
|
||||||
|
// cx, 8
|
||||||
|
_to_data(in->cx, data + i);
|
||||||
|
i += 8;
|
||||||
|
// cy, 8
|
||||||
|
_to_data(in->cy, data + i);
|
||||||
|
i += 8;
|
||||||
|
// model, 1
|
||||||
|
data[i] = in->model;
|
||||||
|
i += 1;
|
||||||
|
// coeffs, 40
|
||||||
|
for (std::size_t j = 0; j < 5; j++) {
|
||||||
|
_to_data(in->coeffs[j], data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 40;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t to_data(const ImuIntrinsics *in, std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// scale
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
for (std::size_t k = 0; k < 3; k++) {
|
||||||
|
_to_data(in->scale[j][k], data + i + (j * 3 + k) * 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 72;
|
||||||
|
// drift
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
_to_data(in->drift[j], data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
// noise
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
_to_data(in->noise[j], data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
// bias
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
_to_data(in->bias[j], data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t to_data(const Extrinsics *ex, std::uint8_t *data,
|
||||||
|
const Version *spec_version) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
// rotation
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
for (std::size_t k = 0; k < 3; k++) {
|
||||||
|
_to_data(ex->rotation[j][k], data + i + (j * 3 + k) * 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 72;
|
||||||
|
// translation
|
||||||
|
for (std::size_t j = 0; j < 3; j++) {
|
||||||
|
_to_data(ex->translation[j], data + i + j * 8);
|
||||||
|
}
|
||||||
|
i += 24;
|
||||||
|
|
||||||
|
MYNTEYE_UNUSED(spec_version)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace bytes
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
|
@ -15,9 +15,11 @@
|
||||||
#define MYNTEYE_DEVICE_CHANNELS_H_
|
#define MYNTEYE_DEVICE_CHANNELS_H_
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -163,8 +165,88 @@ class ChannelsAdapter {
|
||||||
virtual std::vector<std::int32_t> GetGyroRangeValues() = 0;
|
virtual std::vector<std::int32_t> GetGyroRangeValues() = 0;
|
||||||
|
|
||||||
virtual void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) = 0;
|
virtual void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) = 0;
|
||||||
|
|
||||||
|
virtual std::size_t GetImgParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::img_params_t *img_params) = 0;
|
||||||
|
virtual std::size_t SetImgParamsToData(
|
||||||
|
const Channels::img_params_t *img_params, const Version *version,
|
||||||
|
std::uint8_t *data) = 0;
|
||||||
|
|
||||||
|
virtual std::size_t GetImuParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::imu_params_t *imu_params);
|
||||||
|
virtual std::size_t SetImuParamsToData(
|
||||||
|
const Channels::imu_params_t *imu_params, const Version *version,
|
||||||
|
std::uint8_t *data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace bytes {
|
||||||
|
|
||||||
|
// from
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T _from_data(const std::uint8_t *data) {
|
||||||
|
std::size_t size = sizeof(T) / sizeof(std::uint8_t);
|
||||||
|
T value = 0;
|
||||||
|
for (std::size_t i = 0; i < size; i++) {
|
||||||
|
value |= data[i] << (8 * (size - i - 1));
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline double _from_data(const std::uint8_t *data) {
|
||||||
|
return *(reinterpret_cast<const double *>(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string _from_data(const std::uint8_t *data, std::size_t count);
|
||||||
|
|
||||||
|
std::size_t from_data(Channels::device_info_t *info, const std::uint8_t *data);
|
||||||
|
|
||||||
|
std::size_t from_data(Intrinsics *in, const std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
std::size_t from_data(ImuIntrinsics *in, const std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
std::size_t from_data(Extrinsics *ex, const std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
// to
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::size_t _to_data(T value, std::uint8_t *data) {
|
||||||
|
std::size_t size = sizeof(T) / sizeof(std::uint8_t);
|
||||||
|
for (std::size_t i = 0; i < size; i++) {
|
||||||
|
data[i] = static_cast<std::uint8_t>((value >> (8 * (size - i - 1))) & 0xFF);
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline std::size_t _to_data(double value, std::uint8_t *data) {
|
||||||
|
std::uint8_t *val = reinterpret_cast<std::uint8_t *>(&value);
|
||||||
|
std::copy(val, val + 8, data);
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t _to_data(std::string value, std::uint8_t *data, std::size_t count);
|
||||||
|
|
||||||
|
std::size_t to_data(const Channels::device_info_t *info, std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
std::size_t to_data(const Intrinsics *in, std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
std::size_t to_data(const ImuIntrinsics *in, std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
std::size_t to_data(const Extrinsics *ex, std::uint8_t *data,
|
||||||
|
const Version *spec_version);
|
||||||
|
|
||||||
|
} // namespace bytes
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
||||||
#endif // MYNTEYE_DEVICE_CHANNELS_H_
|
#endif // MYNTEYE_DEVICE_CHANNELS_H_
|
||||||
|
|
|
@ -126,4 +126,38 @@ void StandardChannelsAdapter::GetImuResPacket(
|
||||||
unpack_imu_res_packet(data, res);
|
unpack_imu_res_packet(data, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t StandardChannelsAdapter::GetImgParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::img_params_t *img_params) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
Intrinsics in_left, in_right;
|
||||||
|
Extrinsics ex_right_to_left;
|
||||||
|
|
||||||
|
i += bytes::from_data(&in_left, data + i, version);
|
||||||
|
i += bytes::from_data(&in_right, data + i, version);
|
||||||
|
i += bytes::from_data(&ex_right_to_left, data + i, version);
|
||||||
|
(*img_params)[{752, 480}] = {true, in_left, in_right, ex_right_to_left};
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t StandardChannelsAdapter::SetImgParamsToData(
|
||||||
|
const Channels::img_params_t *img_params, const Version *version,
|
||||||
|
std::uint8_t *data) {
|
||||||
|
std::size_t i = 3; // skip id, size
|
||||||
|
|
||||||
|
auto &¶ms = (*img_params).at({752, 480});
|
||||||
|
i += bytes::to_data(¶ms.in_left, data + i, version);
|
||||||
|
i += bytes::to_data(¶ms.in_right, data + i, version);
|
||||||
|
i += bytes::to_data(¶ms.ex_right_to_left, data + i, version);
|
||||||
|
|
||||||
|
// others
|
||||||
|
std::size_t size = i - 3;
|
||||||
|
data[0] = Channels::FID_IMG_PARAMS;
|
||||||
|
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
||||||
|
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
||||||
|
return size + 3;
|
||||||
|
}
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
|
@ -37,6 +37,13 @@ class StandardChannelsAdapter : public ChannelsAdapter {
|
||||||
std::vector<std::int32_t> GetGyroRangeValues() override;
|
std::vector<std::int32_t> GetGyroRangeValues() override;
|
||||||
|
|
||||||
void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) override;
|
void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) override;
|
||||||
|
|
||||||
|
std::size_t GetImgParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::img_params_t *img_params) override;
|
||||||
|
std::size_t SetImgParamsToData(
|
||||||
|
const Channels::img_params_t *img_params, const Version *version,
|
||||||
|
std::uint8_t *data) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
|
@ -122,4 +122,52 @@ void Standard2ChannelsAdapter::GetImuResPacket(
|
||||||
unpack_imu_res_packet(data, res);
|
unpack_imu_res_packet(data, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t Standard2ChannelsAdapter::GetImgParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::img_params_t *img_params) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
Intrinsics in_left, in_right;
|
||||||
|
Extrinsics ex_right_to_left;
|
||||||
|
|
||||||
|
i += bytes::from_data(&in_left, data + i, version);
|
||||||
|
i += bytes::from_data(&in_right, data + i, version);
|
||||||
|
(*img_params)[{1280, 400}] = {true, in_left, in_right, ex_right_to_left};
|
||||||
|
|
||||||
|
i += bytes::from_data(&in_left, data + i, version);
|
||||||
|
i += bytes::from_data(&in_right, data + i, version);
|
||||||
|
(*img_params)[{2560, 800}] = {true, in_left, in_right, ex_right_to_left};
|
||||||
|
|
||||||
|
i += bytes::from_data(&ex_right_to_left, data + i, version);
|
||||||
|
(*img_params)[{1280, 400}].ex_right_to_left = ex_right_to_left;
|
||||||
|
(*img_params)[{2560, 800}].ex_right_to_left = ex_right_to_left;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t Standard2ChannelsAdapter::SetImgParamsToData(
|
||||||
|
const Channels::img_params_t *img_params, const Version *version,
|
||||||
|
std::uint8_t *data) {
|
||||||
|
std::size_t i = 3; // skip id, size
|
||||||
|
|
||||||
|
{
|
||||||
|
auto &¶ms = (*img_params).at({1280, 400});
|
||||||
|
i += bytes::to_data(¶ms.in_left, data + i, version);
|
||||||
|
i += bytes::to_data(¶ms.in_right, data + i, version);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto &¶ms = (*img_params).at({2560, 800});
|
||||||
|
i += bytes::to_data(¶ms.in_left, data + i, version);
|
||||||
|
i += bytes::to_data(¶ms.in_right, data + i, version);
|
||||||
|
i += bytes::to_data(¶ms.ex_right_to_left, data + i, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
// others
|
||||||
|
std::size_t size = i - 3;
|
||||||
|
data[0] = Channels::FID_IMG_PARAMS;
|
||||||
|
data[1] = static_cast<std::uint8_t>((size >> 8) & 0xFF);
|
||||||
|
data[2] = static_cast<std::uint8_t>(size & 0xFF);
|
||||||
|
return size + 3;
|
||||||
|
}
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
|
@ -37,6 +37,13 @@ class Standard2ChannelsAdapter : public ChannelsAdapter {
|
||||||
std::vector<std::int32_t> GetGyroRangeValues() override;
|
std::vector<std::int32_t> GetGyroRangeValues() override;
|
||||||
|
|
||||||
void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) override;
|
void GetImuResPacket(const std::uint8_t *data, ImuResPacket *res) override;
|
||||||
|
|
||||||
|
std::size_t GetImgParamsFromData(
|
||||||
|
const std::uint8_t *data, const Version *version,
|
||||||
|
Channels::img_params_t *img_params) override;
|
||||||
|
std::size_t SetImgParamsToData(
|
||||||
|
const Channels::img_params_t *img_params, const Version *version,
|
||||||
|
std::uint8_t *data) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
Loading…
Reference in New Issue
Block a user