Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef TOWR_VARIABLES_PHASE_NODES_H_
00031 #define TOWR_VARIABLES_PHASE_NODES_H_
00032
00033 #include "nodes.h"
00034
00035 namespace towr {
00036
00046 class PhaseNodes : public Nodes {
00047 public:
00048 using Ptr = std::shared_ptr<PhaseNodes>;
00049 using OptNodeIs = int;
00050 using NodeIds = std::vector<int>;
00051
00052 enum Type {Force, Motion};
00053
00057 struct PolyInfo {
00058 int phase_;
00059 int poly_in_phase_;
00060 int n_polys_in_phase_;
00061 bool is_constant_;
00062 PolyInfo(int phase, int poly_in_phase, int n_polys_in_phase, bool is_const);
00063 };
00064
00074 PhaseNodes (int phase_count, bool in_contact_start, const std::string& var_name,
00075 int n_polys_in_changing_phase, Type type);
00076
00077 virtual ~PhaseNodes() = default;
00078
00079 virtual std::vector<IndexInfo> GetNodeInfoAtOptIndex(int idx) const override;
00080
00084 Eigen::Vector3d GetValueAtStartOfPhase(int phase) const;
00085
00089 int GetNodeIDAtStartOfPhase(int phase) const;
00090
00096 int GetPhase(int node_id) const;
00097
00102 virtual bool IsConstantNode(int node_id) const;
00103
00110 NodeIds GetIndicesOfNonConstantNodes() const;
00111
00118 virtual VecDurations
00119 ConvertPhaseToPolyDurations(const VecDurations& phase_durations) const;
00120
00129 virtual double
00130 GetDerivativeOfPolyDurationWrtPhaseDuration(int polynomial_id) const;
00131
00140 virtual int
00141 GetNumberOfPrevPolynomialsInPhase(int polynomial_id) const;
00142
00147 virtual bool IsInConstantPhase(int polynomial_id) const;
00148
00149 private:
00150 std::vector<PolyInfo> polynomial_info_;
00151
00152
00153
00154
00155 std::map<OptNodeIs, NodeIds > optnode_to_node_;
00156
00160 int GetPolyIDAtStartOfPhase(int phase) const;
00161
00162 static std::map<OptNodeIs, NodeIds>
00163 GetOptNodeToNodeMappings(const std::vector<PolyInfo>&);
00164
00170 void SetBoundsEEMotion();
00171
00177 void SetBoundsEEForce();
00178
00179 std::vector<int> GetAdjacentPolyIds(int node_id) const;
00180
00181 };
00182 }
00183
00184 #endif