Initial commit
This commit is contained in:
		
						commit
						189ea6c689
					
				
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					[submodule "VectorAlgebra"]
 | 
				
			||||||
 | 
						path = VectorAlgebra
 | 
				
			||||||
 | 
						url = http://gitlab.passervr.com/passer/cpp/vectoralgebra.git
 | 
				
			||||||
							
								
								
									
										45
									
								
								Activation.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Activation.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					#include <Activation.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::HeavisideStep(float inputValue, float bias) {
 | 
				
			||||||
 | 
					  return (inputValue + bias > 0) ? 1 : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::Linear(float inputValue, float bias, float range) {
 | 
				
			||||||
 | 
					  if (inputValue > bias + range)
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  if (inputValue < bias)
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float f = inputValue * (1 / range);  // normalize to 1..0
 | 
				
			||||||
 | 
					  float influence = 1 - f;             // invert
 | 
				
			||||||
 | 
					  return influence;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::Tanh(float inputValue) {
 | 
				
			||||||
 | 
					  return (exp(inputValue) - exp(-inputValue)) / (exp(inputValue) + exp(-inputValue));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::Sigmoid(float inputValue) {
 | 
				
			||||||
 | 
					  return 1 / (1 + expf(-inputValue));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::Quadratic(float minValue, float range, float inputValue) {
 | 
				
			||||||
 | 
					  if (inputValue > minValue + range)
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  if (inputValue < minValue)
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float f = inputValue * (1 / range);  // normalize to 1..0
 | 
				
			||||||
 | 
					  float influence = 1 - (f * f);       // quadratic & invert
 | 
				
			||||||
 | 
					  return influence;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Activation::ParticleLife(float minValue, float maxValue, float attraction, float inputValue) {
 | 
				
			||||||
 | 
					  if (inputValue < minValue)
 | 
				
			||||||
 | 
					    return inputValue / minValue - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (inputValue < maxValue)
 | 
				
			||||||
 | 
					    return attraction * (1 - fabs(2 * inputValue - minValue - maxValue) / (maxValue - minValue));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								Activation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Activation.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					#ifndef RC_ACTIVATION_H
 | 
				
			||||||
 | 
					#define RC_ACTIVATION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Activation {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  static float HeavisideStep(float inputValue, float bias = 0);  // Range: {0,1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static float Tanh(float inputValue);  // Range: (-1, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static float Sigmoid(float inputValue);  // Range: (0, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static float Linear(float inputValue, float bias = 0, float range = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static float Quadratic(float minValue, float range, float inputValue);  // minValue = bias
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static float ParticleLife(float minValue, float maxValue, float attraction, float inputValue);  // minValue = bias
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										20
									
								
								ControlledMotor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								ControlledMotor.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					#include <ControlledMotor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ControlledMotor::ControlledMotor() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ControlledMotor::ControlledMotor(Motor* motor, Encoder* encoder) {
 | 
				
			||||||
 | 
					  this->motor = motor;
 | 
				
			||||||
 | 
					  this->encoder = encoder;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ControlledMotor::SetTargetVelocity(float velocity) {
 | 
				
			||||||
 | 
					  this->targetVelocity = velocity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ControlledMotor::Update(float timeStep) {
 | 
				
			||||||
 | 
					  float velocity = GetActualVelocity();
 | 
				
			||||||
 | 
					  float error = targetVelocity - velocity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float acceleration = error * timeStep * pidP;    // Just P is used at this moment
 | 
				
			||||||
 | 
					  motor->SetSpeed(targetVelocity + acceleration);  // or something like that
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								ControlledMotor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								ControlledMotor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Encoder.h>
 | 
				
			||||||
 | 
					#include <Motor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ControlledMotor : public Thing {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  ControlledMotor();
 | 
				
			||||||
 | 
					  ControlledMotor(Motor* motor, Encoder* encoder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float velocity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float pidP = 1;
 | 
				
			||||||
 | 
					  float pidD = 0;
 | 
				
			||||||
 | 
					  float pidI = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Update(float timeStep);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetTargetVelocity(float rotationsPerSecond);
 | 
				
			||||||
 | 
					  float GetActualVelocity() {
 | 
				
			||||||
 | 
					    return rotationDirection * encoder->GetRotationsPerSecond();
 | 
				
			||||||
 | 
					  }  // in rotations per second
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  float targetVelocity;
 | 
				
			||||||
 | 
					  Motor* motor;
 | 
				
			||||||
 | 
					  Encoder* encoder;
 | 
				
			||||||
 | 
					  enum Direction { Forward = 1,
 | 
				
			||||||
 | 
					                   Reverse = -1 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Direction rotationDirection;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										24
									
								
								DistanceSensor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								DistanceSensor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Sensor.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @brief A sensor which can measure the distance the the nearest object
 | 
				
			||||||
 | 
					class DistanceSensor : public Sensor {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  /// @brief Determine the distance to the nearest object
 | 
				
			||||||
 | 
					  /// @return the measured distance in meters to the nearest object
 | 
				
			||||||
 | 
					  virtual float GetDistance() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// @brief The distance at which ObjectNearby triggers
 | 
				
			||||||
 | 
					  float triggerDistance = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool IsOn() {
 | 
				
			||||||
 | 
					    bool isOn = GetDistance() <= triggerDistance;
 | 
				
			||||||
 | 
					    return isOn;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool isOff() {
 | 
				
			||||||
 | 
					    bool isOff = GetDistance() > triggerDistance;
 | 
				
			||||||
 | 
					    return isOff;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										44
									
								
								Encoder.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								Encoder.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					#include <Encoder.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volatile unsigned char Encoder::transitionCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Encoder::Encoder() {
 | 
				
			||||||
 | 
					  rps = 0;
 | 
				
			||||||
 | 
					  transitionsPerRotation = 1;  // to prevent devide by zero
 | 
				
			||||||
 | 
					  distance = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Encoder::Encoder(unsigned char pin, unsigned char transitionsPerRotation)
 | 
				
			||||||
 | 
					    : Encoder::Encoder() {
 | 
				
			||||||
 | 
					  /// Hmm. Arduino dependent code
 | 
				
			||||||
 | 
					  // pinMode(pin, INPUT_PULLUP);
 | 
				
			||||||
 | 
					  // attachInterrupt(digitalPinToInterrupt(pin), InterruptHandler, CHANGE);
 | 
				
			||||||
 | 
					  this->transitionsPerRotation = transitionsPerRotation;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Encoder::InterruptHandler() {
 | 
				
			||||||
 | 
					  transitionCount++;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Encoder::GetRotationsPerSecond() {
 | 
				
			||||||
 | 
					  return rps;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Encoder::ResetDistance() {
 | 
				
			||||||
 | 
					  distance = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Encoder::GetRotationDistance() {
 | 
				
			||||||
 | 
					  return distance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Encoder::Update(float timeStep) {
 | 
				
			||||||
 | 
					  // Hmmm. Arduino-dependent code...
 | 
				
			||||||
 | 
					  // noInterrupts();
 | 
				
			||||||
 | 
					  float distanceThisUpdate = transitionCount / transitionsPerRotation;
 | 
				
			||||||
 | 
					  transitionCount = 0;
 | 
				
			||||||
 | 
					  // interrupts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // float rps = distanceThisUpdate * timeStep;
 | 
				
			||||||
 | 
					  distance += distanceThisUpdate;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										23
									
								
								Encoder.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Encoder.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Encoder {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Encoder();
 | 
				
			||||||
 | 
					  Encoder(unsigned char pin, unsigned char transitionsPerRotation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float GetRotationsPerSecond();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void ResetDistance();
 | 
				
			||||||
 | 
					  float GetRotationDistance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Update(float timeStep);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  static void InterruptHandler();
 | 
				
			||||||
 | 
					  static volatile unsigned char transitionCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned char transitionsPerRotation;
 | 
				
			||||||
 | 
					  float rps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float distance;  // this is direction agnostic
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										25
									
								
								Motor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Motor.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					#include <Motor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Motor::Motor() {
 | 
				
			||||||
 | 
					  this->isSensor = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Motor::Motor(uint8_t pinIn1, uint8_t pinIn2) {
 | 
				
			||||||
 | 
					//   this->pinIn1 = pinIn1;
 | 
				
			||||||
 | 
					//   this->pinIn2 = pinIn2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   pinMode(pinIn1, OUTPUT);  // configure the in1 pin to output mode
 | 
				
			||||||
 | 
					//   pinMode(pinIn2, OUTPUT);  // configure the in2 pin to output mode
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// void Motor::SetDirection(Direction direction) {
 | 
				
			||||||
 | 
					//   digitalWrite(pinIn1, direction);
 | 
				
			||||||
 | 
					//   digitalWrite(pinIn2, !direction);  // This is the opposite of pinIn1
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// void Motor::SetSpeed(float speed) {  // 0..1
 | 
				
			||||||
 | 
					//   currentSpeed = speed;
 | 
				
			||||||
 | 
					//   uint8_t motorSignal = (uint8_t)(speed * 255);
 | 
				
			||||||
 | 
					//   analogWrite(pinIn1, speed);
 | 
				
			||||||
 | 
					//   analogWrite(pinIn2, 255 - speed);
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
							
								
								
									
										20
									
								
								Motor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Motor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Thing.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Motor : public Thing {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Motor();
 | 
				
			||||||
 | 
					  /// @brief Turning direction of the motor
 | 
				
			||||||
 | 
					  enum Direction { Forward = 1,
 | 
				
			||||||
 | 
					                   Reverse = -1 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// @brief Set the turning direction of the motor
 | 
				
			||||||
 | 
					  // void SetDirection(Direction direction);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void SetSpeed(float speed) = 0;
 | 
				
			||||||
 | 
					  float GetSpeed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  float currentSpeed = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										39
									
								
								Placement.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Placement.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					#include <Placement.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement() {
 | 
				
			||||||
 | 
					  this->position = Vector3::zero;
 | 
				
			||||||
 | 
					  this->thing = nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					// Placement::Placement(Vector3 position, Thing* thing) {
 | 
				
			||||||
 | 
					//   this->position = position;
 | 
				
			||||||
 | 
					//   this->thing = thing;
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement(Vector2 direction, Sensor* thing) {
 | 
				
			||||||
 | 
					  this->position = Vector3::zero;
 | 
				
			||||||
 | 
					  this->direction = direction;
 | 
				
			||||||
 | 
					  this->thing = thing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement(Vector3 position, Sensor* thing) {
 | 
				
			||||||
 | 
					  this->position = position;
 | 
				
			||||||
 | 
					  this->direction = Vector2::zero;
 | 
				
			||||||
 | 
					  this->thing = thing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement(Vector3 position, Motor* thing) {
 | 
				
			||||||
 | 
					  this->position = position;
 | 
				
			||||||
 | 
					  this->direction = Vector2::zero;
 | 
				
			||||||
 | 
					  this->thing = thing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement(Vector3 position, ControlledMotor* thing) {
 | 
				
			||||||
 | 
					  this->position = position;
 | 
				
			||||||
 | 
					  this->direction = Vector2::zero;
 | 
				
			||||||
 | 
					  this->thing = thing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Placement::Placement(Thing* thing, Vector3 position) {
 | 
				
			||||||
 | 
					  this->thing = thing;
 | 
				
			||||||
 | 
					  this->position = position;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								Placement.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Placement.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ControlledMotor.h>
 | 
				
			||||||
 | 
					#include <Motor.h>
 | 
				
			||||||
 | 
					#include <Thing.h>
 | 
				
			||||||
 | 
					#include <Vector2.h>
 | 
				
			||||||
 | 
					#include <Vector3.h>
 | 
				
			||||||
 | 
					#include "Sensor.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Placement {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Placement();
 | 
				
			||||||
 | 
					  Placement(Vector2 direction, Sensor* sensor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Placement(Vector3 position, Sensor* sensor);
 | 
				
			||||||
 | 
					  Placement(Vector3 position, Motor* motor);
 | 
				
			||||||
 | 
					  Placement(Vector3 position, ControlledMotor* motor);
 | 
				
			||||||
 | 
					  Placement(Thing* thing, Vector3 position);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Placement* parent = nullptr;
 | 
				
			||||||
 | 
					  Placement** children = nullptr;
 | 
				
			||||||
 | 
					  unsigned int childCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Vector3 position;
 | 
				
			||||||
 | 
					  Vector2 direction;
 | 
				
			||||||
 | 
					  Thing* thing;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										74
									
								
								Propulsion.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								Propulsion.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					#include <ControlledMotor.h>
 | 
				
			||||||
 | 
					#include <Propulsion.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FloatSingle.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propulsion::Propulsion() {
 | 
				
			||||||
 | 
					  this->motors = nullptr;
 | 
				
			||||||
 | 
					  this->motorCount = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::AddMotors(MotorPlacement* motors, unsigned int motorCount) {
 | 
				
			||||||
 | 
					  this->motors = motors;
 | 
				
			||||||
 | 
					  this->motorCount = motorCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::AddMotors(Placement* motors, unsigned int motorCount) {
 | 
				
			||||||
 | 
					  this->placement = motors;
 | 
				
			||||||
 | 
					  this->motorCount = motorCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::Update() {
 | 
				
			||||||
 | 
					  // Hmmm. Arduino dependent code
 | 
				
			||||||
 | 
					  // unsigned long curMillis = millis();
 | 
				
			||||||
 | 
					  // float timeStep = (float)(curMillis - lastMillis) / 1000;
 | 
				
			||||||
 | 
					  // lastMillis = curMillis;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (unsigned int motorIx = 0; motorIx < this->motorCount; motorIx++) {
 | 
				
			||||||
 | 
					    MotorPlacement placement = motors[motorIx];
 | 
				
			||||||
 | 
					    // placement.controlledMotor->Update(timeStep);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::SetDiffDriveSpeed(float leftSpeed, float rightSpeed) {
 | 
				
			||||||
 | 
					  for (unsigned int motorIx = 0; motorIx < this->motorCount; motorIx++) {
 | 
				
			||||||
 | 
					    Motor* motor = motors[motorIx].motor;
 | 
				
			||||||
 | 
					    if (motor == nullptr)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float xPosition = motors[motorIx].position.x;
 | 
				
			||||||
 | 
					    if (xPosition < 0)
 | 
				
			||||||
 | 
					      motor->SetSpeed(leftSpeed);
 | 
				
			||||||
 | 
					    else if (xPosition > 0)
 | 
				
			||||||
 | 
					      motor->SetSpeed(rightSpeed);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::SetDiffDriveVelocities(float leftVelocity, float rightVelocity) {
 | 
				
			||||||
 | 
					  for (unsigned int motorIx = 0; motorIx < this->motorCount; motorIx++) {
 | 
				
			||||||
 | 
					    MotorPlacement placement = motors[motorIx];
 | 
				
			||||||
 | 
					    if (placement.position.x < 0)
 | 
				
			||||||
 | 
					      placement.controlledMotor->SetTargetVelocity(leftVelocity);
 | 
				
			||||||
 | 
					    else if (placement.position.x > 0)
 | 
				
			||||||
 | 
					      placement.controlledMotor->SetTargetVelocity(rightVelocity);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::SetTwistSpeed(float forward, float yaw) {
 | 
				
			||||||
 | 
					  // This is configuration dependent, a drone will do something completely different...
 | 
				
			||||||
 | 
					  float leftSpeed = Float::Clamp(forward - yaw, -1, 1);
 | 
				
			||||||
 | 
					  float rightSpeed = Float::Clamp(forward + yaw, -1, 1);
 | 
				
			||||||
 | 
					  SetDiffDriveSpeed(leftSpeed, rightSpeed);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::SetTwistSpeed(float forward, float yaw, float pitch) {
 | 
				
			||||||
 | 
					  float leftSpeed = Float::Clamp(forward - yaw, -1, 1);
 | 
				
			||||||
 | 
					  float rightSpeed = Float::Clamp(forward + yaw, -1, 1);
 | 
				
			||||||
 | 
					  SetDiffDriveSpeed(leftSpeed, rightSpeed);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Propulsion::SetTwistVelocity(float forwardVelocity, float turningVelocity) {
 | 
				
			||||||
 | 
					  float leftVelocity = Float::Clamp(forwardVelocity - turningVelocity, -1, 1);
 | 
				
			||||||
 | 
					  float rightVelocity = Float::Clamp(forwardVelocity + turningVelocity, -1, 1);
 | 
				
			||||||
 | 
					  SetDiffDriveVelocities(leftVelocity, rightVelocity);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								Propulsion.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Propulsion.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ControlledMotor.h>
 | 
				
			||||||
 | 
					#include <Placement.h>
 | 
				
			||||||
 | 
					#include <Vector2.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <list>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct MotorPlacement {
 | 
				
			||||||
 | 
					  Motor* motor;
 | 
				
			||||||
 | 
					  ControlledMotor* controlledMotor;
 | 
				
			||||||
 | 
					  Vector2 position;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Propulsion {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  /// @brief Setup sensing
 | 
				
			||||||
 | 
					  Propulsion();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void AddMotors(MotorPlacement* motors, unsigned int motorCount);
 | 
				
			||||||
 | 
					  void AddMotors(Placement* motors, unsigned int motorCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetDiffDriveSpeed(float leftSpeed, float rightSpeed);
 | 
				
			||||||
 | 
					  void SetDiffDriveVelocities(float leftVelocity, float rightVelocity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetTwistSpeed(float forward, float yaw);
 | 
				
			||||||
 | 
					  void SetTwistSpeed(float forward, float yaw, float pitch);
 | 
				
			||||||
 | 
					  void SetTwistVelocity(float forward, float yaw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Think: drones
 | 
				
			||||||
 | 
					  void SetLinearSpeed(Vector3 direction);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  unsigned long lastMillis;
 | 
				
			||||||
 | 
					  MotorPlacement* motors = nullptr;
 | 
				
			||||||
 | 
					  Placement* placement = nullptr;
 | 
				
			||||||
 | 
					  unsigned int motorCount = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										13
									
								
								Roboid.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Roboid.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					#include <Roboid.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Roboid::Roboid() {
 | 
				
			||||||
 | 
					  this->configuration = nullptr;
 | 
				
			||||||
 | 
					  this->thingCount = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Roboid::Roboid(Placement configuration[], unsigned int thingCount) {
 | 
				
			||||||
 | 
					  this->configuration = configuration;
 | 
				
			||||||
 | 
					  this->thingCount = thingCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sensing.AddSensors(configuration, thingCount);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										18
									
								
								Roboid.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Roboid.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Activation.h>
 | 
				
			||||||
 | 
					#include <Placement.h>
 | 
				
			||||||
 | 
					#include <Propulsion.h>
 | 
				
			||||||
 | 
					#include <Sensing.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Roboid {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Roboid();
 | 
				
			||||||
 | 
					  Roboid(Placement configuration[], unsigned int thingCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Sensing sensing;
 | 
				
			||||||
 | 
					  Propulsion propulsion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Placement* configuration;
 | 
				
			||||||
 | 
					  unsigned int thingCount;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										115
									
								
								Sensing.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								Sensing.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,115 @@
 | 
				
			|||||||
 | 
					#include <DistanceSensor.h>
 | 
				
			||||||
 | 
					#include <Sensing.h>
 | 
				
			||||||
 | 
					#include <Switch.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SensorPlacement::SensorPlacement(DistanceSensor* distanceSensor, Vector2 direction) {
 | 
				
			||||||
 | 
					  this->distanceSensor = distanceSensor;
 | 
				
			||||||
 | 
					  this->switchSensor = nullptr;
 | 
				
			||||||
 | 
					  this->direction = direction;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					SensorPlacement::SensorPlacement(Switch* switchSensor, Vector2 direction) {
 | 
				
			||||||
 | 
					  this->distanceSensor = nullptr;
 | 
				
			||||||
 | 
					  this->switchSensor = switchSensor;
 | 
				
			||||||
 | 
					  this->direction = direction;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sensing::Sensing() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// void Sensing::AddSensors(SensorPlacement* sensors, unsigned int sensorCount) {
 | 
				
			||||||
 | 
					//   this->sensors = sensors;
 | 
				
			||||||
 | 
					//   this->sensorCount = sensorCount;
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Sensing::AddSensors(Placement* things, unsigned int thingCount) {
 | 
				
			||||||
 | 
					  sensorCount = 0;
 | 
				
			||||||
 | 
					  for (unsigned int thingIx = 0; thingIx < thingCount; thingIx++) {
 | 
				
			||||||
 | 
					    Thing* thing = things[thingIx].thing;
 | 
				
			||||||
 | 
					    if (thing->isSensor)
 | 
				
			||||||
 | 
					      sensorCount++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sensorPlacements = new Placement[sensorCount];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned int sensorIx = 0;
 | 
				
			||||||
 | 
					  for (unsigned int thingIx = 0; thingIx < thingCount; thingIx++) {
 | 
				
			||||||
 | 
					    Thing* thing = things[thingIx].thing;
 | 
				
			||||||
 | 
					    if (thing->isSensor)
 | 
				
			||||||
 | 
					      sensorPlacements[sensorIx++] = things[thingIx];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Sensing::DistanceForward(float angle) {
 | 
				
			||||||
 | 
					  float minDistance = INFINITY;
 | 
				
			||||||
 | 
					  for (unsigned int sensorIx = 0; sensorIx < this->sensorCount; sensorIx++) {
 | 
				
			||||||
 | 
					    Placement placement = sensorPlacements[sensorIx];
 | 
				
			||||||
 | 
					    Sensor* sensor = (Sensor*)placement.thing;
 | 
				
			||||||
 | 
					    if (sensor->isDistanceSensor == false)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DistanceSensor* distanceSensor = (DistanceSensor*)placement.thing;
 | 
				
			||||||
 | 
					    float sensorAngle = placement.direction.x;
 | 
				
			||||||
 | 
					    if (sensorAngle > -angle && sensorAngle < angle) {
 | 
				
			||||||
 | 
					      minDistance = fmin(minDistance, distanceSensor->GetDistance());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return minDistance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Sensing::DistanceLeft(float angle) {
 | 
				
			||||||
 | 
					  float minDistance = INFINITY;
 | 
				
			||||||
 | 
					  for (unsigned int sensorIx = 0; sensorIx < this->sensorCount; sensorIx++) {
 | 
				
			||||||
 | 
					    Placement placement = sensorPlacements[sensorIx];
 | 
				
			||||||
 | 
					    Sensor* sensor = (Sensor*)placement.thing;
 | 
				
			||||||
 | 
					    if (sensor->isDistanceSensor == false)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DistanceSensor* distanceSensor = (DistanceSensor*)placement.thing;
 | 
				
			||||||
 | 
					    float sensorAngle = placement.direction.x;
 | 
				
			||||||
 | 
					    // Serial.printf("  distance sensor: %f %f 0\n", -angle, sensorAngle);
 | 
				
			||||||
 | 
					    if (sensorAngle < 0 && sensorAngle > -angle) {
 | 
				
			||||||
 | 
					      minDistance = fmin(minDistance, distanceSensor->GetDistance());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return minDistance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float Sensing::DistanceRight(float angle) {
 | 
				
			||||||
 | 
					  float minDistance = INFINITY;
 | 
				
			||||||
 | 
					  for (unsigned int sensorIx = 0; sensorIx < this->sensorCount; sensorIx++) {
 | 
				
			||||||
 | 
					    Placement placement = sensorPlacements[sensorIx];
 | 
				
			||||||
 | 
					    Sensor* sensor = (Sensor*)placement.thing;
 | 
				
			||||||
 | 
					    if (sensor->isDistanceSensor == false)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DistanceSensor* distanceSensor = (DistanceSensor*)placement.thing;
 | 
				
			||||||
 | 
					    float sensorAngle = placement.direction.x;
 | 
				
			||||||
 | 
					    // Serial.printf("  distance sensor: 0 %f %f\n", sensorAngle, angle);
 | 
				
			||||||
 | 
					    if (sensorAngle > 0 && sensorAngle < angle) {
 | 
				
			||||||
 | 
					      minDistance = fmin(minDistance, distanceSensor->GetDistance());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return minDistance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Sensing::SwitchOn(float fromAngle, float toAngle) {
 | 
				
			||||||
 | 
					  if (toAngle < fromAngle)
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (unsigned int sensorIx = 0; sensorIx < this->sensorCount; sensorIx++) {
 | 
				
			||||||
 | 
					    Placement placement = sensorPlacements[sensorIx];
 | 
				
			||||||
 | 
					    float angle = placement.direction.x;
 | 
				
			||||||
 | 
					    if (angle > fromAngle && angle < toAngle) {
 | 
				
			||||||
 | 
					      DistanceSensor* distanceSensor = (DistanceSensor*)placement.thing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // if (placement.switchSensor != nullptr && placement.switchSensor->IsOn())
 | 
				
			||||||
 | 
					      //   return true;
 | 
				
			||||||
 | 
					      // else
 | 
				
			||||||
 | 
					      if (distanceSensor != nullptr && distanceSensor->IsOn())
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										66
									
								
								Sensing.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								Sensing.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Placement.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <list>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DistanceSensor;
 | 
				
			||||||
 | 
					class Switch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NewSensorPlacement : public Placement {
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SensorPlacement {
 | 
				
			||||||
 | 
					  DistanceSensor* distanceSensor;
 | 
				
			||||||
 | 
					  Switch* switchSensor;
 | 
				
			||||||
 | 
					  Vector2 direction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SensorPlacement(DistanceSensor* distanceSensor, Vector2 direction);
 | 
				
			||||||
 | 
					  SensorPlacement(Switch* switchSensor, Vector2 direction);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Sensing {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  /// @brief Setup sensing
 | 
				
			||||||
 | 
					  Sensing();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // void AddSensors(SensorPlacement* sensors, unsigned int sensorCount);
 | 
				
			||||||
 | 
					  void AddSensors(Placement* sensors, unsigned int sensorCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float DistanceForward(float angle = 90);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// @brief Distance to the closest object on the left
 | 
				
			||||||
 | 
					  /// @return distance in meters, INFINITY when no object is detected.
 | 
				
			||||||
 | 
					  /// @note An object is on the left when the `angle` is between -180 and 0 degrees.
 | 
				
			||||||
 | 
					  /// @note An object dead straight (0 degrees) is not reported.
 | 
				
			||||||
 | 
					  float DistanceLeft() { return DistanceLeft(180); }
 | 
				
			||||||
 | 
					  /// @brief Distance to the closest object on the left
 | 
				
			||||||
 | 
					  /// @param angle the maximum angle on the left used for detection.
 | 
				
			||||||
 | 
					  /// @return distance in meters, INFINITY when no object is detected.
 | 
				
			||||||
 | 
					  /// @note An object is on the left when the `angle` is between -`angle` and 0 degrees.
 | 
				
			||||||
 | 
					  /// @note An object dead straight (0 degrees) is not reported.
 | 
				
			||||||
 | 
					  /// @note When an object is beyond `angle` meters, it is not reported.
 | 
				
			||||||
 | 
					  float DistanceLeft(float angle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// @brief Distance to the closest object on the right
 | 
				
			||||||
 | 
					  /// @return distance in meters, INFINITY when no object is detected
 | 
				
			||||||
 | 
					  /// @note An object is on the right when the `angle` is between 0 and 180 degrees
 | 
				
			||||||
 | 
					  /// @note An object dead straight (0 degrees) is not reported
 | 
				
			||||||
 | 
					  float DistanceRight() { return DistanceRight(180); }
 | 
				
			||||||
 | 
					  /// @brief Distance to the closest object on the right
 | 
				
			||||||
 | 
					  /// @param angle the maximum angle on the left used for detection.
 | 
				
			||||||
 | 
					  /// @return distance in meters, INFINITY when no object is detected
 | 
				
			||||||
 | 
					  /// @note An object is on the left when the `angle` is between 0 and `angle` degrees.
 | 
				
			||||||
 | 
					  /// @note An object dead straight (0 degrees) is not reported.
 | 
				
			||||||
 | 
					  /// @note When an object is beyond `angle` meters, it is not reported.
 | 
				
			||||||
 | 
					  float DistanceRight(float angle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float Distance(float leftAngle, float rightAngle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool SwitchOn(float fromAngle, float toAngle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  // SensorPlacement* sensors = nullptr;
 | 
				
			||||||
 | 
					  Placement* sensorPlacements = nullptr;
 | 
				
			||||||
 | 
					  unsigned int sensorCount = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										5
									
								
								Sensor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Sensor.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					#include "Sensor.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sensor::Sensor() {
 | 
				
			||||||
 | 
					  this->isSensor = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								Sensor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Sensor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Thing.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Sensor : public Thing {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Sensor();
 | 
				
			||||||
 | 
					  bool isDistanceSensor = false;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										8
									
								
								Servo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Servo.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Servo {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  Servo();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetTargetAngle(float angle) = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										1
									
								
								VectorAlgebra
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								VectorAlgebra
									
									
									
									
									
										Submodule
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					Subproject commit bebd097db3c3f3f311b58257719c80ee10237632
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user