Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
vpForceTorqueIitSensor.cpp
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2025 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * Wrapper over IIT force-torque sensor.
32 *
33 * Authors:
34 * Alexander Oliva
35 */
36
41
42#include <visp3/sensor/vpForceTorqueIitSensor.h>
43
44#if defined(VISP_HAVE_FT_IIT_SDK) && defined(VISP_HAVE_THREADS)
45
56{
57 // Get number of connected in library sensors
58 m_numSensorsInLib = m_ftLib._getNumberOfConnectedSensors();
59
60 /*
61 * Initialize Communication with sensor(-s):
62 *
63 * streaming is configured with "storeOption=0",
64 * which means that data will be stored in the library's main thread
65 * and will be given in an output file.
66 *
67 * "storeDataFlag" is initialized as "false", so that the
68 * recording will not start with the streaming thread, but
69 * the moment for when the recording will start & stop.
70 */
71 if (m_ftLib._configureStreaming(false, 0) == 0) {
72 // Start the main acquisition thread
73 m_ftLib._startStreamingThread();
74
75 m_connected = true;
76 }
77}
78
83{
84 m_ftLib._stopStreamingThread();
86 m_dataValid = false;
87}
88
93
98{
99 if (m_acquisitionThread.joinable()) {
100 m_acquisitionThread.join();
101 }
102}
103
108{
109 m_timePrev = m_timeCur = std::chrono::system_clock::now();
110
111 // Main thread
112 auto time_init = std::chrono::system_clock::now();
113 while (m_acquisitionEnabled) {
114
115 // Get time passed since the last acquired sample
116 m_timeCur = std::chrono::system_clock::now();
117
118 // Calculate delta time
119 auto elapsed_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(m_timeCur - m_timePrev).count();
120
121 if (elapsed_milliseconds >= 1) {
122 /*
123 * Once a new aquisition started,
124 * reset loop timers to keep a relatively fixed sampling time
125 */
126 // Update previous time
128
129 /*
130 * get all connected sensors' data:
131 * call to a mutex method allowing to access the ftsensors' data
132 * in streaming mode (1 sample / packet / sensor)
133 */
134 m_ftSensorsData = m_ftLib._getFTSensorsData();
135
136 // Warm up the sensor. At the beginning we experienced that values returned in m_ftSensorsData.ftSensor->ft
137 // are completly wrong like the following:
138 // 2.237378396e+11 207.3293304 14291.07715 1.479413346e+19 13.26593399 3380.078613
139 auto warmup_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(m_timeCur - time_init).count();
140 if (warmup_milliseconds > m_warmupMilliseconds) {
141 m_dataValid = true;
142 }
143 else {
144 continue;
145 }
146
147 const std::lock_guard<std::mutex> lock(m_mutex);
148 for (unsigned int i = 0; i < 6; i++) {
149 m_ft[i] = m_ftSensorsData.ftSensor->ft[i];
150 m_ft_filt[i] = m_ftSensorsData.ftSensor->filt_ft[i];
151 }
152 }
153 }
154}
155
159void vpForceTorqueIitSensor::bias() { m_ftLib._biasAllFTSensorsTCP(); }
160
172bool vpForceTorqueIitSensor::connected(int timeout_ms) const
173{
174 vpChrono chrono;
175 chrono.start();
176 while (!m_connected && chrono.getDurationMs() < timeout_ms) {
178 }
179
180 return m_connected;
181}
182
206{
207 const std::lock_guard<std::mutex> lock(m_mutex);
208 if (filtered) {
209 return m_ft_filt;
210 }
211 else {
212 return m_ft;
213 }
214}
215
220{
222 m_acquisitionThread = std::thread([this] { this->acquisitionLoop(); });
223
224 while (!m_dataValid) {
225 vpTime::wait(10);
226 }
227}
228
233{
234 m_acquisitionEnabled = false;
235 if (m_acquisitionThread.joinable()) {
236 m_acquisitionThread.join();
237 }
238}
239END_VISP_NAMESPACE
240#else
241// Work around to avoid warning:
242// libvisp_sensor.a(vpForceTorqueIitSensor.cpp.o) has no symbols
243void dummy_vpForceTorqueIitSensor() { }
244#endif
void start(bool reset=true)
Definition vpTime.cpp:411
double getDurationMs()
Definition vpTime.cpp:400
Implementation of column vector and the associated operations.
std::chrono::time_point< std::chrono::system_clock > m_timePrev
std::atomic< bool > m_dataValid
bool connected(int timeout_ms=0) const
std::chrono::time_point< std::chrono::system_clock > m_timeCur
ftSensorsConnected m_ftSensorsData
vpColVector getForceTorque(bool filtered=false)
std::atomic< bool > m_acquisitionEnabled
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT void sleepMs(double t)