COPP C++ API 0.2.3
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 <array>
4#include <cstddef>
5#include <functional>
6#include <memory>
7#include <utility>
8#include <vector>
9
10#include "copp/core.hpp"
12#include "copp/path.hpp"
13
14namespace copp
15{
16
17 class Robot;
18 class ConstraintsRef;
19
40 using InverseDynamics = std::function<void(
44 Span<double> tau)>;
45
46 namespace detail
47 {
53 COPP_API const void *robot_handle(const Robot &robot) noexcept;
54
59 COPP_API void *robot_handle_mut(Robot &robot) noexcept;
60
66 COPP_API const void *constraints_handle(ConstraintsRef constraints) noexcept;
67
72 COPP_API void *constraints_handle_mut(ConstraintsRef constraints) noexcept;
73 } // namespace detail
74
88 {
89 public:
90 ConstraintsRef() noexcept = default;
91
93 bool valid() const noexcept;
94
96 std::size_t dim() const;
97
99 std::size_t len() const;
100
102 std::size_t size() const;
103
105 std::size_t capacity() const;
106
108 bool is_empty() const;
109
111 std::pair<std::size_t, std::size_t> idx_s_range() const;
112
122 ConstraintsRef &append_s(Span<const double> s);
123
125 std::vector<double> s_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
126
128 std::vector<double> amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
129
131 double s_value(std::size_t idx_s) const;
132
134 double amax_value(std::size_t idx_s) const;
135
141 ConstraintsRef &amax_substitute(Span<const double> amax, std::size_t idx_s);
142
147 ConstraintsRef &clear(bool keep_idx_s = false);
148
150 ConstraintsRef &pop_front_n(std::size_t n_cols);
151
153 ConstraintsRef &pop_back_n(std::size_t n_cols);
154
156 ConstraintsRef &pop_front_until(std::size_t idx_s_cut);
157
159 ConstraintsRef &pop_back_until(std::size_t idx_s_cut);
160
168 ConstraintsRef &add_constraint_1st(Span<const double> amax, std::size_t idx_s);
169
176
190 MatrixView acc_a,
191 MatrixView acc_b,
192 MatrixView acc_max,
193 std::size_t idx_s,
194 bool is_negative = false);
195
210 MatrixView jerk_a,
211 MatrixView jerk_b,
212 MatrixView jerk_c,
213 MatrixView jerk_d,
214 MatrixView jerk_max,
215 std::size_t idx_s,
216 bool is_negative = false);
217
231 std::array<double, 2> exceed_topp2(Span<const double> a, std::size_t idx_s_start = 0) const;
232
251 std::array<double, 3> exceed_topp3(
252 Span<const double> a,
253 Span<const double> b,
254 std::size_t num_stationary_start,
255 std::size_t num_stationary_end,
256 std::size_t idx_s_start = 0) const;
257
259 std::array<double, 3> exceed_topp3(const Profile3rd &profile, std::size_t idx_s_start = 0) const;
260
261 private:
262 explicit ConstraintsRef(void *handle) noexcept;
263
264 void *handle_ = nullptr;
265
266 friend class Robot;
267 friend class Constraints;
268 friend const void *detail::constraints_handle(ConstraintsRef constraints) noexcept;
269 friend void *detail::constraints_handle_mut(ConstraintsRef constraints) noexcept;
270 };
271
290 {
291 public:
292 explicit Constraints(std::size_t dim, std::size_t capacity = 0);
293
295 Constraints &operator=(Constraints &&) noexcept;
297
298 Constraints(const Constraints &) = delete;
299 Constraints &operator=(const Constraints &) = delete;
300
302 ConstraintsRef ref() noexcept;
303
304 std::size_t dim() const;
305 std::size_t len() const;
306 std::size_t size() const;
307 std::size_t capacity() const;
308 bool is_empty() const;
309 std::pair<std::size_t, std::size_t> idx_s_range() const;
310
311 Constraints &append_s(Span<const double> s);
312 std::vector<double> s_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
313 std::vector<double> amax_values(std::size_t idx_s_from, std::size_t idx_s_to) const;
314 double s_value(std::size_t idx_s) const;
315 double amax_value(std::size_t idx_s) const;
316 Constraints &amax_substitute(Span<const double> amax, std::size_t idx_s);
317 Constraints &clear(bool keep_idx_s = false);
318 Constraints &pop_front_n(std::size_t n_cols);
319 Constraints &pop_back_n(std::size_t n_cols);
320 Constraints &pop_front_until(std::size_t idx_s_cut);
321 Constraints &pop_back_until(std::size_t idx_s_cut);
322 Constraints &add_constraint_1st(Span<const double> amax, std::size_t idx_s);
323 Constraints &add_constraint_1st(MatrixView amax, std::size_t idx_s);
325 MatrixView acc_a,
326 MatrixView acc_b,
327 MatrixView acc_max,
328 std::size_t idx_s,
329 bool is_negative = false);
331 MatrixView jerk_a,
332 MatrixView jerk_b,
333 MatrixView jerk_c,
334 MatrixView jerk_d,
335 MatrixView jerk_max,
336 std::size_t idx_s,
337 bool is_negative = false);
338
340 std::array<double, 2> exceed_topp2(Span<const double> a, std::size_t idx_s_start = 0) const;
342 std::array<double, 3> exceed_topp3(
343 Span<const double> a,
344 Span<const double> b,
345 std::size_t num_stationary_start,
346 std::size_t num_stationary_end,
347 std::size_t idx_s_start = 0) const;
349 std::array<double, 3> exceed_topp3(const Profile3rd &profile, std::size_t idx_s_start = 0) const;
350
351 private:
352 struct Impl;
353
354 std::unique_ptr<Impl> impl_;
355 };
356
375 {
376 public:
377 explicit Robot(std::size_t dim, std::size_t capacity = 0);
378 Robot(std::size_t dim, InverseDynamics inverse_dynamics, std::size_t capacity = 0);
379
380 Robot(Robot &&) noexcept;
381 Robot &operator=(Robot &&) noexcept;
383
384 Robot(const Robot &) = delete;
385 Robot &operator=(const Robot &) = delete;
386
389
390 std::size_t dim() const;
391 std::size_t len() const;
392 std::size_t size() const;
393 std::size_t capacity() const;
394 bool is_empty() const;
395 std::pair<std::size_t, std::size_t> idx_s_range() const;
396
399
405
408
410 Robot &append_s(Span<const double> s);
411
418 MatrixView q,
419 MatrixView dq,
420 MatrixView ddq,
421 std::size_t idx_s);
422
427 MatrixView q,
428 MatrixView dq,
429 MatrixView ddq,
430 MatrixView dddq,
431 std::size_t idx_s);
432
438 Robot &set_q_from_path_2nd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to);
439
444 Robot &set_q_from_path_3rd(const Path &path, std::size_t idx_s_from, std::size_t idx_s_to);
445
457 Span<const double> upper,
458 Span<const double> lower,
459 std::size_t start_idx_s,
460 std::size_t length = 0);
461
463 Robot &add_velocity_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
464
470 Span<const double> upper,
471 Span<const double> lower,
472 std::size_t start_idx_s,
473 std::size_t length = 0);
474
476 Robot &add_acceleration_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
477
483 Span<const double> upper,
484 Span<const double> lower,
485 std::size_t start_idx_s,
486 std::size_t length = 0);
487
489 Robot &add_jerk_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
490
501 Span<const double> upper,
502 Span<const double> lower,
503 std::size_t start_idx_s,
504 std::size_t length = 0);
505
507 Robot &add_torque_limits(MatrixView upper, MatrixView lower, std::size_t start_idx_s);
508
509 private:
510 struct Impl;
511
512 std::unique_ptr<Impl> impl_;
513
514 friend const void *detail::robot_handle(const Robot &robot) noexcept;
515 friend void *detail::robot_handle_mut(Robot &robot) noexcept;
516 };
517
518} // 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
std::array< double, 2 > exceed_topp2(Span< const double > a, std::size_t idx_s_start=0) const
Same as ConstraintsRef::exceed_topp2.
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::array< double, 3 > exceed_topp3(Span< const double > a, Span< const double > b, std::size_t num_stationary_start, std::size_t num_stationary_end, std::size_t idx_s_start=0) const
Same as ConstraintsRef::exceed_topp3.
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:88
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.
std::array< double, 2 > exceed_topp2(Span< const double > a, std::size_t idx_s_start=0) const
Evaluate the maximum TOPP2 constraint violation of a node profile.
ConstraintsRef() noexcept=default
friend class Constraints
Definition robot.hpp:267
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:266
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.
std::array< double, 3 > exceed_topp3(Span< const double > a, Span< const double > b, std::size_t num_stationary_start, std::size_t num_stationary_end, std::size_t idx_s_start=0) const
Evaluate the maximum TOPP3 constraint violation of a node profile (a, b).
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:426
Robot facade backed by Rust Robot<CppRobotModel>.
Definition robot.hpp:375
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:40
Owned third-order TOPP/COPP profile.