80 lines
2.2 KiB
C++
80 lines
2.2 KiB
C++
#include "Roboid.h"
|
|
|
|
#include "NetworkSync.h"
|
|
|
|
// #define RC_DEBUG
|
|
|
|
#ifdef RC_DEBUG
|
|
#include <Arduino.h>
|
|
#endif
|
|
|
|
Roboid::Roboid() {
|
|
#ifdef RC_DEBUG
|
|
Serial.begin(115200);
|
|
#endif
|
|
this->perception = new Perception();
|
|
this->perception->roboid = this;
|
|
this->propulsion = nullptr;
|
|
this->actuationRoot = nullptr;
|
|
}
|
|
|
|
Roboid::Roboid(Perception *perception, Propulsion *propulsion) : Roboid() {
|
|
if (this->perception != nullptr)
|
|
delete this->perception;
|
|
this->perception = perception;
|
|
if (perception != nullptr)
|
|
perception->roboid = this;
|
|
|
|
this->propulsion = propulsion;
|
|
if (propulsion != nullptr)
|
|
propulsion->roboid = this;
|
|
}
|
|
|
|
Roboid::Roboid(Perception *perception, ServoMotor *actuationRoot) : Roboid() {
|
|
this->perception = perception;
|
|
perception->roboid = this;
|
|
this->propulsion = nullptr;
|
|
|
|
this->actuationRoot = actuationRoot;
|
|
}
|
|
|
|
Roboid::Roboid(ServoMotor *actuationRoot) : actuationRoot(actuationRoot) {}
|
|
|
|
void Roboid::Update(float currentTimeMs) {
|
|
if (perception != nullptr)
|
|
perception->Update(currentTimeMs);
|
|
|
|
if (propulsion != nullptr)
|
|
propulsion->Update(currentTimeMs);
|
|
|
|
if (networkSync != nullptr)
|
|
networkSync->NetworkUpdate(this);
|
|
|
|
if (actuationRoot != nullptr)
|
|
actuationRoot->Update(currentTimeMs);
|
|
}
|
|
|
|
Vector3 Roboid::GetPosition() { return this->worldPosition; }
|
|
|
|
Quaternion Roboid::GetOrientation() { return this->worldOrientation; }
|
|
|
|
void Roboid::SetPosition(Vector3 newWorldPosition) {
|
|
Vector3 translation = newWorldPosition - this->worldPosition;
|
|
float distance = translation.magnitude();
|
|
float angle = Vector3::SignedAngle(this->worldOrientation * Vector3::forward,
|
|
translation, Vector3::up);
|
|
Polar polarTranslation = Polar(angle, distance);
|
|
perception->UpdatePose(polarTranslation);
|
|
this->worldPosition = newWorldPosition;
|
|
|
|
if (networkSync != nullptr)
|
|
// networkSync->SendPosition(this->worldPosition);
|
|
networkSync->SendPose(this->worldPosition, this->worldOrientation);
|
|
}
|
|
|
|
void Roboid::SetOrientation(Quaternion worldOrientation) {
|
|
Quaternion delta =
|
|
Quaternion::Inverse(this->worldOrientation) * worldOrientation;
|
|
perception->UpdatePose(delta);
|
|
this->worldOrientation = worldOrientation;
|
|
} |