47 explicit FilterVector(
const std::vector<U> & vec) : data(vec) {}
49 explicit FilterVector(
size_t size,
const U & initial_value = U{}) : data(size, initial_value) {}
54 for (
auto & val : result.data)
63 if (data.size() != other.data.size())
65 throw std::runtime_error(
67 "Vectors must be of the same size for addition ({} vs {}).", data.size(),
71 for (
size_t i = 0; i < data.size(); ++i)
73 result.data[i] += other.data[i];
78 size_t size()
const {
return data.size(); }
91 using StorageType = T;
93 static void initialize(StorageType & storage)
95 storage = T{std::numeric_limits<T>::quiet_NaN()};
98 static bool is_nan(
const StorageType & storage) {
return std::isnan(storage); }
100 static bool is_finite(
const StorageType & storage) {
return std::isfinite(storage); }
102 static bool is_empty(
const StorageType & storage)
108 static void assign(StorageType & storage,
const StorageType & data_in) { storage = data_in; }
110 static void validate_input(
const T & data_in,
const StorageType & filtered_value, T & data_out)
113 (void)filtered_value;
117 static void add_metadata(StorageType & storage,
const StorageType & data_in)
127 using StorageType = Eigen::Matrix<double, 6, 1>;
128 using DataType = geometry_msgs::msg::WrenchStamped;
130 static void initialize(StorageType & storage)
133 storage = StorageType();
136 static bool is_nan(
const StorageType & storage) {
return storage.hasNaN(); }
138 static bool is_finite(
const DataType & data)
140 return std::isfinite(data.wrench.force.x) && std::isfinite(data.wrench.force.y) &&
141 std::isfinite(data.wrench.force.z) && std::isfinite(data.wrench.torque.x) &&
142 std::isfinite(data.wrench.torque.y) && std::isfinite(data.wrench.torque.z);
145 static bool is_empty(
const StorageType & storage)
151 static void assign(DataType & data_in,
const StorageType & storage)
153 data_in.wrench.force.x = storage[0];
154 data_in.wrench.force.y = storage[1];
155 data_in.wrench.force.z = storage[2];
156 data_in.wrench.torque.x = storage[3];
157 data_in.wrench.torque.y = storage[4];
158 data_in.wrench.torque.z = storage[5];
161 static void assign(StorageType & storage,
const DataType & data_in)
163 storage[0] = data_in.wrench.force.x;
164 storage[1] = data_in.wrench.force.y;
165 storage[2] = data_in.wrench.force.z;
166 storage[3] = data_in.wrench.torque.x;
167 storage[4] = data_in.wrench.torque.y;
168 storage[5] = data_in.wrench.torque.z;
171 static void assign(StorageType & storage,
const StorageType & data_in) { storage = data_in; }
173 static void validate_input(
174 const DataType & data_in,
const StorageType & filtered_value, DataType & data_out)
176 (void)filtered_value;
180 if (!data_out.header.frame_id.empty() && data_in.header.frame_id != data_out.header.frame_id)
182 throw std::runtime_error(
183 "Frame ID changed between filter updates! Out: " + data_out.header.frame_id +
184 ", In: " + data_in.header.frame_id);
188 static void add_metadata(DataType & data_out,
const DataType & data_in)
190 data_out.header = data_in.header;
198 using DataType = std::vector<U>;
200 static void initialize(
StorageType & storage) { (void)storage; }
205 storage.data.begin(), storage.data.end(), [](U val) { return std::isfinite(val); });
208 static bool is_finite(
const DataType & storage)
210 return std::all_of(storage.begin(), storage.end(), [](U val) { return std::isfinite(val); });
213 static bool is_empty(
const StorageType & storage) {
return storage.data.empty(); }
217 for (
const auto & val : storage.data)
228 static void assign(
StorageType & storage,
const DataType & data_in) { storage.data = data_in; }
230 static void assign(DataType & storage,
const StorageType & data_in) { storage = data_in.data; }
234 storage.data = data_in.data;
237 static void validate_input(
238 const DataType & data_in,
const StorageType & filtered_value, DataType & data_out)
240 if (data_in.size() != filtered_value.size())
242 throw std::runtime_error(
244 "Input vector size ({}) does not match internal state size ({}).", data_in.size(),
245 filtered_value.size()));
249 if (!data_out.empty() && data_out.size() != data_in.size())
251 throw std::runtime_error(
253 "Input and output vectors must be the same size, {} vs {}.", data_out.size(),
258 static void add_metadata(DataType & storage,
const DataType & data_in)