7 #include "../controller/ControllerFtd2xx.hpp" 8 #include "../parser/SpecParserRapidJson.hpp" 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" 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" 24 #include "../win32/DataLogger.hpp" 25 #include "../win32/Timer.hpp" 26 #include "../win32/Thread.hpp" 27 #include "../win32/SpidarTraits.hpp" 37 #define SPIDAR_VERSION 0x16033101 45 typedef SystemType::ValueType ValueType;
46 typedef SystemType::VectorType VectorType;
47 typedef SystemType::QuaternionType QuaternionType;
49 typedef std::pair<SystemType*, ControllerType*> SpidarPairType;
51 std::map<uint32_t, SpidarPairType> spidar;
63 version = SPIDAR_VERSION;
86 std::string filename = fileName;
88 if (!parser.parse(filename, spec))
return FALSE;
90 if (spidar.count(spec.serialNumber) != 0 &&
91 (spidar[spec.serialNumber].first !=
nullptr || spidar[spec.serialNumber].second !=
nullptr))
return FALSE;
93 spidar[spec.serialNumber].first =
new SystemType();
95 if (!spidar[spec.serialNumber].first->initialize(spec))
97 delete spidar[spec.serialNumber].first;
98 spidar[spec.serialNumber].first =
nullptr;
99 spidar.erase(spec.serialNumber);
104 serialNumber = spec.serialNumber;
126 if (spidar.count(serialNumber) != 0 &&
127 (spidar[serialNumber].first !=
nullptr || spidar[serialNumber].second !=
nullptr))
return FALSE;
131 if (!spidar[serialNumber].second->initialize(serialNumber))
133 delete spidar[serialNumber].second;
134 spidar[serialNumber].second =
nullptr;
135 spidar.erase(serialNumber);
156 if (spidar.count(serialNumber) != 0)
158 if (spidar[serialNumber].first !=
nullptr)
160 retval = spidar[serialNumber].first->terminate() ? TRUE : FALSE;
162 delete spidar[serialNumber].first;
163 spidar[serialNumber].first =
nullptr;
166 else if (spidar[serialNumber].second !=
nullptr)
168 retval = spidar[serialNumber].second->terminate() ? TRUE : FALSE;
170 delete spidar[serialNumber].second;
171 spidar[serialNumber].second =
nullptr;
173 spidar.erase(serialNumber);
190 if (!spidar[serialNumber].first)
return FALSE;
192 spidar[serialNumber].first->calibrate();
206 if (!spidar[serialNumber].first)
return FALSE;
208 spidar[serialNumber].first->setHaptics(enable ?
true :
false);
224 if (!spidar[serialNumber].first)
return FALSE;
226 spidar[serialNumber].first->setCascadeGain(gain);
240 if (!spidar[serialNumber].first)
return FALSE;
242 spidar[serialNumber].first->start();
256 if (!spidar[serialNumber].first)
return FALSE;
258 spidar[serialNumber].first->stop();
277 if (!spidar[serialNumber].first)
return FALSE;
284 spidar[serialNumber].first->gripPose(pos, rot, vel, avel);
286 position.x =
static_cast<float>(pos.x());
287 position.y =
static_cast<float>(pos.y());
288 position.z =
static_cast<float>(pos.z());
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);
295 velocity.x =
static_cast<float>(vel.x());
296 velocity.y =
static_cast<float>(vel.y());
297 velocity.z =
static_cast<float>(vel.z());
299 angularVelocity.x =
static_cast<float>(avel.x());
300 angularVelocity.y =
static_cast<float>(avel.y());
301 angularVelocity.z =
static_cast<float>(avel.z());
317 if (!spidar[serialNumber].first)
return FALSE;
319 spidar[serialNumber].first->encoderCount(count);
339 const Vector3& torque, FLOAT torqueK, FLOAT torqueB, BOOL lerp, BOOL cascade)
341 if (!spidar[serialNumber].first)
return FALSE;
353 spidar[serialNumber].first->setForce(f, forceK, forceB, t, torqueK, torqueB, lerp ?
true :
false, cascade ?
true :
false);
377 if (!spidar[serialNumber].second)
return FALSE;
381 if (!spidar[serialNumber].second->enableMotorControl())
return FALSE;
385 if (!spidar[serialNumber].second->disableMotorControl())
return FALSE;
400 if (!spidar[serialNumber].second)
return FALSE;
402 uint16_t width[SpidarTraits::MOTOR_COUNT];
404 for (
size_t i = 0; i < SpidarTraits::MOTOR_COUNT; ++i)
406 width[i] = pulseWidth[i];
408 if (!spidar[serialNumber].second->writePulseWidth(width))
return FALSE;
422 if (!spidar[serialNumber].second)
return FALSE;
424 maxPulseWidth = spidar[serialNumber].second->maxPulseWidth();
438 if (!spidar[serialNumber].second)
return FALSE;
440 if (!spidar[serialNumber].second->readEncoderCount(count))
return FALSE;
453 if (!spidar[serialNumber].second)
return FALSE;
455 if (!spidar[serialNumber].second->clearEncoderCount())
return FALSE;
479 if (spidar[serialNumber].first)
481 value = spidar[serialNumber].first->gpioValue();
484 else if (spidar[serialNumber].second)
486 value = spidar[serialNumber].second->gpioValue();
506 if (!spidar[serialNumber].first)
return FALSE;
508 deltaTime =
static_cast<FLOAT
>(spidar[serialNumber].first->deltaTime());
521 if (!spidar[serialNumber].first)
return FALSE;
523 gripRadius =
static_cast<FLOAT
>(spidar[serialNumber].first->gripRadius());
535 if (!spidar[serialNumber].first)
return FALSE;
537 spidar[serialNumber].first->startLog();
SPIDAR_API BOOL __stdcall SpidarGetPose(UINT serialNumber, Vector3 &position, Quaternion &rotation, Vector3 &velocity, Vector3 &angularVelocity)
グリップの姿勢を取得します.
SPIDAR_API BOOL __stdcall SpidarGetGpioValue(UINT serialNumber, UINT &value)
GPIOの値を取得します.
SPIDAR_API BOOL __stdcall SpidarSetCascadeGain(UINT serialNumber, FLOAT gain)
カスケード制御用ゲインを設定します.
SPIDAR_API BOOL __stdcall SpidarTerminate(UINT serialNumber)
SPIDARを終了します.
SPIDAR_API BOOL __stdcall SpidarStop(UINT serialNumber)
システムの動作を停止します.
SPIDAR_API BOOL __stdcall SpidarEnableMotorControl(UINT serialNumber, BOOL enable)
コントローラ単体での動作状態を変更します.
SPIDAR_API BOOL __stdcall SpidarGetGripRadius(UINT serialNumber, FLOAT &gripRadius)
グリップの半径を取得します.
SPIDAR_API BOOL __stdcall SpidarStart(UINT serialNumber)
システムの動作を開始します.
SPIDAR_API BOOL __stdcall SpidarSetHaptics(UINT serialNumber, BOOL enable)
力覚提示の有無を設定します.
SPIDAR_API BOOL __stdcall SpidarInitializeController(UINT serialNumber)
SPIDARコントローラを初期化します.
SPIDAR_API BOOL __stdcall SpidarGetDeltaTime(UINT serialNumber, FLOAT &deltaTime)
制御周期(実測値)を取得します.
SPIDAR_API BOOL __stdcall SpidarCalibrate(UINT serialNumber)
グリップ姿勢のキャリブレーションを実行します.
SPIDAR_API BOOL __stdcall SpidarGetLibraryVersion(UINT &version)
SPIDAR APIのライブラリバージョンを取得します.
SPIDAR_API BOOL __stdcall SpidarGetMaxPulseWidth(UINT serialNumber, UINT &maxPulseWidth)
PWMのパルス幅の最大値を取得します.
SPIDAR_API BOOL __stdcall SpidarClearEncoderCount(UINT serialNumber)
エンコーダ値をクリアします.
SPIDAR_API BOOL __stdcall SpidarWritePulseWidth(UINT serialNumber, const UINT(&pulseWidth)[8])
PWMのパルス幅を書き込みます.
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)
提示力の目標値を設定します.
SPIDAR_API BOOL __stdcall SpidarGetEncoderCount(UINT serialNumber, INT(&count)[8])
エンコーダ値を取得します.
SPIDAR_API BOOL __stdcall SpidarInitialize(LPCSTR fileName, UINT &serialNumber)
SPIDARシステムを初期化します.
SPIDAR_API BOOL __stdcall SpidarStartLog(UINT serialNumber)
ログの記録を開始します.
SPIDAR_API BOOL __stdcall SpidarReadEncoderCount(UINT serialNumber, INT(&count)[8])
エンコーダ値を読み込みます.