double_integrator_dynamics_solver.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2019, Wolfgang Merkt
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // * Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of nor the names of its contributors may be used to
14 // endorse or promote products derived from this software without specific
15 // prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
28 //
29 
31 
33 
34 namespace exotica
35 {
36 void DoubleIntegratorDynamicsSolver::AssignScene(ScenePtr scene_in)
37 {
38  const int num_positions_in = scene_in->GetKinematicTree().GetNumControlledJoints();
39  if (debug_) HIGHLIGHT_NAMED("DoubleIntegratorDynamicsSolver::AssignScene", "Dimension: " << num_positions_in);
40 
41  num_positions_ = num_positions_in;
42  num_velocities_ = num_positions_in;
43  num_controls_ = num_positions_in;
44 
45  // Cf. https://en.wikipedia.org/wiki/Double_integrator
46  A_ = Eigen::MatrixXd::Zero(num_positions_ + num_velocities_, num_positions_ + num_velocities_);
47  A_.topRightCorner(num_velocities_, num_velocities_) = Eigen::MatrixXd::Identity(num_velocities_, num_velocities_);
48 
49  B_ = Eigen::MatrixXd::Zero(num_positions_ + num_velocities_, num_controls_);
50  B_.bottomRightCorner(num_controls_, num_controls_) = Eigen::MatrixXd::Identity(num_controls_, num_controls_);
51 
52  fx_ = A_;
53  fu_ = B_;
54 
55  // Set up state transition derivative
56  DynamicsSolver::ComputeDerivatives(Eigen::VectorXd(num_positions_ + num_velocities_), Eigen::VectorXd(num_controls_));
57 }
58 
59 Eigen::VectorXd DoubleIntegratorDynamicsSolver::f(const StateVector& x, const ControlVector& u)
60 {
61  return A_ * x + B_ * u;
62 }
63 
64 void DoubleIntegratorDynamicsSolver::ComputeDerivatives(const StateVector& x, const ControlVector& u)
65 {
66  // If the integrator changed, set up state transition derivatives again:
67  if (integrator_ != last_integrator_)
68  {
69  DynamicsSolver::ComputeDerivatives(x, u);
70  last_integrator_ = integrator_;
71  }
72 }
73 
74 Eigen::MatrixXd DoubleIntegratorDynamicsSolver::fx(const StateVector& x, const ControlVector& u)
75 {
76  return A_;
77 }
78 
79 Eigen::MatrixXd DoubleIntegratorDynamicsSolver::fu(const StateVector& x, const ControlVector& u)
80 {
81  return B_;
82 }
83 
84 } // namespace exotica
#define REGISTER_DYNAMICS_SOLVER_TYPE(TYPE, DERIV)
std::shared_ptr< Scene > ScenePtr
Eigen::Matrix< T, NU, 1 > ControlVector
#define HIGHLIGHT_NAMED(name, x)
Eigen::Matrix< T, NX, 1 > StateVector


exotica_double_integrator_dynamics_solver
Author(s):
autogenerated on Sat Apr 10 2021 02:35:28