Performance improvement
This commit is contained in:
parent
7614064788
commit
ebc1dfba9c
@ -1 +1 @@
|
|||||||
Subproject commit 4b07328790ffd565f9f3303b625dbde68abaecc7
|
Subproject commit 64ca76830c81974eaac9b0d7edad631522a14b12
|
@ -50,14 +50,16 @@ void NetworkPerception::ReceivePoseMsg(unsigned char *data, Roboid *roboid) {
|
|||||||
if (objectId == 0) {
|
if (objectId == 0) {
|
||||||
roboid->SetPosition(worldPosition);
|
roboid->SetPosition(worldPosition);
|
||||||
} else {
|
} else {
|
||||||
|
Vector3 roboidPosition = roboid->GetPosition();
|
||||||
|
|
||||||
Vector3 myPosition = roboid->GetPosition();
|
float distance = Vector3::Distance(roboidPosition, worldPosition);
|
||||||
Quaternion myOrientation = roboid->GetOrientation();
|
if (roboid->perception->IsInteresting(distance) == false)
|
||||||
|
return;
|
||||||
|
|
||||||
Vector3 localPosition =
|
Quaternion roboidOrientation = roboid->GetOrientation();
|
||||||
Quaternion::Inverse(myOrientation) * (worldPosition - myPosition);
|
Vector3 localPosition = Quaternion::Inverse(roboidOrientation) *
|
||||||
|
(worldPosition - roboidPosition);
|
||||||
|
|
||||||
float distance = Vector3::Magnitude(localPosition);
|
|
||||||
float angle =
|
float angle =
|
||||||
Vector3::SignedAngle(Vector3::forward, localPosition, Vector3::up);
|
Vector3::SignedAngle(Vector3::forward, localPosition, Vector3::up);
|
||||||
|
|
||||||
|
@ -293,6 +293,17 @@ InterestingThing *Perception::AddTrackedObject(Sensor *sensor,
|
|||||||
return thing;
|
return thing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Perception::IsInteresting(float distance) {
|
||||||
|
for (unsigned char objIx = 0; objIx < maxObjectCount; objIx++) {
|
||||||
|
InterestingThing *thing = this->trackedObjects[objIx];
|
||||||
|
if (thing == nullptr)
|
||||||
|
continue;
|
||||||
|
if (thing->position.distance > distance)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
InterestingThing *Perception::FindTrackedObject(char objectId) {
|
InterestingThing *Perception::FindTrackedObject(char objectId) {
|
||||||
for (unsigned char objIx = 0; objIx < maxObjectCount; objIx++) {
|
for (unsigned char objIx = 0; objIx < maxObjectCount; objIx++) {
|
||||||
InterestingThing *thing = this->trackedObjects[objIx];
|
InterestingThing *thing = this->trackedObjects[objIx];
|
||||||
|
@ -97,6 +97,8 @@ public:
|
|||||||
unsigned char objectId, Spherical position,
|
unsigned char objectId, Spherical position,
|
||||||
Quaternion orientation = Quaternion::identity);
|
Quaternion orientation = Quaternion::identity);
|
||||||
|
|
||||||
|
bool IsInteresting(float distance);
|
||||||
|
|
||||||
InterestingThing *FindTrackedObject(char objectId);
|
InterestingThing *FindTrackedObject(char objectId);
|
||||||
InterestingThing *FindTrackedObject(unsigned char networkId,
|
InterestingThing *FindTrackedObject(unsigned char networkId,
|
||||||
unsigned char objectId);
|
unsigned char objectId);
|
||||||
|
49
Roboid.cpp
49
Roboid.cpp
@ -17,7 +17,8 @@ Roboid::Roboid() {
|
|||||||
this->propulsion = nullptr;
|
this->propulsion = nullptr;
|
||||||
this->actuationRoot = nullptr;
|
this->actuationRoot = nullptr;
|
||||||
this->worldPosition = Vector3::zero;
|
this->worldPosition = Vector3::zero;
|
||||||
this->worldOrientation = Quaternion::identity;
|
// this->worldOrientation = Quaternion::identity;
|
||||||
|
this->worldAngleAxis = AngleAxis();
|
||||||
}
|
}
|
||||||
|
|
||||||
Roboid::Roboid(Perception *perception, Propulsion *propulsion) : Roboid() {
|
Roboid::Roboid(Perception *perception, Propulsion *propulsion) : Roboid() {
|
||||||
@ -50,10 +51,11 @@ void Roboid::Update(float currentTimeMs) {
|
|||||||
propulsion->Update(currentTimeMs);
|
propulsion->Update(currentTimeMs);
|
||||||
|
|
||||||
float deltaTime = (currentTimeMs - lastUpdateTimeMs) / 1000;
|
float deltaTime = (currentTimeMs - lastUpdateTimeMs) / 1000;
|
||||||
|
Quaternion roboidOrientation = this->GetOrientation();
|
||||||
SetPosition(this->worldPosition +
|
SetPosition(this->worldPosition +
|
||||||
this->worldOrientation * Vector3::forward *
|
roboidOrientation * Vector3::forward *
|
||||||
this->propulsion->GetVelocity().distance * deltaTime);
|
this->propulsion->GetVelocity().distance * deltaTime);
|
||||||
SetOrientation(this->worldOrientation *
|
SetOrientation(roboidOrientation *
|
||||||
Quaternion::AngleAxis(this->propulsion->GetAngularVelocity(),
|
Quaternion::AngleAxis(this->propulsion->GetAngularVelocity(),
|
||||||
Vector3::up));
|
Vector3::up));
|
||||||
}
|
}
|
||||||
@ -71,15 +73,32 @@ Vector2 Roboid::GetPosition2D() {
|
|||||||
return Vector2(this->worldPosition.x, this->worldPosition.z);
|
return Vector2(this->worldPosition.x, this->worldPosition.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion Roboid::GetOrientation() { return this->worldOrientation; }
|
#include <Arduino.h>
|
||||||
|
Quaternion Roboid::GetOrientation() {
|
||||||
|
Vector3 axis = this->worldAngleAxis.axis.ToVector3();
|
||||||
|
Quaternion q = Quaternion::AngleAxis(this->worldAngleAxis.angle, axis);
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "FloatSingle.h"
|
||||||
float Roboid::GetOrientation2D() {
|
float Roboid::GetOrientation2D() {
|
||||||
return Quaternion::GetAngleAround(Vector3::up, this->worldOrientation);
|
float maxAngle = 90 - Float::epsilon; // note: range vertical angle = -90..90
|
||||||
|
|
||||||
|
// rotation axis is vertical, so we have a simple 2D orientation
|
||||||
|
if (this->worldAngleAxis.axis.verticalAngle > maxAngle)
|
||||||
|
return this->worldAngleAxis.angle;
|
||||||
|
if (this->worldAngleAxis.axis.verticalAngle < -maxAngle)
|
||||||
|
return -this->worldAngleAxis.angle;
|
||||||
|
|
||||||
|
Quaternion q = GetOrientation();
|
||||||
|
return Quaternion::GetAngleAround(Vector3::up, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Roboid::SetPosition(Vector3 newWorldPosition) {
|
void Roboid::SetPosition(Vector3 newWorldPosition) {
|
||||||
|
Quaternion roboidOrientation = this->GetOrientation();
|
||||||
Vector3 translation = newWorldPosition - this->worldPosition;
|
Vector3 translation = newWorldPosition - this->worldPosition;
|
||||||
float distance = translation.magnitude();
|
float distance = translation.magnitude();
|
||||||
float angle = Vector3::SignedAngle(this->worldOrientation * Vector3::forward,
|
float angle = Vector3::SignedAngle(roboidOrientation * Vector3::forward,
|
||||||
translation, Vector3::up);
|
translation, Vector3::up);
|
||||||
Polar polarTranslation = Polar(angle, distance);
|
Polar polarTranslation = Polar(angle, distance);
|
||||||
perception->UpdatePose(polarTranslation);
|
perception->UpdatePose(polarTranslation);
|
||||||
@ -87,12 +106,22 @@ void Roboid::SetPosition(Vector3 newWorldPosition) {
|
|||||||
|
|
||||||
if (networkSync != nullptr)
|
if (networkSync != nullptr)
|
||||||
// networkSync->SendPosition(this->worldPosition);
|
// networkSync->SendPosition(this->worldPosition);
|
||||||
networkSync->SendPose(this->worldPosition, this->worldOrientation);
|
networkSync->SendPose(this->worldPosition, roboidOrientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
void Roboid::SetOrientation(Quaternion worldOrientation) {
|
void Roboid::SetOrientation(Quaternion worldOrientation) {
|
||||||
Quaternion delta =
|
float angle;
|
||||||
Quaternion::Inverse(this->worldOrientation) * worldOrientation;
|
Vector3 axis;
|
||||||
|
worldOrientation.ToAngleAxis(&angle, &axis);
|
||||||
|
|
||||||
|
Quaternion delta = Quaternion::Inverse(GetOrientation()) * worldOrientation;
|
||||||
perception->UpdatePose(delta);
|
perception->UpdatePose(delta);
|
||||||
this->worldOrientation = worldOrientation;
|
|
||||||
|
AngleAxis angleAxis = AngleAxis(angle, Axis(axis));
|
||||||
|
this->worldAngleAxis = angleAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Roboid::SetOrientation2D(float angle) {
|
||||||
|
this->worldAngleAxis = AngleAxis(angle, Axis::up);
|
||||||
}
|
}
|
6
Roboid.h
6
Roboid.h
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "LinearAlgebra/AngleAxis.h"
|
||||||
#include "Perception.h"
|
#include "Perception.h"
|
||||||
#include "Propulsion.h"
|
#include "Propulsion.h"
|
||||||
#include "ServoMotor.h"
|
#include "ServoMotor.h"
|
||||||
@ -66,6 +67,7 @@ public:
|
|||||||
/// perceived objects by the roboid (roboid->perception->perceivedObjets),
|
/// perceived objects by the roboid (roboid->perception->perceivedObjets),
|
||||||
/// as these are local to the roboid' orientation.
|
/// as these are local to the roboid' orientation.
|
||||||
virtual void SetOrientation(Quaternion worldOrientation);
|
virtual void SetOrientation(Quaternion worldOrientation);
|
||||||
|
void SetOrientation2D(float angle);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// @brief The position of the roboid in carthesian coordinates in world space
|
/// @brief The position of the roboid in carthesian coordinates in world space
|
||||||
@ -77,7 +79,9 @@ private:
|
|||||||
/// @details The position may be set when NetworkSync is used to receive
|
/// @details The position may be set when NetworkSync is used to receive
|
||||||
/// orientations from an external tracking system. This value should not be
|
/// orientations from an external tracking system. This value should not be
|
||||||
/// set directly, but SetOrientation should be used instead.
|
/// set directly, but SetOrientation should be used instead.
|
||||||
Quaternion worldOrientation = Quaternion::identity;
|
// Quaternion worldOrientation = Quaternion::identity;
|
||||||
|
|
||||||
|
AngleAxis worldAngleAxis = AngleAxis();
|
||||||
|
|
||||||
unsigned long lastUpdateTimeMs = 0;
|
unsigned long lastUpdateTimeMs = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user