측정 샘플
이 예제는 CPP HaplyHardwareAPI를 사용하여 Inverse3를 순수 입력 장치로 사용하는 방법을 보여줍니다. 전체 예제는 파일 끝에 있지만 주요 단계는 다음과 같습니다:
필요한 헤더 포함
#include "HardwareAPI.h"
장치를 찾아 연결을 엽니다.
std::vector ports =
Haply::HardwareAPI::Devices::DeviceDetection::DetectInverse3s(); // List all the available devices
Haply::HardwareAPI::IO::SerialStream serial_stream(ports[0].c_str()); // Open the connection to the first device found
Haply::HardwareAPI::Devices::Inverse3 inverse3(&serial_stream; // Create the device object
Haply::HardwareAPI::Devices::Inverse3::DeviceInfoResponse response_to_wake = inverse3.DeviceWakeup(); // Get the device info
위치 측정 가져오기
Inverse3에서 위치 측정값을 얻는 방법에는 두 가지가 있습니다. 첫 번째는 장치에 내장된 키네마틱을 사용하는 것이고, 두 번째는 컴퓨터에서 해결된 키네마틱을 사용하는 것입니다.
디바이스에 내장된 운동학 사용
장치에 내장된 운동학을 사용하는 것이 위치 측정을 얻는 가장 간단한 방법이며, 자동으로 베이스의 방향을 조정하고 엔드 이펙터의 위치를 반환합니다.
// In a loop
while(True) {
Haply::HardwareAPI::Devices::Inverse3::EndEffectorStateResponse
response = inverse3.GetEndEffectorPosition();
printf("Position: %f %f %f\n", response.position[0],
response.position[1], response.position[2]);
}
컴퓨터에서 해결된 키네마틱 사용
베이스의 방향을 파악하기 위해 IMU를 사용하기 때문에 매우 정밀한 애플리케이션의 경우 위치 측정에 변동이 발생할 수 있습니다. 이를 방지하기 위해 컴퓨터에서 운동학을 해결하고 베이스의 각도를 물리적 설정과 일치하도록 수동으로 설정할 수 있습니다.
// Set the angles of the base, default position is upright
// Inverse3.AdjustAngles([angle0, angle1, angle2]);
// In a loop
while(True) {
Haply::HardwareAPI::Devices::Inverse3::EndEffectorStateResponse
response = inverse3.GetEndEffectorPosition(false);
printf("Position: %f %f %f\n", response.position[0],
response.position[1], response.position[2]);
}
전체 예제
#include <string.h>
#include <chrono>
#include <iostream>
#include <iterator>
#include <string>
#include <thread>
#include "HardwareAPI.h"
int main(int argc, char* argv[])
{
char* portName;
if (argc < 2)
{
std::vector ports =
Haply::HardwareAPI::Devices::DeviceDetection::DetectInverse3s();
std::string portNames[256];
int nbport = ports.size();
#if defined _DEBUG
printf("Found %d ports: \n", nbport);
#endif
if (nbport > 0)
{
int index = nbport - 1;
#if defined(_WIN32) || defined(_WIN64)
portName = _strdup(ports[index].c_str());
#endif
#if defined(__linux__) || defined(__APPLE__)
portName = strdup(ports[index].c_str());
#endif
}
else
{
#if defined _DEBUG
std::cout << "No Inverse3 found" << std::endl;
#endif
return -1;
}
}
else
{
#if defined(_WIN32) || defined(_WIN64)
portName = _strdup(argv[1]); // argv1;
#endif
#if defined(__linux__)
portName = strdup(argv[1]); // argv1;
#endif
}
#if defined _DEBUG
printf("Using port %s\n", portName);
#endif
Haply::HardwareAPI::IO::SerialStream serial_stream(portName);
if (serial_stream.OpenDevice() < 0)
printf("unable to open serial stream for '%s'", portName);
Haply::HardwareAPI::Devices::Inverse3 inverse3(&serial_stream);
Haply::HardwareAPI::Devices::Inverse3::DeviceInfoResponse response_to_wake =
inverse3.DeviceWakeup();
#if defined _DEBUG
std::cout << std::endl << "Press ENTER to continue . . .";
std::cin.get();
#endif
while (true)
{
// This is the fast update loop
// To Use the Inverse3 as a pure measurement device, use the following
// functions Inverse3.GetEndEffectorPosition(); // for standard
// Kinematics For added precision, the kinematics can be resolved on the
// computer with the following functions
// Inverse3.GetEndEffectorPosition(false); for on-computer Kinematics
// When using the on-computer Kinematics, the angles of the base can be
// adjusted with the following function to match the physical setup:
// Inverse3.AdjustAngles([angle0, angle1, angle2]);
Haply::HardwareAPI::Devices::Inverse3::EndEffectorStateResponse
response = inverse3.GetEndEffectorPosition(false);
printf("Position: %f %f %f\n", response.position[0],
response.position[1], response.position[2]);
std::this_thread::sleep_for(std::chrono::microseconds(100));
}
}