p5.beholder
Version:
A p5 library to facilitate using the Beholder system for Aruco marker detection.
77 lines (68 loc) • 1.79 kB
JavaScript
let mk0;
let baseAngle;
let lastAngle;
let detectionRangeDegrees = 10;
function setup() {
p5beholder.prepare();
createCanvas(300, 300);
mk0 = p5beholder.getMarker(0);
baseAngle = mk0.rotation;
lastAngle = baseAngle;
}
function draw() {
// Visuals
background("black");
// Interpolate angle towards last detected angle
if (mk0.present) {
// Write detected angle value
push();
fill("#fff");
textSize(24);
text(mk0.rotation, 20, height - 40, width - 20, 40);
pop();
// Update last detected angle
baseAngle = mk0.rotation;
lastAngle = baseAngle;
// Draw detected angle as thick line
angleLine("#fff", baseAngle);
} else {
// Draw detected angle as thin line
angleLine("#fff", lastAngle, 1);
}
// Draw detection zone
detectAndDisplayRange(90, baseAngle, 25, "cyan");
detectAndDisplayRange(180, baseAngle, 25, "green");
detectAndDisplayRange(270, baseAngle, 25, "orange");
}
function detectAndDisplayRange(
detectionTargetAngle,
currentAngle,
angleRange,
lineColor
) {
// Show detection areas around range
angleLine(lineColor, radians(detectionTargetAngle), 5);
angleLine(lineColor, radians(detectionTargetAngle - angleRange / 2), 2);
angleLine(lineColor, radians(detectionTargetAngle + angleRange / 2), 2);
// Draw different if within bounds
if (
p5beholder.angleInRange(
currentAngle,
radians(detectionTargetAngle),
radians(angleRange)
)
) {
angleLine(lineColor, radians(detectionTargetAngle), 15);
}
}
function angleLine(lineColor, angleRadians, weight = 10) {
push();
fill(lineColor);
stroke(lineColor);
strokeWeight(weight);
angleMode(RADIANS);
translate(width / 2, height / 2);
rotate(-angleRadians);
line(0, 0, 0, -100);
pop();
}