opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
inverse_kinematics.h
Go to the documentation of this file.
1#pragma once
2
4#include <libopynsim/symbol.h>
5
9
10#include <concepts>
11#include <cstddef>
12#include <utility>
13#include <vector>
14
15namespace opyn
16{
18 class IKResult final {
19 public:
22 size_t num_states() const;
23
25 const ModelState& model_state(size_t i) const;
26
27 private:
28 std::vector<ModelState> model_states_;
29 };
30
33 template<typename T>
34 class IKMeasurements final {
35 public:
36
39 template<typename U>
40 requires std::constructible_from<T, U>
43 U&& value,
44 double time = 0.0,
45 double weight = 1.0) :
46
47 model_component_{model_component},
48 times_{time},
49 values_{std::forward<U>(value)},
50 weights_{weight}
51 {}
52
59 std::vector<double> times,
60 std::vector<T> values) :
61
62 model_component_{model_component},
63 times_{std::move(times)},
64 values_{std::move(values)}
65 {
66 OSC_ASSERT_ALWAYS(times_.size() == values_.size() && "The number of times/weights/values in an IK measurement sequence must be equal");
67 weights_.resize(times_.size(), 1.0);
68 }
69
76 std::vector<double> times,
77 std::vector<T> values,
78 std::vector<double> weights) :
79
80 model_component_{model_component},
81 times_{std::move(times)},
82 values_{std::move(values)},
83 weights_{std::move(weights)}
84 {
85 OSC_ASSERT_ALWAYS(times_.size() == values_.size() && values_.size() == weights_.size() && "The number of times/weights/values in an IK measurement sequence must be equal");
86 }
87
90 const Symbol& model_component() const { return model_component_; }
91
93 size_t size() const { return times_.size(); }
94
96 double time(size_t i) const { return times_.at(i); }
97
99 const T& value(size_t i) const { return values_.at(i); }
100
102 double weight(size_t i) const { return weights_.at(i); }
103
104 private:
105 Symbol model_component_;
106 std::vector<double> times_;
107 std::vector<T> values_;
108 std::vector<double> weights_;
109 };
110
115
119
123
126 const Model& model,
127 const std::optional<IKStationMeasurements>& station_measurements = {},
128 const std::optional<IKOrientationMeasurements>& orientation_measurements = {},
129 const std::optional<IKCoordinateMeasurements>& coordinate_measurements = {}
130 );
131}
#define OSC_ASSERT_ALWAYS(expr)
Definition assertions.h:20
Definition inverse_kinematics.h:34
const Symbol & model_component() const
Definition inverse_kinematics.h:90
double weight(size_t i) const
Returns the weight of the ith measurement in the sequence.
Definition inverse_kinematics.h:102
IKMeasurements(const Symbol &model_component, std::vector< double > times, std::vector< T > values)
Definition inverse_kinematics.h:57
IKMeasurements(const Symbol &model_component, U &&value, double time=0.0, double weight=1.0)
Definition inverse_kinematics.h:41
double time(size_t i) const
Returns the measurement time of the ith measurement in the sequence.
Definition inverse_kinematics.h:96
IKMeasurements(const Symbol &model_component, std::vector< double > times, std::vector< T > values, std::vector< double > weights)
Definition inverse_kinematics.h:74
size_t size() const
Returns the number of measurements in the sequence.
Definition inverse_kinematics.h:93
const T & value(size_t i) const
Returns the value of the ith measurement in the sequence.
Definition inverse_kinematics.h:99
Represents the output of the inverse kinematics (IK) solver.
Definition inverse_kinematics.h:18
const ModelState & model_state(size_t i) const
Returns a reference to the ith ModelState in this result.
size_t num_states() const
Definition model_state.h:19
Definition model.h:26
Definition symbol.h:17
Definition component_registry.h:14
IKResult inverse_kinematics_solve(const Model &model, const std::optional< IKStationMeasurements > &station_measurements={}, const std::optional< IKOrientationMeasurements > &orientation_measurements={}, const std::optional< IKCoordinateMeasurements > &coordinate_measurements={})
Returns the result of running an IK solver on model for the provided measurements.