sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
qualisys-client.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2019
3  * LAAS-CNRS
4  * F. Bailly
5  * T. Flayols
6  */
7 
8 #include <dynamic-graph/all-commands.h>
9 #include <dynamic-graph/factory.h>
10 
11 #include <sot/core/debug.hh>
12 #include <sot/core/stop-watch.hh>
15 
16 // #include "RTProtocol.h"
17 // #include "RTPacket.h"
18 
19 namespace dynamicgraph {
20 namespace sot {
21 namespace talos_balance {
22 namespace dynamicgraph = ::dynamicgraph;
23 using namespace dynamicgraph;
24 using namespace dynamicgraph::command;
25 using namespace dg::sot::talos_balance;
26 
27 #define INPUT_SIGNALS m_dummySIN
28 #define OUTPUT_SIGNALS
29 
32 typedef QualisysClient EntityClassName;
33 
34 /* --- DG FACTORY ---------------------------------------------------- */
36 
37 /* ------------------------------------------------------------------- */
38 /* --- CONSTRUCTION -------------------------------------------------- */
39 /* ------------------------------------------------------------------- */
41  : Entity(name), CONSTRUCT_SIGNAL_IN(dummy, double), m_initSucceeded(false) {
42  Entity::signalRegistration(INPUT_SIGNALS);
43  /* Commands. */
44  addCommand("init",
45  makeCommandVoid0(*this, &QualisysClient::init,
46  docCommandVoid0("Initialize the entity.")));
47 
48  addCommand("registerRigidBody",
49  makeCommandVoid1(*this, &QualisysClient::registerRigidBody,
50  docCommandVoid1("Register a rigid body",
51  "Name of the rigid body")));
52  addCommand(
53  "setMocapIPAdress",
54  makeCommandVoid1(*this, &QualisysClient::setMocapIPAdress,
55  docCommandVoid1("Set IP adress of the Mocap server",
56  "IP adress string")));
57 
58  addCommand(
59  "getRigidBodyList",
60  makeCommandVoid0(*this, &QualisysClient::getRigidBodyList,
61  docCommandVoid0("Displays the list of rigid bodies "
62  "streamed by the mocap server")));
63 }
64 
66  m_initSucceeded = true;
67  m_dummySIN = 0;
68  // m_thread.join();
69  // m_CRTProtocol rtProtocol;
70  // const char m_serverAddr[] = "140.93.6.44";
71  // const unsigned short m_basePort = 22222;
72  // const int m_majorVersion = 1;
73  // const int m_minorVersion = 19;
74  // const bool m_bigEndian = false;
75  // bool m_dataAvailable = false;
76  // bool m_streamFrames = false;
77  // unsigned short m_udpPort = 6734;
78 }
79 
80 /* ------------------------------------------------------------------- */
81 /* --- SIGNALS ------------------------------------------------------- */
82 /* ------------------------------------------------------------------- */
83 
84 /* --- COMMANDS ---------------------------------------------------------- */
85 
86 void QualisysClient::registerRigidBody(const std::string& RBname) {
87  m_RBnames.push_back(RBname);
88  int RBidx = m_RBnames.size() - 1;
89  Vector7d initRBposition;
90  initRBposition << RBidx, 0, 0, 0, 0, 0, 0;
91  m_RBpositions.push_back(initRBposition);
92  dg::SignalTimeDependent<dg::Vector, int>* sig;
93  sig = new dg::SignalTimeDependent<dg::Vector, int>(
94  boost::bind(&QualisysClient::readGenericRigidBody, this, RBidx, _1, _2),
95  m_dummySIN,
96  getClassName() + "(" + getName() +
97  ")::output(dynamicgraph::Vector)::xyzquat_" + RBname);
98  // genericSignalRefs.push_back( sig );
99  signalRegistration(*sig);
100 }
101 
102 void QualisysClient::setMocapIPAdress(const std::string& ipAdress) {
103  m_serverAddr = ipAdress;
104 }
105 
107 
108 /* --- PROTECTED MEMBER METHODS
109  * ---------------------------------------------------------- */
110 
112  dg::Vector& res,
113  const int& time) {
114  if (res.size() != 7) {
115  res.resize(7);
116  }
117  m_mutex.lock();
118  res << m_RBpositions[RBidx];
119  m_mutex.unlock();
120  return res;
121 }
122 
124  CRTProtocol rtProtocol;
125  const unsigned short basePort = 22222;
126  const int majorVersion = 1;
127  const int minorVersion = 19;
128  const bool bigEndian = false;
129  bool dataAvailable = false;
130  bool streamFrames = false;
131  unsigned short udpPort = 6734;
132 
133  while (true) {
134  if (!rtProtocol.Connected()) {
135  if (!rtProtocol.Connect(m_serverAddr.c_str(), basePort, &udpPort,
136  majorVersion, minorVersion, bigEndian)) {
137  printf("rtProtocol.Connect: %s\n\n", rtProtocol.GetErrorString());
138  sleep(1);
139  continue;
140  }
141  }
142 
143  if (!dataAvailable) {
144  if (!rtProtocol.Read6DOFSettings(dataAvailable)) {
145  printf("rtProtocol.Read6DOFSettings: %s\n\n",
146  rtProtocol.GetErrorString());
147  sleep(1);
148  continue;
149  }
150  }
151 
152  if (!streamFrames) {
153  if (!rtProtocol.StreamFrames(CRTProtocol::RateAllFrames, 0, udpPort, NULL,
155  printf("rtProtocol.StreamFrames: %s\n\n", rtProtocol.GetErrorString());
156  sleep(1);
157  continue;
158  }
159  }
160  CRTPacket::EPacketType packetType;
161 
162  if (rtProtocol.ReceiveRTPacket(packetType, true) > 0) {
163  if (packetType == CRTPacket::PacketData) {
164  float fX, fY, fZ;
165  float rotationMatrix[9];
166 
167  CRTPacket* rtPacket = rtProtocol.GetRTPacket();
168 
169  // printf("Frame %d\n", rtPacket->GetFrameNumber());
170  for (unsigned int i = 0; i < rtPacket->Get6DOFBodyCount(); i++) {
171  if (rtPacket->Get6DOFBody(i, fX, fY, fZ, rotationMatrix)) {
172  Eigen::Matrix3f rotMat =
173  Eigen::Map<Eigen::Matrix3f>(rotationMatrix);
174  Eigen::Quaternionf quat(rotMat);
175  const char* pTmpStr = rtProtocol.Get6DOFBodyName(i);
176  if (m_printRigidBodyList) {
177  SEND_MSG(" - " + toString(pTmpStr), MSG_TYPE_INFO);
178  std::cout << (" - " + toString(pTmpStr) + "\n"); // Todo remove
179  }
180  if (pTmpStr) {
181  // compare pTmpStr with m_RBnames
182  m_mutex.lock();
183  std::vector<std::string>::iterator it =
184  std::find(m_RBnames.begin(), m_RBnames.end(), pTmpStr);
185  if (it != m_RBnames.end()) {
186  int idx = it - m_RBnames.begin();
187  m_RBpositions[idx] << fX, fY, fZ, quat.w(), quat.x(), quat.y(),
188  quat.z();
189  }
190  m_mutex.unlock();
191  }
192  }
193  }
194  m_printRigidBodyList = false;
195  }
196  }
197 
198  // boost::this_thread::sleep_for(boost::chrono::seconds{1});
199  }
200  rtProtocol.StopCapture();
201  rtProtocol.Disconnect();
202 }
203 /* ------------------------------------------------------------------- */
204 /* --- ENTITY -------------------------------------------------------- */
205 /* ------------------------------------------------------------------- */
206 
207 void QualisysClient::display(std::ostream& os) const {
208  os << "QualisysClient " << getName();
209  try {
210  getProfiler().report_all(3, os);
211  } catch (ExceptionSignal e) {
212  }
213 }
214 
215 } // namespace talos_balance
216 } // namespace sot
217 } // namespace dynamicgraph
bool Get6DOFBody(unsigned int nBodyIndex, float &fX, float &fY, float &fZ, float afRotMatrix[9])
Definition: RTPacket.cpp:690
@ PacketData
Definition: RTPacket.h:29
unsigned int Get6DOFBodyCount()
Definition: RTPacket.cpp:681
bool Read6DOFSettings(bool &bDataAvailable)
static const unsigned int cComponent6d
Definition: RTProtocol.h:32
int ReceiveRTPacket(CRTPacket::EPacketType &eType, bool bSkipEvents=true, int nTimeout=WAIT_FOR_DATA_TIMEOUT)
bool StopCapture()
Definition: RTProtocol.cpp:662
CRTPacket * GetRTPacket()
void Disconnect()
Definition: RTProtocol.cpp:171
bool StreamFrames(EStreamRate eRate, unsigned int nRateArg, unsigned short nUDPPort, const char *pUDPAddr, unsigned int nComponentType, const SComponentOptions &componentOptions={})
Definition: RTProtocol.cpp:348
bool Connect(const char *pServerAddr, unsigned short nPort, unsigned short *pnUDPServerPort=nullptr, int nMajorVersion=MAJOR_VERSION, int nMinorVersion=MINOR_VERSION, bool bBigEndian=false)
Definition: RTProtocol.cpp:72
const char * Get6DOFBodyName(unsigned int nBodyIndex) const
char * GetErrorString()
bool Connected() const
Definition: RTProtocol.cpp:181
EIGEN_MAKE_ALIGNED_OPERATOR_NEW QualisysClient(const std::string &name)
void setMocapIPAdress(const std::string &ipAdress)
virtual void display(std::ostream &os) const
void registerRigidBody(const std::string &RBname)
dg::Vector & readGenericRigidBody(const int RBidx, dg::Vector &res, const int &time)
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: fwd.hh:36
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceControllerEndEffector, "AdmittanceControllerEndEffector")
#define INPUT_SIGNALS