COPP C++ API
C++ interface for COPP trajectory optimization
Loading...
Searching...
No Matches
robot.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <functional>
5#include <memory>
6#include <utility>
7#include <vector>
8
9#include "copp/core.hpp"
10#include "copp/path.hpp"
11
12namespace copp
13{
14
15 class Robot;
16 class ConstraintsRef;
17
38 using InverseDynamics = std::function<void(
42 Span<double> tau)>;
43
44 namespace detail
45 {
51 COPP_API const void *robot_handle(const Robot &robot) noexcept;
52
57 COPP_API void *robot_handle_mut(Robot &robot) noexcept;
58
64 COPP_API const void *constraints_handle(ConstraintsRef constraints) noexcept;
65
70 COPP_API void *constraints_handle_mut(ConstraintsRef constraints) noexcept;
71 } // namespace detail
72
86 {
87 public:
88 ConstraintsRef() noexcept = default;
89
91 bool valid() const noexcept;
92
94 std::size_t dim() const;
95
97 std::size_t len() const;
98
100 std::size_t size() const;
101
103 std::size_t capacity() const;
104
106 bool is_empty() const;
107
109 std::pair<std::size_t, std::size_t> idx_s_range() const;
110
120 ConstraintsRef &append_s(Span<const double> s);
121
123 std::vector<double> s_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
124
126 std::vector<double> amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
127
129 double s_value(std::size_t idx_s) const;
130
132 double amax_value(std::size_t idx_s) const;
133
139 ConstraintsRef &amax_substitute(Span<const double> amax, std::size_t idx_s);
140
145 ConstraintsRef &clear(bool keep_idx_s = false);
146
148 ConstraintsRef &pop_front_n(std::size_t n_cols);
149
151 ConstraintsRef &pop_back_n(std::size_t n_cols);
152
154 ConstraintsRef &pop_front_until(std::size_t idx_s_cut);
155
157 ConstraintsRef &pop_back_until(std::size_t idx_s_cut);
158
166 ConstraintsRef &add_constraint_1st(Span<const double> amax, std::size_t idx_s);
167
174
188 MatrixView acc_a,
189 MatrixView acc_b,
190 MatrixView acc_max,
191 std::size_t idx_s,
192 bool is_negative = false);
193
208 MatrixView jerk_a,
209 MatrixView jerk_b,
210 MatrixView jerk_c,
211 MatrixView jerk_d,
212 MatrixView jerk_max,
213 std::size_t idx_s,
214 bool is_negative = false);
215
216 private:
217 explicit ConstraintsRef(void *handle) noexcept;
218
219 void *handle_ = nullptr;
220
221 friend class Robot;
222 friend class Constraints;
223 friend const void *detail::constraints_handle(ConstraintsRef constraints) noexcept;
224 friend void *detail::constraints_handle_mut(ConstraintsRef constraints) noexcept;
225 };
226
245 {
246 public:
247 explicit Constraints(std::size_t dim, std::size_t capacity = 0);
248
250 Constraints &operator=(Constraints &&) noexcept;
252
253 Constraints(const Constraints &) = delete;
254 Constraints &operator=(const Constraints &) = delete;
255
257 ConstraintsRef ref() noexcept;
258
259 std::size_t dim() const;
260 std::size_t len() const;
261 std::size_t size() const;
262 std::size_t capacity() const;
263 bool is_empty() const;
264 std::pair<std::size_t, std::size_t> idx_s_range() const;
265
266 Constraints &append_s(Span<const double> s);
267 std::vector<double> s_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
268 std::vector<double> amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
269 double s_value(std::size_t idx_s) const;
270 double amax_value(std::size_t idx_s) const;
271 Constraints &amax_substitute(Span<const double> amax, std::size_t idx_s);
272 Constraints &clear(bool keep_idx_s = false);
273 Constraints &pop_front_n(std::size_t n_cols);
274 Constraints &pop_back_n(std::size_t n_cols);
275 Constraints &pop_front_until(std::size_t idx_s_cut);
276 Constraints &pop_back_until(std::size_t idx_s_cut);
277 Constraints &add_constraint_1st(Span<const double> amax, std::size_t idx_s);
278 Constraints &add_constraint_1st(MatrixView amax, std::size_t idx_s);
280 MatrixView acc_a,
281 MatrixView acc_b,
282 MatrixView acc_max,
283 std::size_t idx_s,
284 bool is_negative = false);
286 MatrixView jerk_a,
287 MatrixView jerk_b,
288 MatrixView jerk_c,
289 MatrixView jerk_d,
290 MatrixView jerk_max,
291 std::size_t idx_s,
292 bool is_negative = false);
293
294 private:
295 struct Impl;
296
297 std::unique_ptr<Impl> impl_;
298 };
299
318 {
319 public:
320 explicit Robot(std::size_t dim, std::size_t capacity = 0);
321 Robot(std::size_t dim, InverseDynamics inverse_dynamics, std::size_t capacity = 0);
322
323 Robot(Robot &&) noexcept;
324 Robot &operator=(Robot &&) noexcept;
326
327 Robot(const Robot &) = delete;
328 Robot &operator=(const Robot &) = delete;
329
332
333 std::size_t dim() const;
334 std::size_t len() const;
335 std::size_t size() const;
336 std::size_t capacity() const;
337 bool is_empty() const;
338 std::pair<std::size_t, std::size_t> idx_s_range() const;
339
342
348
351
353 Robot &append_s(Span<const double> s);
354
361 MatrixView q,
362 MatrixView dq,
363 MatrixView ddq,
364 std::size_t idx_s);
365
370 MatrixView q,
371 MatrixView dq,
372 MatrixView ddq,
373 MatrixView dddq,
374 std::size_t idx_s);
375
381 Robot &set_q_from_path_2nd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to);
382
387 Robot &set_q_from_path_3rd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to);
388
400 Span<const double> upper,
401 Span<const double> lower,
402 std::size_t start_idx_s,
403 std::size_t length = 0);
404
406 Robot &add_velocity_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
407
413 Span<const double> upper,
414 Span<const double> lower,
415 std::size_t start_idx_s,
416 std::size_t length = 0);
417
419 Robot &add_acceleration_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
420
426 Span<const double> upper,
427 Span<const double> lower,
428 std::size_t start_idx_s,
429 std::size_t length = 0);
430
432 Robot &add_jerk_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
433
444 Span<const double> upper,
445 Span<const double> lower,
446 std::size_t start_idx_s,
447 std::size_t length = 0);
448
450 Robot &add_torque_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
451
452 private:
453 struct Impl;
454
455 std::unique_ptr<Impl> impl_;
456
457 friend const void *detail::robot_handle(const Robot &robot) noexcept;
458 friend void *detail::robot_handle_mut(Robot &robot) noexcept;
459 };
460
461} // namespace copp
Constraints(Constraints &&) noexcept
Constraints & pop_front_until(std::size_t idx_s_cut)
Constraints & amax_substitute(Span< const double > amax, std::size_t idx_s)
Constraints & add_constraint_2nd(MatrixView acc_a, MatrixView acc_b, MatrixView acc_max, std::size_t idx_s, bool is_negative=false)
Constraints & pop_back_until(std::size_t idx_s_cut)
Constraints & pop_back_n(std::size_t n_cols)
Constraints & pop_front_n(std::size_t n_cols)
std::size_t capacity() const
Constraints & add_constraint_1st(Span< const double > amax, std::size_t idx_s)
std::size_t size() const
std::size_t len() const
std::pair< std::size_t, std::size_t > idx_s_range() const
double amax_value(std::size_t idx_s) const
bool is_empty() const
Constraints & clear(bool keep_idx_s=false)
std::vector< double > s_values(std::size_t idx_s_from, std::size_t idx_s_to) const
Constraints & append_s(Span< const double > s)
Constraints(std::size_t dim, std::size_t capacity=0)
std::size_t dim() const
double s_value(std::size_t idx_s) const
ConstraintsRef ref() noexcept
Borrow this owning object as a solver/constraint reference.
std::vector< double > amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const
Constraints & add_constraint_3rd(MatrixView jerk_a, MatrixView jerk_b, MatrixView jerk_c, MatrixView jerk_d, MatrixView jerk_max, std::size_t idx_s, bool is_negative=false)
Non-owning view of a Rust-backed constraint buffer.
Definition robot.hpp:86
ConstraintsRef & add_constraint_2nd(MatrixView acc_a, MatrixView acc_b, MatrixView acc_max, std::size_t idx_s, bool is_negative=false)
Append second-order raw constraint rows.
ConstraintsRef & pop_back_until(std::size_t idx_s_cut)
Remove back stations until the kept window ends at or before idx_s_cut.
ConstraintsRef() noexcept=default
friend class Constraints
Definition robot.hpp:222
std::size_t capacity() const
Return the allocated station-buffer capacity.
bool valid() const noexcept
Return whether this reference points to a live bridge handle.
std::pair< std::size_t, std::size_t > idx_s_range() const
Return the active global station-id interval [first, second).
ConstraintsRef & amax_substitute(Span< const double > amax, std::size_t idx_s)
Overwrite first-order upper bounds starting at idx_s.
std::vector< double > amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const
Export first-order upper bounds over [idx_s_from, idx_s_to).
std::vector< double > s_values(std::size_t idx_s_from, std::size_t idx_s_to) const
Export stored station samples over [idx_s_from, idx_s_to).
friend const void * detail::constraints_handle(ConstraintsRef constraints) noexcept
std::size_t dim() const
Return the robot/path dimension.
ConstraintsRef & clear(bool keep_idx_s=false)
Clear all stored stations and constraints.
friend class Robot
Definition robot.hpp:221
std::size_t size() const
Alias for len(), useful for STL-style code.
double amax_value(std::size_t idx_s) const
Read one first-order upper bound by global station id.
ConstraintsRef & pop_front_n(std::size_t n_cols)
Remove n_cols logical stations from the front.
ConstraintsRef & add_constraint_1st(Span< const double > amax, std::size_t idx_s)
Add or tighten first-order constraints from a vector.
bool is_empty() const
Return whether no path stations are stored.
ConstraintsRef & pop_back_n(std::size_t n_cols)
Remove n_cols logical stations from the back.
ConstraintsRef & pop_front_until(std::size_t idx_s_cut)
Remove front stations until the kept window starts at idx_s_cut.
friend void * detail::constraints_handle_mut(ConstraintsRef constraints) noexcept
ConstraintsRef & append_s(Span< const double > s)
Append strictly increasing path station samples.
double s_value(std::size_t idx_s) const
Read one stored station sample by global station id.
ConstraintsRef & add_constraint_3rd(MatrixView jerk_a, MatrixView jerk_b, MatrixView jerk_c, MatrixView jerk_d, MatrixView jerk_max, std::size_t idx_s, bool is_negative=false)
Append third-order raw constraint rows.
std::size_t len() const
Return the number of stored path stations.
Non-owning view of a two-dimensional double matrix.
Definition core.hpp:205
Geometric path wrapper backed by Rust Path.
Definition path.hpp:353
Robot facade backed by Rust Robot<CppRobotModel>.
Definition robot.hpp:318
ConstraintsRef constraints() noexcept
Return a borrowed raw constraint-buffer facade.
Robot & set_q_2nd(MatrixView q, MatrixView dq, MatrixView ddq, std::size_t idx_s)
Store path derivatives up to second order over an existing station interval.
friend void * detail::robot_handle_mut(Robot &robot) noexcept
std::size_t len() const
Robot & set_q_3rd(MatrixView q, MatrixView dq, MatrixView ddq, MatrixView dddq, std::size_t idx_s)
Store path derivatives up to third order over an existing station interval.
Robot & clear_inverse_dynamics()
Restore point-mass torque evaluation (tau = ddq).
friend const void * detail::robot_handle(const Robot &robot) noexcept
Robot & add_torque_limits(Span< const double > upper, Span< const double > lower, std::size_t start_idx_s, std::size_t length=0)
Add torque limits from broadcast vectors.
Robot & set_q_from_path_2nd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to)
Sample a path and store derivatives up to second order.
std::size_t dim() const
Robot(std::size_t dim, std::size_t capacity=0)
Robot(std::size_t dim, InverseDynamics inverse_dynamics, std::size_t capacity=0)
Robot & add_acceleration_limits(Span< const double > upper, Span< const double > lower, std::size_t start_idx_s, std::size_t length=0)
Add acceleration limits from broadcast vectors.
bool has_inverse_dynamics() const
Return whether a user inverse-dynamics callback is installed.
Robot & append_s(Span< const double > s)
Append strictly increasing path station samples.
Robot & add_velocity_limits(Span< const double > upper, Span< const double > lower, std::size_t start_idx_s, std::size_t length=0)
Add velocity limits from broadcast vectors.
std::pair< std::size_t, std::size_t > idx_s_range() const
Robot & set_inverse_dynamics(InverseDynamics inverse_dynamics)
Replace the inverse-dynamics callback.
std::size_t capacity() const
Robot & set_q_from_path_3rd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to)
Sample a path and store derivatives up to third order.
bool is_empty() const
Robot(Robot &&) noexcept
Robot & add_jerk_limits(Span< const double > upper, Span< const double > lower, std::size_t start_idx_s, std::size_t length=0)
Add jerk limits from broadcast vectors.
std::size_t size() const
Non-owning view of a contiguous one-dimensional array.
Definition core.hpp:139
#define COPP_API
Definition core.hpp:23
Internal helpers for error conversion, no-throw overloads, and small implementation utilities used by...
COPP_API void * constraints_handle_mut(ConstraintsRef constraints) noexcept
Return the mutable private bridge handle stored by ConstraintsRef.
COPP_API void * robot_handle_mut(Robot &robot) noexcept
Return the mutable private bridge handle stored by Robot.
COPP_API const void * robot_handle(const Robot &robot) noexcept
Return the private bridge handle stored by Robot.
COPP_API const void * constraints_handle(ConstraintsRef constraints) noexcept
Return the private bridge handle stored by ConstraintsRef.
Root namespace for the C++ facade: paths, robots, constraints, matrices, profiles,...
std::function< void( Span< const double > q, Span< const double > dq, Span< const double > ddq, Span< double > tau)> InverseDynamics
User-supplied inverse dynamics callback.
Definition robot.hpp:38