0
현재 저는 맞춤형 공압 로봇 암으로 작업 중이며 다른 작업을위한 대기열을 설계하려고했습니다. 대기열을 설계하는 과정에서 함수에 전달할 함수 포인터와 int를 저장하는 논리를 생각해 냈습니다. 대기열은 함수가 반환 될 때까지 함수를 대기열에서 계속 실행하려고 시도합니다. 기능 포인터의 기능을 가리키는 포인터
는 큐가 작동하는 기본 기능을 수행하는 동안,하지만, 다음과 같은 방법으로 그것을 구현하려고 할 때 그것은 실패functionQueue.push(_lowerArm->waitForHoldingPosition, 100); // Lower Arm 100%
오류 메시지 :
Arm.h:180: error: no matching function for call to 'Queue<bool (*)(int), 50>::push(<unresolved overloaded function type>, int)'
/Queue.h:201: note: candidates are: bool Queue<T, queueMaxSize>::push(T, int) [with T = bool (*)(int), int queueMaxSize = 50]
을 문제를 해결하기 위해 나는 _lowerArm->waitForHoldingPosition
에 대한 참조를 시도했지만 성공하지 못했습니다. 누군가 내가 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다. 코드의
나머지 :
AirCylinder lowerArm(4, 13, 7, 1, false); //Green, White
AirCylinder upperArm(10, 11, 6, 2, true); //Yellow, Orange
AirCylinder wrist(8, 9, 5, 3, true); //Red, Blue
Arm arm(&lowerArm, &upperArm, &wrist, SERVO_PIN);
loop() { /* Do Core Stuff Here */
Arm.h
#include <Arduino.h>
#include "Queue.h"
#ifndef ARM_H
#define ARM_H
#define QUEUE_SIZE 50
class Arm {
private:
AirCylinder* _lowerArm;
AirCylinder* _upperArm;
AirCylinder* _wrist;
byte _servoPin;
byte _servoPosition;
byte _currentRoutine;
boolean _doingRoutine;
Queue<bool(*)(int),QUEUE_SIZE> functionQueue;
void _setFingers(byte);
void _doRoutine();
void _pickUpCone();
void _scoreConeLow();
void _scoreConeHigh();
void _scoreConeeSideways();
void _storeCone();
void _rest();
void _stabilize();
public:
Arm(AirCylinder *lowerArm, AirCylinder *upperArm, AirCylinder *wrist, byte servoPin);
void stabilize();
void openFingers() { _setFingers(Arm::SERVO_OPEN); }
void closeFingers() { _setFingers(Arm::SERVO_CLOSE); }
void setFingers(byte servoPos) { _setFingers(servoPos); }
void doRoutine();
void doRoutine(byte);
void calibrateRoutine(byte);
static const byte SERVO_OPEN = 0;
static const byte SERVO_CLOSE = 180;
static const byte PICKUP_CONE = 0;
static const byte SCORE_CONE_LOW = 1;
static const byte SCORE_CONE_HIGH = 2;
static const byte SCORE_CONE_SIDEWAYS = 3;
static const byte STORE_CONE = 4;
static const byte RESTING = 5;
};
Arm::Arm(AirCylinder *lowerArm, AirCylinder *upperArm, AirCylinder *wrist, byte servoPin) {
// Set a reference to all the arm cylinders
_lowerArm = lowerArm;
_upperArm = upperArm;
_wrist = wrist;
// Set the pin the servos are on
_servoPin = servoPin;
_doingRoutine = false;
}
void Arm::_scoreConeLow() {
// Grab cone from bot
// Lower Arm - 100%
// Upper Arm - 50%
// Wrist - 20%
// Lower Arm - 80%
// Put cone down
// Lower Arm - 100%
// Upper Arm - 75%
// Wrist - 0%
// Lower Arm - 70%
// Upper Arm - 60%
// Lower Arm - 40%
functionQueue.push(_upperArm->waitForHoldingPosition, 30); // Upper Arm 50%
functionQueue.push(_wrist->waitForHoldingPosition, 20); // Wrist 20%
functionQueue.push(_lowerArm->waitForHoldingPosition, 80); // Lower Arm 80%
functionQueue.push(_lowerArm->waitForHoldingPosition, 100); // Lower Arm 100%
functionQueue.push(_upperArm->waitForHoldingPosition, 75); // Upper Arm 75%
functionQueue.push(_wrist->waitForHoldingPosition, 0); // Wrist 0%
functionQueue.push(_lowerArm->waitForHoldingPosition, 70); // Lower Arm 70%
functionQueue.push(_upperArm->waitForHoldingPosition, 60); // Upper Arm 60%
functionQueue.push(_lowerArm->waitForHoldingPosition, 40); // Lower Arm 40%
}
AirCylinder.h
class AirCylinder {
private:
// Bunch of methods not used in this example
public:
/* Constructors */
AirCylinder();
AirCylinder(byte retractPin, byte extendPin, byte extendPressureHolderPin, byte potPin);
AirCylinder(byte retractPin, byte extendPin, byte extendPressureHolderPin, byte potPin, boolean isInverse);
/* Setters */
/* Getters */
/* Functions */
bool waitForHoldingPosition(int position);
};
/**
* waitForHoldingPosition
*
* Attempts to stablize the Air Cylider at the current Holding Position
* function returns true when the position is met
*
*/
bool AirCylinder::waitForHoldingPosition(int position) {
setHoldingPosition(position);
if(abs(getCurrentPosition() - position) > THRESHOLD_PERCENT) {
// Cylinder is not within the threshold
return false;
}
return true; // Cylinder is within the threshold
}
는 일반적인 함수 포인터가 될 수 큐에 삽입 캐스팅 입력하는 방법이 있나요? 대기열에서 팔 클래스의 전용 함수도 처리하기를 원합니다. – Steven10172
@ Steven10172 waitForHoldingPosition을 'static'으로 설정하면 도움이 될까요? –
아닙니다. 각 공기 실린더마다 특정 작업을 수행해야합니다. bool Arm :: moveServo() 및 bool Arm :: hasCone()을 큐에 추가 할 수 있어야하므로 일반 함수 포인터에 캐스트를 입력 할 수 있어야합니다. – Steven10172