Messung Probe
Dieses Beispiel zeigt, wie die CPP HaplyHardwareAPI die Inverse3 als reines Eingabegerät verwendet. Ein vollständiges Beispiel ist am Ende der Datei zu finden, aber die wichtigsten Schritte sind:
Fügen Sie die erforderlichen Kopfzeilen ein
#include "HardwareAPI.h"
Suchen Sie das Gerät und öffnen Sie die Verbindung
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
Abrufen der Positionsmessung
Es gibt zwei Möglichkeiten, die Positionsmessung von Inverse3 zu erhalten. Die erste ist mit der integrierten Kinematik des Geräts, die zweite mit der auf dem Computer aufgelösten Kinematik.
Verwendung der eingebauten Kinematik des Geräts
Die einfachste Art der Positionsmessung ist die Verwendung der in das Gerät integrierten Kinematik, die die Ausrichtung der Basis automatisch anpasst und die Position des Endeffektors zurückgibt.
// 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]);
}
Verwendung der am Computer gelösten Kinematik
Da wir eine IMU verwenden, um die Ausrichtung der Basis zu bestimmen, kann es bei sehr präzisen Anwendungen zu Abweichungen bei der Positionsmessung kommen. Um dies zu vermeiden, kann die Kinematik auf dem Computer aufgelöst und die Winkel der Basis manuell eingestellt werden, um sie an den physischen Aufbau anzupassen.
// 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]);
}
Vollständiges Beispiel
#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));
}
}