MPPool.h
Go to the documentation of this file.
1/**
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @author Jianfeng Gao ( jianfeng dot gao at kit dot edu )
17 * @date 2022
18 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19 * GNU General Public License
20 */
21
22
23#pragma once
24#include <VirtualRobot/RobotNodeSet.h>
25
26#include <armarx/control/common/mp/MPPoolInterface.h>
27#include <armarx/control/common/mp/aron/MPConfig.aron.generated.h>
28
29#include "MP.h"
30#include <mplib/representation/vmp/PrincipalComponentVMP.h>
31
33{
34 class Coordination;
35 class SyncCoordination;
36} // namespace armarx::control::common::coordination
37
39{
40 BETTER_ENUM(mpClass, int, JSMP, JSVelMP, TSMP, TSVelMP, KeypointsMP)
41
42 using namespace arondto;
43
45 {
46 Eigen::VectorXf pos;
47 Eigen::VectorXf vel;
48 };
49
56
57 using MPInputOutputPtr = std::shared_ptr<MPInputOutput>;
58
59 class MPPool : public virtual MPPoolInterface
60 {
61 public:
62 MPPool() = default;
64
65 void runMPs(bool rtSafe);
66 void createMPs(const MPListConfig& mpListConfig);
67 void reconfigureMPs(const MPListConfig& mpListConfig);
68
69
70 /// Interface functions
71 std::string getNames(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
72
73 /// config
75 getMPConfig(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
76 void updateMPConfig(const ::armarx::aron::data::dto::DictPtr& dto,
77 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
78 bool resetMPs(const ::armarx::aron::data::dto::DictPtr& dto,
79 const std::map<std::string, VirtualRobot::RobotNodeSetPtr>& rnsMap);
80 bool resetMPsV1(const ::armarx::aron::data::dto::DictPtr& dto,
81 const std::map<std::string, VirtualRobot::RobotNodeSetPtr>& rnsMap,
82 const std::shared_ptr<common::coordination::Coordination>& coordinator);
83 bool resetMPsV2(const ::armarx::aron::data::dto::DictPtr& dto,
84 const std::map<std::string, MPReInitData>& data);
85
86 /// control
87 void start(const std::string& mpName = "all",
88 const DVec& startVec = std::vector<double>(),
89 const DVec& goalVec = std::vector<double>(),
90 Ice::Double timeDuration = -1.0,
91 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
92 void startAll(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
93 void set(const ::armarx::StringDoubleSeqMap& /*unused*/,
94 const ::armarx::StringDoubleSeqMap& /*unused*/,
95 const ::armarx::StringDoubleMap& /*unused*/,
96 const ::Ice::Current& iceCurrent = ::Ice::emptyCurrent) override;
97
98 void stop(const std::string& mpName = "all",
99 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
100 void requestStop(const std::string& mpName = "all",
101 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
102 void stopAll(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
103 void pause(const std::string& mpName = "all",
104 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
105 void pauseAll(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
106 void resume(const std::string& mpName = "all",
107 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
108 void resumeAll(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
109 void reset(const std::string& mpName = "all",
110 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
111 void resetAll(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
112 bool isFinished(const std::string& mpName = "all",
113 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
114 bool isFinishedAll(const Ice::Current& /*unused*/ = Ice::emptyCurrent) override;
115
116 /// setting
117 void learnFromCSV(const Ice::StringSeq& fileNames = std::vector<std::string>(),
118 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
119 void learnFromTrajs(const ::armarx::aron::data::dto::DictPtr& dict,
120 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
121 void trainMP(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
122
123 void setGoal(const DVec& goals,
124 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
125 void setStartAndGoal(const DVec& starts,
126 const DVec& goals,
127 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
128 void setViaPoint(Ice::Double u,
129 const DVec& viapoint,
130 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
131 void removeAllViaPoint(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
132
133 /// serialize
134 // void setWeight(const DVecSeq& weights, const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
135 // DVecSeq getWeight(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
136 std::string serialize(const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
137 DVec deserialize(const std::string& /*unused*/,
138 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
139
140 ///
141 Ice::Double getCanVal(const std::string& mpName,
142 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
143 bool getMPEnabled(const Ice::Current& /*unused*/) override;
144
145 protected:
146 std::map<std::string, MPInputOutput> mps;
147 mutable std::recursive_mutex mtx_mps;
148 std::atomic<bool> isMPReady{false};
149 // std::atomic_bool isAnyMPRunning{false};
150
151 /// this variable is only needed when constructing the MP instances, therefore you don't
152 /// need to use triple buffers
153 MPListConfig mpConfig;
154 void
155 reInitMPInputOutputData(const std::map<std::string, VirtualRobot::RobotNodeSetPtr>& rnsMap);
157 const std::map<std::string, VirtualRobot::RobotNodeSetPtr>& rnsMap,
158 const std::shared_ptr<common::coordination::Coordination>& coordinator);
159 void reInitMPInputOutputDataV2(const std::map<std::string, MPReInitData>& data);
160
161 std::atomic_bool mpTaskRunning{false};
162 std::map<arondto::MPGroup, PhaseStopResult> phaseStops_;
163 };
164
165 using MPPoolPtr = std::shared_ptr<MPPool>;
166} // namespace armarx::control::common::mp
bool resetMPs(const ::armarx::aron::data::dto::DictPtr &dto, const std::map< std::string, VirtualRobot::RobotNodeSetPtr > &rnsMap)
Definition MPPool.cpp:565
bool resetMPsV2(const ::armarx::aron::data::dto::DictPtr &dto, const std::map< std::string, MPReInitData > &data)
Definition MPPool.cpp:666
void learnFromTrajs(const ::armarx::aron::data::dto::DictPtr &dict, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:426
void setGoal(const DVec &goals, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:493
void resume(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:324
void reconfigureMPs(const MPListConfig &mpListConfig)
Definition MPPool.cpp:97
bool resetMPsV1(const ::armarx::aron::data::dto::DictPtr &dto, const std::map< std::string, VirtualRobot::RobotNodeSetPtr > &rnsMap, const std::shared_ptr< common::coordination::Coordination > &coordinator)
Definition MPPool.cpp:604
std::recursive_mutex mtx_mps
Definition MPPool.h:147
Ice::Double getCanVal(const std::string &mpName, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:539
bool isFinished(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:386
void updateMPConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:557
void learnFromCSV(const Ice::StringSeq &fileNames=std::vector< std::string >(), const Ice::Current &iceCurrent=Ice::emptyCurrent) override
setting
Definition MPPool.cpp:406
void createMPs(const MPListConfig &mpListConfig)
Definition MPPool.cpp:23
void setStartAndGoal(const DVec &starts, const DVec &goals, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:498
DVec deserialize(const std::string &, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:532
void stop(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:262
std::map< std::string, MPInputOutput > mps
Definition MPPool.h:146
void reInitMPInputOutputData(const std::map< std::string, VirtualRobot::RobotNodeSetPtr > &rnsMap)
Definition MPPool.cpp:760
MPListConfig mpConfig
this variable is only needed when constructing the MP instances, therefore you don't need to use trip...
Definition MPPool.h:153
void reInitMPInputOutputDataV2(const std::map< std::string, MPReInitData > &data)
Definition MPPool.cpp:711
void requestStop(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:237
void start(const std::string &mpName="all", const DVec &startVec=std::vector< double >(), const DVec &goalVec=std::vector< double >(), Ice::Double timeDuration=-1.0, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
control
Definition MPPool.cpp:183
std::map< arondto::MPGroup, PhaseStopResult > phaseStops_
Definition MPPool.h:162
void setViaPoint(Ice::Double u, const DVec &viapoint, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:509
void reInitMPInputOutputDataV1(const std::map< std::string, VirtualRobot::RobotNodeSetPtr > &rnsMap, const std::shared_ptr< common::coordination::Coordination > &coordinator)
Definition MPPool.cpp:815
std::atomic< bool > isMPReady
Definition MPPool.h:148
void set(const ::armarx::StringDoubleSeqMap &, const ::armarx::StringDoubleSeqMap &, const ::armarx::StringDoubleMap &, const ::Ice::Current &iceCurrent=::Ice::emptyCurrent) override
Definition MPPool.cpp:147
void pause(const std::string &mpName="all", const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition MPPool.cpp:293
armarx::aron::data::dto::Dict getMPConfig()
string serialize()
serialze
::IceInternal::Handle< Dict > DictPtr
This file is part of ArmarX.
Ice::DoubleSeq DVec
Definition MP.h:53
std::shared_ptr< MPInput > MPInputPtr
Definition MP.h:70
std::shared_ptr< MPPool > MPPoolPtr
Definition MPPool.h:165
std::shared_ptr< MPInputOutput > MPInputOutputPtr
Definition MPPool.h:57
std::shared_ptr< MPOutput > MPOutputPtr
Definition MP.h:71
std::shared_ptr< MP > MPPtr
Definition MP.h:186