File: Controller.hpp

package info (click to toggle)
dart 6.13.2%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 56,948 kB
  • sloc: cpp: 274,310; python: 3,973; xml: 1,272; sh: 404; makefile: 31
file content (183 lines) | stat: -rw-r--r-- 5,806 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*
 * Copyright (c) 2011-2022, The DART development contributors
 * All rights reserved.
 *
 * The list of contributors can be found at:
 *   https://github.com/dartsim/dart/blob/master/LICENSE
 *
 * This file is provided under the following "BSD-style" License:
 *   Redistribution and use in source and binary forms, with or
 *   without modification, are permitted provided that the following
 *   conditions are met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and the following
 *     disclaimer in the documentation and/or other materials provided
 *     with the distribution.
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 *   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *   POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef EXAMPLES_ATLASSIMBICON_CONTROLLER_HPP_
#define EXAMPLES_ATLASSIMBICON_CONTROLLER_HPP_

#include <vector>

#include <Eigen/Dense>
#include <dart/dart.hpp>

class StateMachine;

/// \brief SIMBICON for Atlas robot
class Controller
{
public:
  /// \brief Constructor
  Controller(
      dart::dynamics::SkeletonPtr _atlasRobot,
      dart::constraint::ConstraintSolver* _collisionSolver);

  /// \brief Destructor
  virtual ~Controller();

  /// \brief Called before every simulation time step in MyWindow class.
  /// Compute control force and apply it to Atlas robot
  virtual void update(double _currentTime);

  /// \brief
  dart::dynamics::SkeletonPtr getAtlasRobot();

  /// \brief Get current state machine
  StateMachine* getCurrentState();

  /// \brief Change state to _stateMachine
  void changeStateMachine(StateMachine* _stateMachine, double _currentTime);

  /// \brief Change state machine to a state machine whose names is _name
  void changeStateMachine(const std::string& _name, double _currentTime);

  /// \brief Change state machine to a state machine whose index is _idx
  void changeStateMachine(std::size_t _idx, double _currentTime);

  /// \brief Keyboard control
  void keyboard(unsigned char _key, int _x, int _y, double _currentTime);

  /// \brief Print debug information
  void printDebugInfo() const;

  /// \brief Harness the robot
  void harnessPelvis();

  /// \brief Unharness the robot
  void unharnessPelvis();

  /// \brief Harness the robot
  void harnessLeftFoot();

  /// \brief Harness the robot
  void unharnessLeftFoot();

  /// \brief Harness the robot
  void harnessRightFoot();

  /// \brief Harness the robot
  void unharnessRightFoot();

  /// \brief Reset the robot
  void resetRobot();

protected:
  /// \brief Atlas robot skeleton
  dart::dynamics::SkeletonPtr mAtlasRobot;

  /// \brief Conllision detector
  dart::constraint::ConstraintSolver* mConstratinSolver;

  /// \brief List of state machines
  std::vector<StateMachine*> mStateMachines;

  /// \brief Current state machine
  StateMachine* mCurrentStateMachine;

  /// \brief Flag for pelvis harnessing
  bool mPelvisHarnessOn;

  /// \brief Flag for left foot harnessing
  bool mLeftFootHarnessOn;

  /// \brief Flag for right foot harnessing
  bool mRightFootHarnessOn;

  /// \brief Index for coronal left hip
  std::size_t mCoronalLeftHip;

  /// \brief Index for coronal right hip
  std::size_t mCoronalRightHip;

  /// \brief Index for sagital left hip
  std::size_t mSagitalLeftHip;

  /// \brief Index for sagital right hip
  std::size_t mSagitalRightHip;

private:
  /// \brief Check if this controller contains _stateMachine
  bool _containStateMachine(const StateMachine* _stateMachine) const;

  /// \brief Check if this controller contains a state machine whose name is
  ///        _name
  bool _containStateMachine(const std::string& _name) const;

  /// \brief Find a state machine whose name is _name
  StateMachine* _findStateMachine(const std::string& _name) const;

  /// \brief Build state machines
  void _buildStateMachines();

  /// \brief Create standing controller
  StateMachine* _createStandingStateMachine();

  /// \brief Create standing controller
  StateMachine* _createWalkingInPlaceStateMachine();

  /// \brief Create standing controller
  StateMachine* _createWalkingStateMachine();

  /// \brief Create running controller
  StateMachine* _createRunningStateMachine();

  /// \brief Set joint damping
  void _setJointDamping();

  /// \brief Get left foot
  dart::dynamics::BodyNode* _getLeftFoot() const;

  /// \brief Get right foot
  dart::dynamics::BodyNode* _getRightFoot() const;

  /// \brief Weld joint constraint for pelvis harnessing
  dart::constraint::WeldJointConstraintPtr mWeldJointConstraintPelvis;

  /// \brief Weld joint constraint for left foot harnessing
  dart::constraint::WeldJointConstraintPtr mWeldJointConstraintLeftFoot;

  /// \brief Weld joint constraint for right foot harnessing
  dart::constraint::WeldJointConstraintPtr mWeldJointConstraintRightFoot;

  /// \brief Initial state of the robot
  dart::dynamics::Skeleton::Configuration mInitialState;
};

#endif // EXAMPLES_ATLASSIMBICON_CONTROLLER_HPP_