Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 0 additions & 124 deletions constants/camera_constants.json

This file was deleted.

23 changes: 23 additions & 0 deletions constants/fiddler/camera_constants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"_comments": [
"Robot-specific camera configs for fiddler"
],
"cameras": [
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.1:1.0-video-index0",
"intrinsics_path": "/bos/constants/fiddler/usb_camera0_intrinsics.json",
"extrinsics_path": "/bos/constants/fiddler/usb_camera0_extrinsics.json",
"name": "fiddler_usb0"
},
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.4:1.0-video-index0",
"intrinsics_path": "/bos/constants/fiddler/usb_camera1_intrinsics.json",
"extrinsics_path": "/bos/constants/fiddler/usb_camera1_extrinsics.json",
"name": "fiddler_usb1"
}
]
}
46 changes: 46 additions & 0 deletions constants/main_bot/camera_constants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"_comments": [
"Robot-specific camera configs for main_bot"
],
"cameras": [
{
"camera_backend": "opencv",
"detector_backend": "cpu",
"pipeline": "nvarguscamerasrc sensor-id=0 ! video/x-raw(memory:NVMM), width=1456, height=1088, framerate=30/1, format=NV12 ! nvvidconv ! video/x-raw, format=BGRx ! queue ! appsink",
"intrinsics_path": "/bos/constants/main_bot/front_intrinsics.json",
"extrinsics_path": "/bos/constants/main_bot/front_extrinsics.json",
"name": "front",
"backlight": null,
"frame_width": null,
"frame_height": null,
"fps": null,
"exposure": null
},
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.3:1.0-video-index0",
"intrinsics_path": "/bos/constants/main_bot/left_intrinsics.json",
"extrinsics_path": "/bos/constants/main_bot/left_extrinsics.json",
"name": "left",
"backlight": null,
"frame_width": 1280,
"frame_height": 800,
"fps": 60.0,
"exposure": null
},
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.1:1.0-video-index0",
"intrinsics_path": "/bos/constants/main_bot/right_intrinsics.json",
"extrinsics_path": "/bos/constants/main_bot/right_extrinsics.json",
"name": "right",
"backlight": null,
"frame_width": 1280,
"frame_height": 800,
"fps": 60.0,
"exposure": null
}
]
}
46 changes: 46 additions & 0 deletions constants/second_bot/camera_constants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"_comments": [
"Robot-specific camera configs for second_bot"
],
"cameras": [
{
"camera_backend": "opencv",
"detector_backend": "cpu",
"pipeline": "nvarguscamerasrc sensor-id=0 aelock=true exposuretimerange=\"100000 200000\" gainrange=\"1 15\" ispdigitalgainrange=\"1 1\" ! video/x-raw(memory:NVMM), width=1456, height=1088, framerate=30/1, format=NV12 ! nvvidconv ! video/x-raw, format=BGRx ! queue ! appsink",
"intrinsics_path": "/bos/constants/second_bot/front_intrinsics.json",
"extrinsics_path": "/bos/constants/second_bot/front_extrinsics.json",
"name": "front",
"backlight": null,
"frame_width": null,
"frame_height": null,
"fps": null,
"exposure": null
},
{
"camera_backend": "uvc",
"detector_backend": "gpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.3:1.0-video-index0",
"intrinsics_path": "/bos/constants/second_bot/right_intrinsics.json",
"extrinsics_path": "/bos/constants/second_bot/right_extrinsics.json",
"name": "right",
"backlight": null,
"frame_width": 1280,
"frame_height": 800,
"fps": 60.0,
"exposure": null
},
{
"camera_backend": "uvc",
"detector_backend": "gpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.1:1.0-video-index0",
"intrinsics_path": "/bos/constants/second_bot/left_intrinsics.json",
"extrinsics_path": "/bos/constants/second_bot/left_extrinsics.json",
"name": "left",
"backlight": null,
"frame_width": 1280,
"frame_height": 800,
"fps": 60.0,
"exposure": null
}
]
}
32 changes: 32 additions & 0 deletions constants/shared_camera_constants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"_comments": [
"exposure: Nullopt = auto exposure",
"Shared camera configs that are not robot-specific"
],
"cameras": [
{
"pipeline": "nvarguscamerasrc sensor-id=0 aelock=true exposuretimerange=\"100000 200000\" gainrange=\"1 15\" ispdigitalgainrange=\"1 1\" ! video/x-raw(memory:NVMM), width=1456, height=1088, framerate=30/1, format=NV12 ! nvvidconv ! video/x-raw, format=BGRx ! queue ! appsink",
"intrinsics_path": "/bos/constants/imx296_camera0_intrinsics.json",
"extrinsics_path": "/bos/constants/imx296_camera0_extrinsics.json",
"name": "mipi0"
},
{
"pipeline": "nvarguscamerasrc sensor-id=1 aelock=true exposuretimerange=\"100000 200000\" gainrange=\"1 15\" ispdigitalgainrange=\"1 1\" ! video/x-raw(memory:NVMM), width=1456, height=1088, framerate=30/1, format=NV12 ! nvvidconv ! video/x-raw, format=BGRx ! queue ! appsink",
"intrinsics_path": "/bos/constants/imx296_camera1_intrinsics.json",
"extrinsics_path": "/bos/constants/imx296_camera1_extrinsics.json",
"name": "mipi1"
},
{
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:2.1:1.0-video-index0",
"intrinsics_path": "/bos/constants/misc/dev_orin_intrinsics.json",
"extrinsics_path": "/bos/constants/misc/dev_orin_extrinsics.json",
"name": "dev_orin"
},
{
"pipeline": "",
"intrinsics_path": "/bos/constants/misc/dummy_camera_intrinsics.json",
"extrinsics_path": "/bos/constants/misc/dummy_camera_extrinsics.json",
"name": "default_usb0"
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/test/integration_test/solver_test.cc looks up camera::GetCameraConstants().at("dummy_camera"), but this shared constants file does not define a camera named dummy_camera (the closest appears to be default_usb0). This will throw at runtime in that test unless the constants entry name is aligned (add a dummy_camera entry/alias here, or update the test to use the new name).

Suggested change
"name": "default_usb0"
"name": "default_usb0"
},
{
"pipeline": "",
"intrinsics_path": "/bos/constants/misc/dummy_camera_intrinsics.json",
"extrinsics_path": "/bos/constants/misc/dummy_camera_extrinsics.json",
"name": "dummy_camera"

Copilot uses AI. Check for mistakes.
}
]
}
25 changes: 25 additions & 0 deletions constants/turret_bot/camera_constants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"_comments": [
"Robot-specific camera configs for turret_bot"
],
"cameras": [
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:1.3:1.0-video-index0",
"intrinsics_path": "/bos/constants/turret_bot/front_right_intrinsics.json",
"extrinsics_path": "/bos/constants/turret_bot/front_right_extrinsics.json",
"name": "front_right",
"backlight": 0.0
},
{
"camera_backend": "uvc",
"detector_backend": "cpu",
"pipeline": "/dev/v4l/by-path/platform-3610000.usb-usb-0:1.4:1.0-video-index0",
"intrinsics_path": "/bos/constants/turret_bot/front_left_intrinsics.json",
"extrinsics_path": "/bos/constants/turret_bot/front_left_extrinsics.json",
"name": "front_left",
"backlight": 0.0
}
]
}
14 changes: 4 additions & 10 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,10 @@ add_subdirectory(yolo)
add_subdirectory(test)
add_subdirectory(pathing)

add_executable(main_bot_main main_bot_main.cc)
target_link_libraries(main_bot_main PRIVATE camera localization utils)
add_executable(robot_main robot_main.cc)
target_link_libraries(robot_main PRIVATE camera localization utils)

add_executable(second_bot_main second_bot_main.cc)
target_link_libraries(second_bot_main PRIVATE camera localization utils)

add_executable(unambiguous_second unambiguous_second.cc)
target_link_libraries(unambiguous_second PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils)

add_executable(unambiguous_first unambiguous_first.cc)
target_link_libraries(unambiguous_first PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils)
add_executable(unambiguous_main unambiguous_main.cc)
target_link_libraries(unambiguous_main PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils)

set(CMAKE_CXX_CLANG_TIDY "")
43 changes: 41 additions & 2 deletions src/camera/camera_constants.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,39 @@
#include "absl/flags/flag.h"

ABSL_FLAG(std::string, camera_constants_path, // NOLINT
"/bos/constants/camera_constants.json", // NOTLINT
"Path to the json file of camera constants"); //NOLINT
"/bos/constants/shared_camera_constants.json", // NOLINT
"Path to the json file of camera constants"); // NOLINT

namespace camera {

namespace {

auto ParseCameraBackend(std::string_view backend) -> CameraBackend {
if (backend == "uvc") {
return CameraBackend::kUvc;
}
if (backend == "opencv") {
return CameraBackend::kOpenCv;
}
LOG(WARNING) << "Unknown camera backend: " << backend
<< ", defaulting to opencv";
return CameraBackend::kOpenCv;
}

auto ParseDetectorBackend(std::string_view backend) -> DetectorBackend {
if (backend == "gpu") {
return DetectorBackend::kGpu;
}
if (backend == "cpu") {
return DetectorBackend::kCpu;
}
LOG(WARNING) << "Unknown detector backend: " << backend
<< ", defaulting to cpu";
return DetectorBackend::kCpu;
}

} // namespace

auto GetCameraConstants() -> camera_constants_t {
return GetCameraConstants(absl::GetFlag(FLAGS_camera_constants_path));
}
Expand Down Expand Up @@ -38,6 +66,17 @@ auto GetCameraConstants(const std::string& path) -> camera_constants_t {
camera_constant_t camera_constant{
.name = camera_config.value("name", std::string{})};

if (camera_config.contains("camera_backend") &&
!camera_config["camera_backend"].is_null()) {
camera_constant.camera_backend =
ParseCameraBackend(camera_config["camera_backend"].get<std::string>());
}
if (camera_config.contains("detector_backend") &&
!camera_config["detector_backend"].is_null()) {
camera_constant.detector_backend =
ParseDetectorBackend(
camera_config["detector_backend"].get<std::string>());
}
if (camera_config.contains("pipeline") &&
!camera_config["pipeline"].is_null()) {
camera_constant.pipeline = camera_config["pipeline"];
Expand Down
Loading