11 #include <json/json.h>
13 #include <Eigen/Dense>
16 namespace visualization {
34 for (
int i = 0; i < n; i++) {
43 coeff_[0].block<17, 1>(0, 1) =
44 coeff_[1].block<17, 1>(0, 0) -
coeff_[0].block<17, 1>(0, 0);
45 coeff_[1].block<17, 1>(0, 1) =
46 coeff_[0].block<17, 1>(0, 0) -
coeff_[1].block<17, 1>(0, 0);
50 Eigen::MatrixXd A(n, n);
62 A(n - 1, n - 2) = 1.0;
63 A(n - 1, n - 1) = 4.0;
67 A(n - 1, n - 2) = 1.0;
68 A(n - 1, n - 1) = 2.0;
72 for (
int i = 1; i < n - 1; i++) {
78 auto llt_solver = A.llt();
80 for (
int k = 0; k < 17; k++) {
87 b(n - 1) = 3.0 * (
coeff_[0](k, 0) -
coeff_[n - 2](k, 0));
90 b(n - 1) = 3.0 * (
coeff_[n - 1](k, 0) -
coeff_[n - 2](k, 0));
94 for (
int i = 1; i < n - 1; i++) {
95 b(i) = 3.0 * (
coeff_[i + 1](k, 0) -
coeff_[i - 1](k, 0));
99 Eigen::VectorXd x = llt_solver.solve(b);
101 for (
int i = 0; i < n; i++) {
102 int i1 = (i + 1) % n;
107 2.0 * (
coeff_[i](k, 0) -
coeff_[i1](k, 0)) + x(i) + x(i1);
116 return std::make_tuple(
false, status);
118 size_t segment_index = k / (
interval_ + 1);
119 double segment_fraction =
121 Eigen::Vector4d s(1.0, segment_fraction,
122 segment_fraction * segment_fraction,
123 segment_fraction * segment_fraction * segment_fraction);
126 return std::make_tuple(
true, status);
130 Json::Value trajectory_array;
132 Json::Value status_object;
133 if (!status.ConvertToJsonValue(status_object)) {
136 trajectory_array.append(status_object);
138 value[
"class_name"] =
"ViewTrajectory";
139 value[
"version_major"] = 1;
140 value[
"version_minor"] = 0;
143 value[
"trajectory"] = trajectory_array;
148 if (!value.isObject()) {
150 "ViewTrajectory read JSON failed: unsupported json format.");
153 if (value.get(
"class_name",
"").asString() !=
"ViewTrajectory" ||
154 value.get(
"version_major", 1).asInt() != 1 ||
155 value.get(
"version_minor", 0).asInt() != 0) {
157 "ViewTrajectory read JSON failed: unsupported json format.");
160 is_loop_ = value.get(
"is_loop",
false).asBool();
161 interval_ = value.get(
"interval", 29).asInt();
162 const Json::Value &trajectory_array = value[
"trajectory"];
163 if (trajectory_array.empty()) {
165 "ViewTrajectory read JSON failed: empty trajectory.");
169 for (
int i = 0; i < (int)trajectory_array.size(); i++) {
170 const Json::Value &status_object = trajectory_array[i];
void ConvertFromVector17d(const Vector17d &v)
Eigen::Matrix< double, 17, 1 > Vector17d
bool ConvertFromJsonValue(const Json::Value &value) override
static const int INTERVAL_DEFAULT
std::vector< ViewParameters::Matrix17x4d, ViewParameters::Matrix17x4d_allocator > coeff_
size_t NumOfFrames() const
bool ConvertToJsonValue(Json::Value &value) const override
std::tuple< bool, ViewParameters > GetInterpolatedFrame(size_t k)
std::vector< ViewParameters > view_status_
bool ConvertFromJsonValue(const Json::Value &value) override
static const int INTERVAL_MAX
static const int INTERVAL_MIN
static const int INTERVAL_STEP
void ComputeInterpolationCoefficients()
Generic file read and write utility for python interface.