Improved angular support
This commit is contained in:
		
							parent
							
								
									89099a2dbb
								
							
						
					
					
						commit
						5b4dfbb0ae
					
				| @ -1 +1 @@ | |||||||
| Subproject commit 09e25a8a218690157ba46ca5f7ccd5f33eab1c07 | Subproject commit 3363388a95d8fe9708b615fc2ecdc9474f4930a1 | ||||||
| @ -49,7 +49,6 @@ void NetworkSync::PublishState(Roboid* roboid) { | |||||||
|   // if (roboid->updated == false)
 |   // if (roboid->updated == false)
 | ||||||
|   //   return;
 |   //   return;
 | ||||||
| 
 | 
 | ||||||
|   if (roboid->GetVelocity().magnitude() > 0) |  | ||||||
|   SendPose(roboid); |   SendPose(roboid); | ||||||
|   PublishPerception(roboid); |   PublishPerception(roboid); | ||||||
| } | } | ||||||
| @ -177,32 +176,40 @@ void NetworkSync::SendDestroyThing(InterestingThing* thing) { | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void NetworkSync::SendPose(Roboid* roboid, bool recurse) { | // void NetworkSync::SendPose(Roboid* roboid, bool recurse) {
 | ||||||
|  | //   if (networkId == 0)  // We're not connected to a site yet
 | ||||||
|  | //     return;
 | ||||||
|  | 
 | ||||||
|  | //   if (roboid->GetVelocity().magnitude() > 0) {
 | ||||||
|  | //     unsigned char ix = 0;
 | ||||||
|  | //     buffer[ix++] = PoseMsg;
 | ||||||
|  | //     buffer[ix++] = 0x00;
 | ||||||
|  | //     buffer[ix++] = Pose_Position | Pose_Orientation;
 | ||||||
|  | //     SendSpherical(buffer, &ix,
 | ||||||
|  | //     Spherical::FromVector3(roboid->GetPosition())); SendQuat32(buffer, &ix,
 | ||||||
|  | //     roboid->GetOrientation()); SendBuffer(ix);
 | ||||||
|  | //   }
 | ||||||
|  | 
 | ||||||
|  | // #if RC_DEBUG
 | ||||||
|  | //   printf("Sent PoseMsg [%d/%d]\n", networkId, buffer[1]);
 | ||||||
|  | // #endif
 | ||||||
|  | 
 | ||||||
|  | //   if (recurse) {
 | ||||||
|  | //     for (unsigned char childIx = 0; childIx < roboid->childCount; childIx++)
 | ||||||
|  | //     {
 | ||||||
|  | //       Thing* child = roboid->GetChild(childIx);
 | ||||||
|  | //       if (child != nullptr)
 | ||||||
|  | //         SendPose(child, true);
 | ||||||
|  | //     }
 | ||||||
|  | //   }
 | ||||||
|  | // }
 | ||||||
|  | 
 | ||||||
|  | void NetworkSync::SendPose(Thing* thing, bool recurse) { | ||||||
|   if (networkId == 0)  // We're not connected to a site yet
 |   if (networkId == 0)  // We're not connected to a site yet
 | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   unsigned char ix = 0; |   if (thing->GetLinearVelocity().distance > 0 || | ||||||
|   buffer[ix++] = PoseMsg; |       thing->GetAngularVelocity().angle > 0) { | ||||||
|   buffer[ix++] = 0x00; |  | ||||||
|   buffer[ix++] = Pose_Position | Pose_Orientation; |  | ||||||
|   SendSpherical(buffer, &ix, Spherical::FromVector3(roboid->GetPosition())); |  | ||||||
|   SendQuat32(buffer, &ix, roboid->GetOrientation()); |  | ||||||
|   SendBuffer(ix); |  | ||||||
| 
 |  | ||||||
| #if RC_DEBUG |  | ||||||
|   printf("Sent PoseMsg [%d/%d]\n", networkId, buffer[1]); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|   if (recurse) { |  | ||||||
|     for (unsigned char childIx = 0; childIx < roboid->childCount; childIx++) { |  | ||||||
|       Thing* child = roboid->GetChild(childIx); |  | ||||||
|       if (child != nullptr) |  | ||||||
|         SendPose(child, true); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void NetworkSync::SendPose(Thing* thing, bool recurse) { |  | ||||||
|     unsigned char ix = 0; |     unsigned char ix = 0; | ||||||
|     buffer[ix++] = PoseMsg; |     buffer[ix++] = PoseMsg; | ||||||
|     buffer[ix++] = thing->id; |     buffer[ix++] = thing->id; | ||||||
| @ -210,6 +217,7 @@ void NetworkSync::SendPose(Thing* thing, bool recurse) { | |||||||
|     SendSpherical16(buffer, &ix, thing->position); |     SendSpherical16(buffer, &ix, thing->position); | ||||||
|     SendQuat32(buffer, &ix, thing->orientation); |     SendQuat32(buffer, &ix, thing->orientation); | ||||||
|     SendBuffer(ix); |     SendBuffer(ix); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
| #if RC_DEBUG | #if RC_DEBUG | ||||||
|   printf("Sent PoseMsg Thing [%d/%d]\n", networkId, buffer[1]); |   printf("Sent PoseMsg Thing [%d/%d]\n", networkId, buffer[1]); | ||||||
|  | |||||||
| @ -77,7 +77,7 @@ class NetworkSync { | |||||||
| 
 | 
 | ||||||
|   virtual void SendPosition(Vector3 worldPosition) {}; |   virtual void SendPosition(Vector3 worldPosition) {}; | ||||||
|   virtual void SendPose(Vector3 worldPosition, Quaternion worldOrientation) {}; |   virtual void SendPose(Vector3 worldPosition, Quaternion worldOrientation) {}; | ||||||
|   void SendPose(Roboid* roboid, bool recurse = true); |   // void SendPose(Roboid* roboid, bool recurse = true);
 | ||||||
|   void SendPose(Thing* thing, bool recurse = true); |   void SendPose(Thing* thing, bool recurse = true); | ||||||
| 
 | 
 | ||||||
|   virtual void SendText(const char* s); |   virtual void SendText(const char* s); | ||||||
| @ -90,9 +90,9 @@ class NetworkSync { | |||||||
|   void PublishState(Sensor* sensor); |   void PublishState(Sensor* sensor); | ||||||
| 
 | 
 | ||||||
|   void PublishTrackedObject(Roboid* roboid, InterestingThing* object); |   void PublishTrackedObject(Roboid* roboid, InterestingThing* object); | ||||||
|   void PublishRelativeObject(Buffer sendBuffer, |   // void PublishRelativeObject(Buffer sendBuffer,
 | ||||||
|                              UInt8 parentId, |   //                            UInt8 parentId,
 | ||||||
|                              InterestingThing* object); |   //                            InterestingThing* object);
 | ||||||
| 
 | 
 | ||||||
|   void SendSingle100(unsigned char* data, unsigned int startIndex, float value); |   void SendSingle100(unsigned char* data, unsigned int startIndex, float value); | ||||||
|   void SendFloat16(unsigned char* data, unsigned char* startIndex, float value); |   void SendFloat16(unsigned char* data, unsigned char* startIndex, float value); | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								Roboid.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								Roboid.cpp
									
									
									
									
									
								
							| @ -23,7 +23,7 @@ Roboid::Roboid() : Thing(0) { | |||||||
|   // this->actuation = nullptr;
 |   // this->actuation = nullptr;
 | ||||||
|   this->worldPosition = Vector3::zero; |   this->worldPosition = Vector3::zero; | ||||||
|   // this->worldOrientation = Quaternion::identity;
 |   // this->worldOrientation = Quaternion::identity;
 | ||||||
|   this->worldAngleAxis = AngleAxis<float>(); |   this->worldAngleAxis = AngleAxisOf<float>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Roboid::Roboid(Propulsion* propulsion) : Roboid() { | Roboid::Roboid(Propulsion* propulsion) : Roboid() { | ||||||
| @ -74,8 +74,7 @@ Vector2 Roboid::GetPosition2D() { | |||||||
| 
 | 
 | ||||||
| Quaternion Roboid::GetOrientation() { | Quaternion Roboid::GetOrientation() { | ||||||
|   Vector3 axis = this->worldAngleAxis.axis.ToVector3(); |   Vector3 axis = this->worldAngleAxis.axis.ToVector3(); | ||||||
|   Quaternion q = |   Quaternion q = Quaternion::AngleAxis(this->worldAngleAxis.angle, axis); | ||||||
|       Quaternion::AngleAxis(this->worldAngleAxis.angle.ToFloat(), axis); |  | ||||||
|   return q; |   return q; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -83,10 +82,10 @@ float Roboid::GetOrientation2D() { | |||||||
|   float maxAngle = 90 - Float::epsilon;  // note: range vertical angle = -90..90
 |   float maxAngle = 90 - Float::epsilon;  // note: range vertical angle = -90..90
 | ||||||
| 
 | 
 | ||||||
|   // rotation axis is vertical, so we have a simple 2D orientation
 |   // rotation axis is vertical, so we have a simple 2D orientation
 | ||||||
|   if (this->worldAngleAxis.axis.verticalAngle.ToFloat() > maxAngle) |   if (this->worldAngleAxis.axis.vertical.InDegrees() > maxAngle) | ||||||
|     return this->worldAngleAxis.angle.ToFloat(); |     return this->worldAngleAxis.angle; | ||||||
|   if (this->worldAngleAxis.axis.verticalAngle.ToFloat() < -maxAngle) |   if (this->worldAngleAxis.axis.vertical.InDegrees() < -maxAngle) | ||||||
|     return -this->worldAngleAxis.angle.ToFloat(); |     return -this->worldAngleAxis.angle; | ||||||
| 
 | 
 | ||||||
|   Quaternion q = GetOrientation(); |   Quaternion q = GetOrientation(); | ||||||
|   return Quaternion::GetAngleAround(Vector3::up, q); |   return Quaternion::GetAngleAround(Vector3::up, q); | ||||||
| @ -118,12 +117,13 @@ void Roboid::SetOrientation(Quaternion worldOrientation) { | |||||||
|   if (perception != nullptr) |   if (perception != nullptr) | ||||||
|     perception->UpdatePose(delta); |     perception->UpdatePose(delta); | ||||||
| 
 | 
 | ||||||
|   AngleAxis<float> angleAxis = AngleAxis<float>(angle, Direction<float>(axis)); |   AngleAxisOf<float> angleAxis = | ||||||
|  |       AngleAxisOf<float>(angle, DirectionOf<float>(axis)); | ||||||
|   this->worldAngleAxis = angleAxis; |   this->worldAngleAxis = angleAxis; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Roboid::SetOrientation2D(float angle) { | void Roboid::SetOrientation2D(float angle) { | ||||||
|   this->worldAngleAxis = AngleAxis<float>(angle, Direction<float>::up); |   this->worldAngleAxis = AngleAxisOf<float>(angle, DirectionOf<float>::up); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Vector3 Passer::RoboidControl::Roboid::GetVelocity() { | Vector3 Passer::RoboidControl::Roboid::GetVelocity() { | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								Roboid.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Roboid.h
									
									
									
									
									
								
							| @ -84,7 +84,7 @@ class Roboid : public Thing { | |||||||
|   /// 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<float> worldAngleAxis = AngleAxis<float>(); |   AngleAxis worldAngleAxis = AngleAxis(); | ||||||
| 
 | 
 | ||||||
|   unsigned long lastUpdateTimeMs = 0; |   unsigned long lastUpdateTimeMs = 0; | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ ServoMotor::ServoMotor() | |||||||
| void ServoMotor::SetTargetAngle(Angle16 angle) { | void ServoMotor::SetTargetAngle(Angle16 angle) { | ||||||
|   angle = Float::Clamp(angle.ToFloat(), minAngle.ToFloat(), maxAngle.ToFloat()); |   angle = Float::Clamp(angle.ToFloat(), minAngle.ToFloat(), maxAngle.ToFloat()); | ||||||
| 
 | 
 | ||||||
|   if (maxVelocity == 0.0F) { |   if (maxSpeed == 0.0F) { | ||||||
|     SetAngle(angle); |     SetAngle(angle); | ||||||
|     this->limitedTargetAngle = angle; |     this->limitedTargetAngle = angle; | ||||||
|   } |   } | ||||||
| @ -28,12 +28,11 @@ Angle16 ServoMotor::GetTargetAngle() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ServoMotor::SetMaximumVelocity(float maxVelocity) { | void ServoMotor::SetMaximumVelocity(float maxVelocity) { | ||||||
|   this->maxVelocity = maxVelocity; |   this->maxSpeed = maxVelocity; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ServoMotor::SetTargetVelocity(float targetVelocity) { | void ServoMotor::SetTargetVelocity(float targetVelocity) { | ||||||
|   targetVelocity = |   targetVelocity = Float::Clamp(targetVelocity, -this->maxSpeed, maxSpeed); | ||||||
|       Float::Clamp(targetVelocity, -this->maxVelocity, maxVelocity); |  | ||||||
| 
 | 
 | ||||||
|   this->controlMode = ControlMode::Velocity; |   this->controlMode = ControlMode::Velocity; | ||||||
|   this->targetVelocity = targetVelocity; |   this->targetVelocity = targetVelocity; | ||||||
| @ -62,12 +61,12 @@ void ServoMotor::Update(unsigned long currentTimeMs) { | |||||||
| 
 | 
 | ||||||
|   // Position control
 |   // Position control
 | ||||||
|   if (controlMode == ControlMode::Position) { |   if (controlMode == ControlMode::Position) { | ||||||
|     if (maxVelocity == 0.0F || hasTargetAngle == false) { |     if (maxSpeed == 0.0F || hasTargetAngle == false) { | ||||||
|       this->lastUpdateTimeMs = currentTimeMs; |       this->lastUpdateTimeMs = currentTimeMs; | ||||||
|       return; |       return; | ||||||
| 
 | 
 | ||||||
|     } else { |     } else { | ||||||
|       float angleStep = maxVelocity * deltaTime; |       float angleStep = maxSpeed * deltaTime; | ||||||
|       float deltaAngle = |       float deltaAngle = | ||||||
|           this->targetAngle.ToFloat() - this->limitedTargetAngle.ToFloat(); |           this->targetAngle.ToFloat() - this->limitedTargetAngle.ToFloat(); | ||||||
|       float absDeltaAngle = (deltaAngle < 0) ? -deltaAngle : deltaAngle; |       float absDeltaAngle = (deltaAngle < 0) ? -deltaAngle : deltaAngle; | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ class ServoMotor : public Thing { | |||||||
|   Angle16 targetAngle = 0.0F; |   Angle16 targetAngle = 0.0F; | ||||||
|   Angle16 actualAngle = 0.0F; |   Angle16 actualAngle = 0.0F; | ||||||
| 
 | 
 | ||||||
|   float maxVelocity = 0.0F; |   float maxSpeed = 0.0F; | ||||||
| 
 | 
 | ||||||
|   float targetVelocity = 0.0F; |   float targetVelocity = 0.0F; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -76,3 +76,11 @@ Thing* Thing::GetChild(unsigned char childIx) { | |||||||
|   } else |   } else | ||||||
|     return nullptr; |     return nullptr; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | Spherical16 Thing::GetLinearVelocity() { | ||||||
|  |   return this->linearVelocity; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | AngleAxis16 Thing::GetAngularVelocity() { | ||||||
|  |   return this->angularVelocity; | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								Thing.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Thing.h
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "LinearAlgebra/AngleAxis.h" | ||||||
| #include "LinearAlgebra/Quaternion.h" | #include "LinearAlgebra/Quaternion.h" | ||||||
| #include "LinearAlgebra/Spherical.h" | #include "LinearAlgebra/Spherical.h" | ||||||
| 
 | 
 | ||||||
| @ -17,8 +18,8 @@ class Thing { | |||||||
|   /// @brief The type of Thing
 |   /// @brief The type of Thing
 | ||||||
|   unsigned int type; |   unsigned int type; | ||||||
| 
 | 
 | ||||||
|   // I hate this, better is to have an additional field stating the thing classificaton
 |   // I hate this, better is to have an additional field stating the thing
 | ||||||
|   // Motor, Sensor etc.
 |   // classificaton Motor, Sensor etc.
 | ||||||
|   /// @brief The type of a switch sensor
 |   /// @brief The type of a switch sensor
 | ||||||
|   static const unsigned int SwitchType; |   static const unsigned int SwitchType; | ||||||
|   /// @brief The type of a distance sensor
 |   /// @brief The type of a distance sensor
 | ||||||
| @ -51,6 +52,9 @@ class Thing { | |||||||
|   Quaternion orientation; |   Quaternion orientation; | ||||||
|   Quaternion worldOrientation; |   Quaternion worldOrientation; | ||||||
| 
 | 
 | ||||||
|  |   virtual Spherical16 GetLinearVelocity(); | ||||||
|  |   virtual AngleAxis16 GetAngularVelocity(); | ||||||
|  | 
 | ||||||
|   /// @brief Sets the parent Thing
 |   /// @brief Sets the parent Thing
 | ||||||
|   /// @param parent The Thing which should become the parnet
 |   /// @param parent The Thing which should become the parnet
 | ||||||
|   /// @remark This is equivalent to calling parent->AddChild(this);
 |   /// @remark This is equivalent to calling parent->AddChild(this);
 | ||||||
| @ -109,6 +113,9 @@ class Thing { | |||||||
| 
 | 
 | ||||||
|   Thing* parent = nullptr; |   Thing* parent = nullptr; | ||||||
|   Thing** children = nullptr; |   Thing** children = nullptr; | ||||||
|  | 
 | ||||||
|  |   AngleAxis16 angularVelocity = AngleAxis16::zero; | ||||||
|  |   Spherical16 linearVelocity = Spherical16::zero; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| }  // namespace RoboidControl
 | }  // namespace RoboidControl
 | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ InterestingThing::InterestingThing(Sensor* sensor, | |||||||
|   float angle; |   float angle; | ||||||
|   Vector3 axis; |   Vector3 axis; | ||||||
|   orientation.ToAngleAxis(&angle, &axis); |   orientation.ToAngleAxis(&angle, &axis); | ||||||
|   this->orientation = AngleAxis<float>(angle, axis); |   this->orientation = AngleAxisOf<float>(angle, axis); | ||||||
|   this->updated = true; |   this->updated = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -85,7 +85,7 @@ void InterestingThing::Refresh(Spherical16 position, Quaternion orientation) { | |||||||
|   float angle; |   float angle; | ||||||
|   Vector3 axis; |   Vector3 axis; | ||||||
|   orientation.ToAngleAxis(&angle, &axis); |   orientation.ToAngleAxis(&angle, &axis); | ||||||
|   this->orientation = AngleAxis<float>(angle, axis); |   this->orientation = AngleAxisOf<float>(angle, axis); | ||||||
|   this->confidence = maxConfidence; |   this->confidence = maxConfidence; | ||||||
|   this->updated = true; |   this->updated = true; | ||||||
| } | } | ||||||
|  | |||||||
| @ -69,7 +69,7 @@ class InterestingThing { | |||||||
|   /// @brief The current position of the object
 |   /// @brief The current position of the object
 | ||||||
|   Spherical16 position = Spherical16::zero; |   Spherical16 position = Spherical16::zero; | ||||||
|   /// @brief The current orientation of the object
 |   /// @brief The current orientation of the object
 | ||||||
|   AngleAxis<float> orientation = AngleAxis<float>(); |   AngleAxisOf<float> orientation = AngleAxisOf<float>(); | ||||||
|   // Quaternion orientation = Quaternion::identity;
 |   // Quaternion orientation = Quaternion::identity;
 | ||||||
|   /// @brief The sensor which provided that lastet pose this object
 |   /// @brief The sensor which provided that lastet pose this object
 | ||||||
|   Sensor* sensor = nullptr; |   Sensor* sensor = nullptr; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user