Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
bb8f414
WIP: Extrinsic Calibration from multiple synchronized frames
vaughantnrc May 16, 2025
f8b6be8
MNT: Update OpenCV 4.11 (appears to be more robust for extrinsic cali…
vaughantnrc Jun 27, 2025
0eb1602
WIP: Replacement of deprecated functions, consolidation of math logic
vaughantnrc Jul 9, 2025
b541056
WIP: Further consolidation of classes under `common`
vaughantnrc Jul 9, 2025
75f6f2a
WIP: Further consolidation, this time in controller
vaughantnrc Jul 10, 2025
df7e4a9
WIP: Further consolidation, globally. "Marker" has been renamed to "A…
vaughantnrc Jul 10, 2025
f2ae553
WIP: Further abstraction; some consolidation
vaughantnrc Jul 10, 2025
bc3f66b
WIP: Continued consolidation
vaughantnrc Jul 15, 2025
94d59b4
WIP: Simplified target definition and pose solver logic
vaughantnrc Jul 15, 2025
dc96904
WIP: Further consolidation
vaughantnrc Jul 15, 2025
45dd941
WIP: ExtrinsicCalibrator
vaughantnrc Jul 17, 2025
a0affda
WIP (May not be in working state)
vaughantnrc Aug 6, 2025
a5ef488
MNT: Consolidate common calibration functionality
vaughantnrc Aug 8, 2025
a4f5ca3
WIP: Initial implementation of extrinsic calibration based on ChArUco
vaughantnrc Aug 8, 2025
2777218
WIP Update automated test to use extrinsic calibration (Not yet working)
vaughantnrc Aug 11, 2025
31f658b
WIP: A few bugfixes, update testing data, calibration now converges
vaughantnrc Aug 12, 2025
d0d2c5e
WIP: Some decoupling of status-tracking from calibrator classes
vaughantnrc Aug 13, 2025
a87032d
WIP: Replace constants in extrinsic calibration with configurable par…
vaughantnrc Aug 13, 2025
7722880
WIP: Add testing against theoretical values for extrinsic calibrator
vaughantnrc Aug 14, 2025
e223647
WIP: Centralize aruco detection parameter creation so it's easier to …
vaughantnrc Aug 14, 2025
071fcc4
MNT: Expose ExtrinsicCalibrator functionality in Mixer
vaughantnrc Aug 20, 2025
23781a4
BUG: Update/correct imports, remove unused code
vaughantnrc Aug 25, 2025
2da8ddf
ENH: Add extrinsic calibration panel to GUI
vaughantnrc Aug 26, 2025
33c13aa
MNT: Update configuration file locations, terminologies, initializati…
vaughantnrc Aug 27, 2025
485228f
MNT: Update requirements and setup instructions
vaughantnrc Aug 28, 2025
a61aee5
BUG: Show status messages in GUI (added missing append to queue)
vaughantnrc Aug 28, 2025
59aa33a
BUG: Revert change that prevented Detector from communicating externally
vaughantnrc Sep 3, 2025
2007013
BUG: Fix issues during initial Detector connection
vaughantnrc Sep 4, 2025
7c0570e
BUG: Fix rendering of detected markers in GUI
vaughantnrc Sep 4, 2025
3a81b1e
ENH: Add Detector image generation files
vaughantnrc Oct 21, 2025
fc6fa19
BUG: Fix package dependencies and configuration for Detector
vaughantnrc Dec 16, 2025
f2550bf
BUG: Further fixes to detector configuration in image
vaughantnrc Dec 18, 2025
9a0dc92
BUG: Corrections based on testing
vaughantnrc Jan 8, 2026
346c6e0
Merge branch 'dev-tv-sync-extrinsic-calibration' of github.com:vaugha…
vaughantnrc Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 6 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.idea/*
.vscode/*
venv/*
.idea
.venv
.vscode
mcstrack.egg-info
pi-gen-detector/pi-gen
venv
*.pyc
.venv/*

Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"port": 8001
}
],
"pose_solvers": []
"mixers": []
}
203 changes: 203 additions & 0 deletions data/configuration/controller/dual_pi.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
{
"startup_mode": "detecting_and_solving",
"detectors": [
{
"label": "d101",
"ip_address": "192.168.0.101",
"port": 8001,
"camera_parameters": [],
"marker_parameters": [
{
"key": "cornerRefinementMethod",
"value": "SUBPIX"
}
]
},
{
"label": "d102",
"ip_address": "192.168.0.102",
"port": 8001,
"camera_parameters": [],
"marker_parameters": [
{
"key": "cornerRefinementMethod",
"value": "SUBPIX"
}
]
}
],
"mixers": [
{
"label": "sol",
"ip_address": "192.168.0.103",
"port": 8000,
"targets": [
{
"label": "reference",
"landmarks": [
{ "feature_label": "0$0", "x": -55.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "0$1", "x": -45.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "0$2", "x": -45.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "0$3", "x": -55.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "1$0", "x": -15.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "1$1", "x": -5.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "1$2", "x": -5.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "1$3", "x": -15.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "2$0", "x": 25.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "2$1", "x": 35.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "2$2", "x": 35.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "2$3", "x": 25.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "3$0", "x": 65.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "3$1", "x": 75.0, "y": 95.0, "z": 0.0 },
{ "feature_label": "3$2", "x": 75.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "3$3", "x": 65.0, "y": 85.0, "z": 0.0 },
{ "feature_label": "4$0", "x": -75.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "4$1", "x": -65.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "4$2", "x": -65.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "4$3", "x": -75.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "5$0", "x": -35.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "5$1", "x": -25.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "5$2", "x": -25.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "5$3", "x": -35.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "6$0", "x": 5.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "6$1", "x": 15.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "6$2", "x": 15.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "6$3", "x": 5.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "7$0", "x": 45.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "7$1", "x": 55.0, "y": 75.0, "z": 0.0 },
{ "feature_label": "7$2", "x": 55.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "7$3", "x": 45.0, "y": 65.0, "z": 0.0 },
{ "feature_label": "8$0", "x": -55.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "8$1", "x": -45.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "8$2", "x": -45.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "8$3", "x": -55.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "9$0", "x": -15.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "9$1", "x": -5.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "9$2", "x": -5.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "9$3", "x": -15.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "10$0", "x": 25.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "10$1", "x": 35.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "10$2", "x": 35.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "10$3", "x": 25.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "11$0", "x": 65.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "11$1", "x": 75.0, "y": 55.0, "z": 0.0 },
{ "feature_label": "11$2", "x": 75.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "11$3", "x": 65.0, "y": 45.0, "z": 0.0 },
{ "feature_label": "12$0", "x": -75.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "12$1", "x": -65.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "12$2", "x": -65.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "12$3", "x": -75.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "13$0", "x": -35.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "13$1", "x": -25.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "13$2", "x": -25.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "13$3", "x": -35.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "14$0", "x": 5.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "14$1", "x": 15.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "14$2", "x": 15.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "14$3", "x": 5.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "15$0", "x": 45.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "15$1", "x": 55.0, "y": 35.0, "z": 0.0 },
{ "feature_label": "15$2", "x": 55.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "15$3", "x": 45.0, "y": 25.0, "z": 0.0 },
{ "feature_label": "16$0", "x": -55.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "16$1", "x": -45.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "16$2", "x": -45.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "16$3", "x": -55.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "17$0", "x": -15.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "17$1", "x": -5.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "17$2", "x": -5.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "17$3", "x": -15.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "18$0", "x": 25.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "18$1", "x": 35.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "18$2", "x": 35.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "18$3", "x": 25.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "19$0", "x": 65.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "19$1", "x": 75.0, "y": 15.0, "z": 0.0 },
{ "feature_label": "19$2", "x": 75.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "19$3", "x": 65.0, "y": 5.0, "z": 0.0 },
{ "feature_label": "20$0", "x": -75.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "20$1", "x": -65.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "20$2", "x": -65.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "20$3", "x": -75.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "21$0", "x": -35.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "21$1", "x": -25.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "21$2", "x": -25.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "21$3", "x": -35.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "22$0", "x": 5.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "22$1", "x": 15.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "22$2", "x": 15.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "22$3", "x": 5.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "23$0", "x": 45.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "23$1", "x": 55.0, "y": -5.0, "z": 0.0 },
{ "feature_label": "23$2", "x": 55.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "23$3", "x": 45.0, "y": -15.0, "z": 0.0 },
{ "feature_label": "24$0", "x": -55.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "24$1", "x": -45.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "24$2", "x": -45.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "24$3", "x": -55.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "25$0", "x": -15.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "25$1", "x": -5.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "25$2", "x": -5.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "25$3", "x": -15.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "26$0", "x": 25.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "26$1", "x": 35.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "26$2", "x": 35.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "26$3", "x": 25.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "27$0", "x": 65.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "27$1", "x": 75.0, "y": -25.0, "z": 0.0 },
{ "feature_label": "27$2", "x": 75.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "27$3", "x": 65.0, "y": -35.0, "z": 0.0 },
{ "feature_label": "28$0", "x": -75.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "28$1", "x": -65.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "28$2", "x": -65.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "28$3", "x": -75.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "29$0", "x": -35.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "29$1", "x": -25.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "29$2", "x": -25.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "29$3", "x": -35.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "30$0", "x": 5.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "30$1", "x": 15.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "30$2", "x": 15.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "30$3", "x": 5.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "31$0", "x": 45.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "31$1", "x": 55.0, "y": -45.0, "z": 0.0 },
{ "feature_label": "31$2", "x": 55.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "31$3", "x": 45.0, "y": -55.0, "z": 0.0 },
{ "feature_label": "32$0", "x": -55.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "32$1", "x": -45.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "32$2", "x": -45.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "32$3", "x": -55.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "33$0", "x": -15.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "33$1", "x": -5.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "33$2", "x": -5.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "33$3", "x": -15.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "34$0", "x": 25.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "34$1", "x": 35.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "34$2", "x": 35.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "34$3", "x": 25.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "35$0", "x": 65.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "35$1", "x": 75.0, "y": -65.0, "z": 0.0 },
{ "feature_label": "35$2", "x": 75.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "35$3", "x": 65.0, "y": -75.0, "z": 0.0 },
{ "feature_label": "36$0", "x": -75.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "36$1", "x": -65.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "36$2", "x": -65.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "36$3", "x": -75.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "37$0", "x": -35.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "37$1", "x": -25.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "37$2", "x": -25.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "37$3", "x": -35.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "38$0", "x": 5.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "38$1", "x": 15.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "38$2", "x": 15.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "38$3", "x": 5.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "39$0", "x": 45.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "39$1", "x": 55.0, "y": -85.0, "z": 0.0 },
{ "feature_label": "39$2", "x": 55.0, "y": -95.0, "z": 0.0 },
{ "feature_label": "39$3", "x": 45.0, "y": -95.0, "z": 0.0 }
]
}
]
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
]
}
],
"pose_solvers": [
"mixers": [
{
"label": "ps",
"ip_address": "127.0.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
]
}
],
"pose_solvers": [
"mixers": [
{
"label": "ps",
"ip_address": "127.0.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
}
}
],
"pose_solvers": [
"mixers": [
{
"label": "sol",
"ip_address": "127.0.0.1",
Expand Down
19 changes: 19 additions & 0 deletions data/configuration/detector/opencv_aruco.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"detector_label": "detector_01",
"intrinsic_calibrator": {
"implementation": "charuco_opencv",
"configuration": {
"data_path": "./calibration/intrinsic/"
}
},
"camera": {
"implementation": "opencv_capture_device",
"configuration": {
"capture_device": 0
}
},
"annotator": {
"implementation": "aruco_opencv",
"configuration": {}
}
}
17 changes: 17 additions & 0 deletions data/configuration/detector/rpicam_aruco.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"detector_label": "detector_01",
"intrinsic_calibrator": {
"implementation": "charuco_opencv",
"configuration": {
"data_path": "./calibration/intrinsic/"
}
},
"camera": {
"implementation": "picamera2",
"configuration": {}
},
"annotator": {
"implementation": "aruco_opencv",
"configuration": {}
}
}
9 changes: 9 additions & 0 deletions data/configuration/mixer/aruco.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"mixer_label": "mixer_01",
"extrinsic_calibrator": {
"implementation": "charuco_opencv",
"configuration": {
"data_path": "./calibration/extrinsic/"
}
}
}
Loading