SPIDAR API Library  0x16033101
Space Interface Device for Artificial Reality
Spidar.cpp
Go to the documentation of this file.
1 
5 #include "Spidar.h"
6 
7 #include "../controller/ControllerFtd2xx.hpp"
8 #include "../parser/SpecParserRapidJson.hpp"
9 
10 #include "../core/DeviceSpec.hpp"
11 #include "../core/Pose.hpp"
12 #include "../core/WireVector.hpp"
13 #include "../core/SpringDamperModel.hpp"
14 #include "../core/PoseEstimation.hpp"
15 #include "../core/ForceDecomposition.hpp"
16 #include "../core/SpidarSystem.hpp"
17 
18 #include "../math/Vector.hpp"
19 #include "../math/Quaternion.hpp"
20 #include "../math/Matrix.hpp"
21 #include "../math/LowPassFilter.hpp"
22 #include "../math/QuadraticProgramming.hpp"
23 
24 #include "../win32/DataLogger.hpp"
25 #include "../win32/Timer.hpp"
26 #include "../win32/Thread.hpp"
27 #include "../win32/SpidarTraits.hpp"
28 
29 #include <map>
30 
35 namespace
36 {
37 #define SPIDAR_VERSION 0x16033101
38 
40 typedef Spidar::Controller::ControllerFtd2xx ControllerType;
41 
42 typedef SpidarTraits::SpecType SpecType;
44 
45 typedef SystemType::ValueType ValueType;
46 typedef SystemType::VectorType VectorType;
47 typedef SystemType::QuaternionType QuaternionType;
48 
49 typedef std::pair<SystemType*, ControllerType*> SpidarPairType;
50 
51 std::map<uint32_t, SpidarPairType> spidar;
52 }
53 
61 SPIDAR_API BOOL __stdcall SpidarGetLibraryVersion(UINT& version)
62 {
63  version = SPIDAR_VERSION;
64  return TRUE;
65 }
66 
80 SPIDAR_API BOOL __stdcall SpidarInitialize(LPCSTR fileName, UINT& serialNumber)
81 {
82  SpecType spec;
83 
84  ParserType parser;
85 
86  std::string filename = fileName;
87 
88  if (!parser.parse(filename, spec)) return FALSE;
89 
90  if (spidar.count(spec.serialNumber) != 0 &&
91  (spidar[spec.serialNumber].first != nullptr || spidar[spec.serialNumber].second != nullptr)) return FALSE;
92 
93  spidar[spec.serialNumber].first = new SystemType();
94 
95  if (!spidar[spec.serialNumber].first->initialize(spec))
96  {
97  delete spidar[spec.serialNumber].first;
98  spidar[spec.serialNumber].first = nullptr;
99  spidar.erase(spec.serialNumber);
100 
101  return FALSE;
102  }
103 
104  serialNumber = spec.serialNumber;
105 
106  return TRUE;
107 }
124 SPIDAR_API BOOL __stdcall SpidarInitializeController(UINT serialNumber)
125 {
126  if (spidar.count(serialNumber) != 0 &&
127  (spidar[serialNumber].first != nullptr || spidar[serialNumber].second != nullptr)) return FALSE;
128 
129  spidar[serialNumber].second = new Spidar::Controller::ControllerFtd2xx();
130 
131  if (!spidar[serialNumber].second->initialize(serialNumber))
132  {
133  delete spidar[serialNumber].second;
134  spidar[serialNumber].second = nullptr;
135  spidar.erase(serialNumber);
136 
137  return FALSE;
138  }
139 
140  return TRUE;
141 }
152 SPIDAR_API BOOL __stdcall SpidarTerminate(UINT serialNumber)
153 {
154  BOOL retval = TRUE;
155 
156  if (spidar.count(serialNumber) != 0)
157  {
158  if (spidar[serialNumber].first != nullptr)
159  {
160  retval = spidar[serialNumber].first->terminate() ? TRUE : FALSE;
161 
162  delete spidar[serialNumber].first;
163  spidar[serialNumber].first = nullptr;
164 
165  }
166  else if (spidar[serialNumber].second != nullptr)
167  {
168  retval = spidar[serialNumber].second->terminate() ? TRUE : FALSE;
169 
170  delete spidar[serialNumber].second;
171  spidar[serialNumber].second = nullptr;
172  }
173  spidar.erase(serialNumber);
174  }
175  return retval;
176 }
177 
188 SPIDAR_API BOOL __stdcall SpidarCalibrate(UINT serialNumber)
189 {
190  if (!spidar[serialNumber].first) return FALSE;
191 
192  spidar[serialNumber].first->calibrate();
193 
194  return TRUE;
195 }
196 
204 SPIDAR_API BOOL __stdcall SpidarSetHaptics(UINT serialNumber, BOOL enable)
205 {
206  if (!spidar[serialNumber].first) return FALSE;
207 
208  spidar[serialNumber].first->setHaptics(enable ? true : false);
209 
210  return TRUE;
211 }
212 
222 SPIDAR_API BOOL __stdcall SpidarSetCascadeGain(UINT serialNumber, FLOAT gain)
223 {
224  if (!spidar[serialNumber].first) return FALSE;
225 
226  spidar[serialNumber].first->setCascadeGain(gain);
227 
228  return TRUE;
229 }
230 
238 SPIDAR_API BOOL __stdcall SpidarStart(UINT serialNumber)
239 {
240  if (!spidar[serialNumber].first) return FALSE;
241 
242  spidar[serialNumber].first->start();
243 
244  return TRUE;
245 }
246 
254 SPIDAR_API BOOL __stdcall SpidarStop(UINT serialNumber)
255 {
256  if (!spidar[serialNumber].first) return FALSE;
257 
258  spidar[serialNumber].first->stop();
259 
260  return TRUE;
261 }
262 
274 SPIDAR_API BOOL __stdcall SpidarGetPose(UINT serialNumber, Vector3& position, Quaternion& rotation,
275  Vector3& velocity, Vector3& angularVelocity)
276 {
277  if (!spidar[serialNumber].first) return FALSE;
278 
279  VectorType pos;
280  QuaternionType rot;
281  VectorType vel;
282  VectorType avel;
283 
284  spidar[serialNumber].first->gripPose(pos, rot, vel, avel);
285 
286  position.x = static_cast<float>(pos.x());
287  position.y = static_cast<float>(pos.y());
288  position.z = static_cast<float>(pos.z());
289 
290  rotation.x = static_cast<float>(rot.x);
291  rotation.y = static_cast<float>(rot.y);
292  rotation.z = static_cast<float>(rot.z);
293  rotation.w = static_cast<float>(rot.w);
294 
295  velocity.x = static_cast<float>(vel.x());
296  velocity.y = static_cast<float>(vel.y());
297  velocity.z = static_cast<float>(vel.z());
298 
299  angularVelocity.x = static_cast<float>(avel.x());
300  angularVelocity.y = static_cast<float>(avel.y());
301  angularVelocity.z = static_cast<float>(avel.z());
302 
303  return TRUE;
304 }
305 
315 SPIDAR_API BOOL __stdcall SpidarGetEncoderCount(UINT serialNumber, INT(&count)[8])
316 {
317  if (!spidar[serialNumber].first) return FALSE;
318 
319  spidar[serialNumber].first->encoderCount(count);
320 
321  return TRUE;
322 }
323 
338 SPIDAR_API BOOL __stdcall SpidarSetForce(UINT serialNumber, const Vector3& force, FLOAT forceK, FLOAT forceB,
339  const Vector3& torque, FLOAT torqueK, FLOAT torqueB, BOOL lerp, BOOL cascade)
340 {
341  if (!spidar[serialNumber].first) return FALSE;
342 
343  VectorType f, t;
344 
345  f.x() = force.x;
346  f.y() = force.y;
347  f.z() = force.z;
348 
349  t.x() = torque.x;
350  t.y() = torque.y;
351  t.z() = torque.z;
352 
353  spidar[serialNumber].first->setForce(f, forceK, forceB, t, torqueK, torqueB, lerp ? true : false, cascade ? true : false);
354 
355  return TRUE;
356 }
357 
375 SPIDAR_API BOOL __stdcall SpidarEnableMotorControl(UINT serialNumber, BOOL enable)
376 {
377  if (!spidar[serialNumber].second) return FALSE;
378 
379  if (enable)
380  {
381  if (!spidar[serialNumber].second->enableMotorControl()) return FALSE;
382  }
383  else
384  {
385  if (!spidar[serialNumber].second->disableMotorControl()) return FALSE;
386  }
387 
388  return TRUE;
389 }
390 
398 SPIDAR_API BOOL __stdcall SpidarWritePulseWidth(UINT serialNumber, const UINT(&pulseWidth)[8])
399 {
400  if (!spidar[serialNumber].second) return FALSE;
401 
402  uint16_t width[SpidarTraits::MOTOR_COUNT];
403 
404  for (size_t i = 0; i < SpidarTraits::MOTOR_COUNT; ++i)
405  {
406  width[i] = pulseWidth[i];
407  }
408  if (!spidar[serialNumber].second->writePulseWidth(width)) return FALSE;
409 
410  return TRUE;
411 }
412 
420 SPIDAR_API BOOL __stdcall SpidarGetMaxPulseWidth(UINT serialNumber, UINT& maxPulseWidth)
421 {
422  if (!spidar[serialNumber].second) return FALSE;
423 
424  maxPulseWidth = spidar[serialNumber].second->maxPulseWidth();
425 
426  return TRUE;
427 }
428 
436 SPIDAR_API BOOL __stdcall SpidarReadEncoderCount(UINT serialNumber, INT(&count)[8])
437 {
438  if (!spidar[serialNumber].second) return FALSE;
439 
440  if (!spidar[serialNumber].second->readEncoderCount(count)) return FALSE;
441 
442  return TRUE;
443 }
444 
451 SPIDAR_API BOOL __stdcall SpidarClearEncoderCount(UINT serialNumber)
452 {
453  if (!spidar[serialNumber].second) return FALSE;
454 
455  if (!spidar[serialNumber].second->clearEncoderCount()) return FALSE;
456 
457  return TRUE;
458 }
459 
464 //
465 // その他
466 //
467 
477 SPIDAR_API BOOL __stdcall SpidarGetGpioValue(UINT serialNumber, UINT& value)
478 {
479  if (spidar[serialNumber].first)
480  {
481  value = spidar[serialNumber].first->gpioValue();
482  return TRUE;
483  }
484  else if (spidar[serialNumber].second)
485  {
486  value = spidar[serialNumber].second->gpioValue();
487  return TRUE;
488  }
489 
490  return FALSE;
491 }
492 
504 SPIDAR_API BOOL __stdcall SpidarGetDeltaTime(UINT serialNumber, FLOAT& deltaTime)
505 {
506  if (!spidar[serialNumber].first) return FALSE;
507 
508  deltaTime = static_cast<FLOAT>(spidar[serialNumber].first->deltaTime());
509 
510  return TRUE;
511 }
512 
519 SPIDAR_API BOOL __stdcall SpidarGetGripRadius(UINT serialNumber, FLOAT& gripRadius)
520 {
521  if (!spidar[serialNumber].first) return FALSE;
522 
523  gripRadius = static_cast<FLOAT>(spidar[serialNumber].first->gripRadius());
524 
525  return TRUE;
526 }
527 
533 SPIDAR_API BOOL __stdcall SpidarStartLog(UINT serialNumber)
534 {
535  if (!spidar[serialNumber].first) return FALSE;
536 
537  spidar[serialNumber].first->startLog();
538 
539  return TRUE;
540 }
541 
561 // end of file.
SPIDAR_API BOOL __stdcall SpidarGetPose(UINT serialNumber, Vector3 &position, Quaternion &rotation, Vector3 &velocity, Vector3 &angularVelocity)
グリップの姿勢を取得します.
Definition: Spidar.cpp:274
SPIDAR_API BOOL __stdcall SpidarGetGpioValue(UINT serialNumber, UINT &value)
GPIOの値を取得します.
Definition: Spidar.cpp:477
SPIDAR_API BOOL __stdcall SpidarSetCascadeGain(UINT serialNumber, FLOAT gain)
カスケード制御用ゲインを設定します.
Definition: Spidar.cpp:222
SPIDAR_API BOOL __stdcall SpidarTerminate(UINT serialNumber)
SPIDARを終了します.
Definition: Spidar.cpp:152
SPIDAR_API BOOL __stdcall SpidarStop(UINT serialNumber)
システムの動作を停止します.
Definition: Spidar.cpp:254
SPIDAR_API BOOL __stdcall SpidarEnableMotorControl(UINT serialNumber, BOOL enable)
コントローラ単体での動作状態を変更します.
Definition: Spidar.cpp:375
SPIDAR_API BOOL __stdcall SpidarGetGripRadius(UINT serialNumber, FLOAT &gripRadius)
グリップの半径を取得します.
Definition: Spidar.cpp:519
SPIDAR_API BOOL __stdcall SpidarStart(UINT serialNumber)
システムの動作を開始します.
Definition: Spidar.cpp:238
SPIDAR_API BOOL __stdcall SpidarSetHaptics(UINT serialNumber, BOOL enable)
力覚提示の有無を設定します.
Definition: Spidar.cpp:204
SPIDAR設定ファイル用パーサクラスです.
SPIDARコントローラ基板制御クラスです.
SPIDAR_API BOOL __stdcall SpidarInitializeController(UINT serialNumber)
SPIDARコントローラを初期化します.
Definition: Spidar.cpp:124
SPIDAR_API BOOL __stdcall SpidarGetDeltaTime(UINT serialNumber, FLOAT &deltaTime)
制御周期(実測値)を取得します.
Definition: Spidar.cpp:504
3次元ベクトル型の構造体です.
Definition: Spidar.h:17
SPIDAR_API BOOL __stdcall SpidarCalibrate(UINT serialNumber)
グリップ姿勢のキャリブレーションを実行します.
Definition: Spidar.cpp:188
SPIDAR_API BOOL __stdcall SpidarGetLibraryVersion(UINT &version)
SPIDAR APIのライブラリバージョンを取得します.
Definition: Spidar.cpp:61
SPIDAR_API BOOL __stdcall SpidarGetMaxPulseWidth(UINT serialNumber, UINT &maxPulseWidth)
PWMのパルス幅の最大値を取得します.
Definition: Spidar.cpp:420
SPIDAR_API BOOL __stdcall SpidarClearEncoderCount(UINT serialNumber)
エンコーダ値をクリアします.
Definition: Spidar.cpp:451
SPIDAR_API BOOL __stdcall SpidarWritePulseWidth(UINT serialNumber, const UINT(&pulseWidth)[8])
PWMのパルス幅を書き込みます.
Definition: Spidar.cpp:398
四元数型の構造体です.
Definition: Spidar.h:23
SPIDARデバイスの情報を取得するための構造体です.
Definition: DeviceSpec.hpp:25
SPIDARシステムクラスです.
SPIDAR_API BOOL __stdcall SpidarSetForce(UINT serialNumber, const Vector3 &force, FLOAT forceK, FLOAT forceB, const Vector3 &torque, FLOAT torqueK, FLOAT torqueB, BOOL lerp, BOOL cascade)
提示力の目標値を設定します.
Definition: Spidar.cpp:338
SPIDAR_API BOOL __stdcall SpidarGetEncoderCount(UINT serialNumber, INT(&count)[8])
エンコーダ値を取得します.
Definition: Spidar.cpp:315
SPIDAR_API BOOL __stdcall SpidarInitialize(LPCSTR fileName, UINT &serialNumber)
SPIDARシステムを初期化します.
Definition: Spidar.cpp:80
SPIDAR_API BOOL __stdcall SpidarStartLog(UINT serialNumber)
ログの記録を開始します.
Definition: Spidar.cpp:533
SPIDAR_API BOOL __stdcall SpidarReadEncoderCount(UINT serialNumber, INT(&count)[8])
エンコーダ値を読み込みます.
Definition: Spidar.cpp:436