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 ---------------------------------------------------- */
35 DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(QualisysClient, "QualisysClient");
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
INPUT_SIGNALS
#define INPUT_SIGNALS
Definition: qualisys-client.cpp:27
sot_talos_balance.test.appli_admittance_end_effector.sot
sot
Definition: appli_admittance_end_effector.py:117
dynamicgraph::sot::talos_balance::QualisysClient::m_mutex
boost::mutex m_mutex
Definition: qualisys-client.hh:94
CRTProtocol::StreamFrames
bool StreamFrames(EStreamRate eRate, unsigned int nRateArg, unsigned short nUDPPort, const char *pUDPAddr, unsigned int nComponentType, const SComponentOptions &componentOptions={})
Definition: RTProtocol.cpp:348
dynamicgraph::sot::talos_balance::QualisysClient::getRigidBodyList
void getRigidBodyList()
Definition: qualisys-client.cpp:106
dynamicgraph::sot::talos_balance::QualisysClient::m_RBnames
std::vector< std::string > m_RBnames
Definition: qualisys-client.hh:90
dynamicgraph
Definition: treeview.dox:24
CRTPacket::EPacketType
EPacketType
Definition: RTPacket.h:25
qualisys-client.hh
dynamicgraph::sot::talos_balance::QualisysClient::m_initSucceeded
bool m_initSucceeded
Definition: qualisys-client.hh:87
CRTProtocol
Definition: RTProtocol.h:26
CRTProtocol::Get6DOFBodyName
const char * Get6DOFBodyName(unsigned int nBodyIndex) const
Definition: RTProtocol.cpp:3299
CRTPacket::PacketData
@ PacketData
Definition: RTPacket.h:29
CRTProtocol::cComponent6d
static const unsigned int cComponent6d
Definition: RTProtocol.h:32
CRTProtocol::GetRTPacket
CRTPacket * GetRTPacket()
Definition: RTProtocol.cpp:1132
CRTProtocol::StopCapture
bool StopCapture()
Definition: RTProtocol.cpp:662
CRTPacket::Get6DOFBodyCount
unsigned int Get6DOFBodyCount()
Definition: RTPacket.cpp:681
CRTProtocol::RateAllFrames
@ RateAllFrames
Definition: RTProtocol.h:56
dynamicgraph::sot::talos_balance::QualisysClient::manageNetworkFrame
void manageNetworkFrame()
Definition: qualisys-client.cpp:123
statistics.hh
dynamicgraph::sot::talos_balance::QualisysClient::m_serverAddr
std::string m_serverAddr
Definition: qualisys-client.hh:95
dynamicgraph::sot::talos_balance::QualisysClient::display
virtual void display(std::ostream &os) const
Definition: qualisys-client.cpp:207
dynamicgraph::sot::talos_balance::QualisysClient::m_RBpositions
std::vector< dg::Vector > m_RBpositions
Definition: qualisys-client.hh:91
dynamicgraph::sot::talos_balance::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: fwd.hh:36
CRTProtocol::Read6DOFSettings
bool Read6DOFSettings(bool &bDataAvailable)
Definition: RTProtocol.cpp:2151
dynamicgraph::sot::talos_balance::QualisysClient::setMocapIPAdress
void setMocapIPAdress(const std::string &ipAdress)
Definition: qualisys-client.cpp:102
dynamicgraph::sot::talos_balance::QualisysClient::registerRigidBody
void registerRigidBody(const std::string &RBname)
Definition: qualisys-client.cpp:86
CRTProtocol::ReceiveRTPacket
int ReceiveRTPacket(CRTPacket::EPacketType &eType, bool bSkipEvents=true, int nTimeout=WAIT_FOR_DATA_TIMEOUT)
Definition: RTProtocol.cpp:1011
dynamicgraph::sot::talos_balance::QualisysClient::readGenericRigidBody
dg::Vector & readGenericRigidBody(const int RBidx, dg::Vector &res, const int &time)
Definition: qualisys-client.cpp:111
dynamicgraph::sot::talos_balance::DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceControllerEndEffector, "AdmittanceControllerEndEffector")
CRTProtocol::Connect
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
CRTProtocol::GetErrorString
char * GetErrorString()
Definition: RTProtocol.cpp:4155
CRTPacket
Definition: RTPacket.h:23
dynamicgraph::sot::talos_balance::EntityClassName
AdmittanceControllerEndEffector EntityClassName
Definition: admittance-controller-end-effector.cpp:46
sot_talos_balance.test.appli_dcm_zmp_control.name
name
Definition: appli_dcm_zmp_control.py:298
CRTProtocol::Connected
bool Connected() const
Definition: RTProtocol.cpp:181
CRTProtocol::Disconnect
void Disconnect()
Definition: RTProtocol.cpp:171
dynamicgraph::sot::talos_balance::QualisysClient::init
void init()
Definition: qualisys-client.cpp:65
dynamicgraph::sot::talos_balance::QualisysClient::QualisysClient
EIGEN_MAKE_ALIGNED_OPERATOR_NEW QualisysClient(const std::string &name)
Definition: qualisys-client.cpp:40
dynamicgraph::sot::talos_balance::QualisysClient::m_printRigidBodyList
bool m_printRigidBodyList
Definition: qualisys-client.hh:88
CRTPacket::Get6DOFBody
bool Get6DOFBody(unsigned int nBodyIndex, float &fX, float &fY, float &fZ, float afRotMatrix[9])
Definition: RTPacket.cpp:690