34#include <visp3/core/vpConfig.h>
36#ifdef VISP_HAVE_QUALISYS
41#include <visp3/core/vpTime.h>
42#include <visp3/sensor/vpMocapQualisys.h>
44#include <qualisys_cpp_sdk/RTPacket.h>
45#include <qualisys_cpp_sdk/RTProtocol.h>
48#ifndef DOXYGEN_SHOULD_SKIP_THIS
49class vpMocapQualisys::vpMocapQualisysImpl
53 : m_rtProtocol(), m_basePort(22222), m_udpPort(6734), m_majorVersion(1), m_minorVersion(19), m_bigEndian(false),
54 m_dataAvailable(false), m_streamFrames(false), m_verbose(false), m_serverAddr()
57 virtual ~vpMocapQualisysImpl() { close(); }
61 m_rtProtocol.StopCapture();
62 m_rtProtocol.Disconnect();
68 for (
auto i = 0;
i < n_attempt;
i++) {
69 if (!m_rtProtocol.Connected()) {
70 if (!m_rtProtocol.Connect(m_serverAddr.c_str(), m_basePort, &m_udpPort, m_majorVersion, m_minorVersion,
72 std::cout <<
"Qualisys connection error: " << m_rtProtocol.GetErrorString() << std::endl;
79 std::cout <<
"Qualisys connected" << std::endl;
81 return verifyDataStreamed();
85 std::cout <<
"Qualisys connection timeout" << std::endl;
90 bool verifyDataStreamed()
92 bool readSettingsOK =
false;
94 for (
auto i = 0;
i < 6;
i++) {
95 if (!m_dataAvailable) {
96 if (!m_rtProtocol.Read6DOFSettings(m_dataAvailable)) {
98 std::cout <<
"Reading 6DOF settings error: " << m_rtProtocol.GetErrorString() << std::endl;
105 if (m_verbose && !readSettingsOK) {
106 std::cout <<
"Reading 6DOF settings succeded." << std::endl;
108 readSettingsOK =
true;
112 if (!readSettingsOK) {
114 std::cout <<
"Reading 6DOF settings timeout: " << std::endl;
119 for (
auto i = 0;
i < 6;
i++) {
120 if (!m_streamFrames) {
121#if (VP_VERSION_INT(MAJOR_VERSION, MINOR_VERSION, 0) >= VP_VERSION_INT(1, 27, 0))
122 if (!m_rtProtocol.StreamFrames(CRTProtocol::EStreamRate::RateAllFrames, 0, m_udpPort,
nullptr, CRTProtocol::cComponent6d))
124 if (!m_rtProtocol.StreamFrames(CRTProtocol::RateAllFrames, 0, m_udpPort,
nullptr, CRTProtocol::cComponent6d))
128 std::cout <<
"Streaming frames error: " << m_rtProtocol.GetErrorString() << std::endl;
133 m_streamFrames =
true;
137 std::cout <<
"Starting to stream 6DOF data" << std::endl;
143 std::cout <<
"Streaming frames timeout: " << std::endl;
149 bool getBodyPose(
int iBody, std::string &name, vpHomogeneousMatrix &M, CRTPacket *rtPacket)
152 float rotationMatrix[9];
154 if (rtPacket->Get6DOFBody(iBody, fX, fY, fZ, rotationMatrix)) {
155 const char *pTmpStr = m_rtProtocol.Get6DOFBodyName(iBody);
157 name = std::string(pTmpStr);
161 std::cout <<
"Unknown body" << std::endl;
166 M[0][3] = fX / 1000.;
167 M[1][3] = fY / 1000.;
168 M[2][3] = fZ / 1000.;
171 for (
unsigned int j = 0;
j < 3;
j++) {
172 for (
unsigned int i = 0;
i < 3;
i++) {
173 M[
i][
j] = rotationMatrix[k++];
184 bool getBodiesPose(std::map<std::string, vpHomogeneousMatrix> &bodies_pose,
bool all_bodies)
186 CRTPacket::EPacketType packetType;
188 if (m_rtProtocol.Receive(packetType,
true) == CNetwork::ResponseType::success) {
189 if (packetType == CRTPacket::PacketData) {
190 CRTPacket *rtPacket = m_rtProtocol.GetRTPacket();
191 for (
unsigned int iBody = 0; iBody < rtPacket->Get6DOFBodyCount(); iBody++) {
192 std::string bodyName;
194 vpHomogeneousMatrix bodyPose;
195 if (!getBodyPose(iBody, bodyName, bodyPose, rtPacket)) {
196 std::cout <<
"Error : Could not get pose from body n°" << iBody << std::endl;
201 bodies_pose[bodyName] = bodyPose;
204 bodies_pose[bodyName] = bodyPose;
213 bool getSpecificBodyPose(
const std::string &body_name, vpHomogeneousMatrix &body_pose)
215 std::map<std::string, vpHomogeneousMatrix> bodies_pose;
216 if (getBodiesPose(bodies_pose,
true)) {
217 if (bodies_pose.find(body_name) != bodies_pose.end()) {
218 body_pose = bodies_pose[body_name];
220 std::cout <<
"I found bodyName" << body_name << std::endl;
225 std::cout <<
"The body " << body_name <<
" was not found in Qualisys. Please check the name you typed."
232 std::cout <<
"Error : could not process data from Qualisys" << std::endl;
238 void setServerAddress(
const std::string &serverAddr) { m_serverAddr = serverAddr; }
240 void setVerbose(
bool verbose) { m_verbose = verbose; }
243 CRTProtocol m_rtProtocol;
244 unsigned short m_basePort;
245 unsigned short m_udpPort;
249 bool m_dataAvailable;
252 std::string m_serverAddr;
291 return m_impl->getBodiesPose(bodies_pose, all_bodies);
302 return m_impl->getSpecificBodyPose(body_name, body_pose);
321void dummy_vpMocapQualisys() { }
Implementation of an homogeneous matrix and operations on such kind of matrices.
void setServerAddress(const std::string &serverAddr)
bool getSpecificBodyPose(const std::string &body_name, vpHomogeneousMatrix &body_pose)
void setVerbose(bool verbose)
virtual ~vpMocapQualisys()
bool getBodiesPose(std::map< std::string, vpHomogeneousMatrix > &bodies_pose, bool all_bodies=false)
VISP_EXPORT void sleepMs(double t)