diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4431850..28678aa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,16 +4,14 @@ include_directories(${CMAKE_SOURCE_DIR}) add_subdirectory(utils) add_subdirectory(camera) +add_subdirectory(gamepiece) add_subdirectory(localization) add_subdirectory(calibration) add_subdirectory(yolo) add_subdirectory(test) -add_executable(game_piece_main game_piece_main.cc) -target_link_libraries(game_piece_main wpilibc ntcore ${OpenCV_LIBS} camera utils yolo) - add_executable(fiddler_main fiddler_main.cc) target_link_libraries(fiddler_main PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils) add_executable(software_bot_main software_bot_main.cc) -target_link_libraries(software_bot_main PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils yolo) +target_link_libraries(software_bot_main PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils yolo gamepiece) diff --git a/src/fiddler_main.cc b/src/fiddler_main.cc index 3ecd631..ade6c9f 100644 --- a/src/fiddler_main.cc +++ b/src/fiddler_main.cc @@ -23,18 +23,18 @@ using json = nlohmann::json; int main() { utils::StartNetworktables(); - camera::CameraSource back_left_camera( + std::shared_ptr back_left_camera = std::make_shared( "back_left", std::make_unique(cv::VideoCapture( camera::camera_constants[camera::Camera::USB0].pipeline))); - camera::CameraSource back_right_camera( + std::shared_ptr back_right_camera = std::make_shared( "back_right", std::make_unique(cv::VideoCapture( camera::camera_constants[camera::Camera::USB1].pipeline))); std::thread usb0_thread( - localization::run_localization, std::ref(back_left_camera), + localization::run_localization, back_left_camera, std::make_unique( 640, 480, utils::read_intrinsics( @@ -43,7 +43,7 @@ int main() { false); std::thread usb1_thread( - localization::run_localization, std::ref(back_right_camera), + localization::run_localization, back_right_camera, std::make_unique( 1280, 720, utils::read_intrinsics( diff --git a/src/gamepiece/CMakeLists.txt b/src/gamepiece/CMakeLists.txt new file mode 100644 index 0000000..df24c4c --- /dev/null +++ b/src/gamepiece/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(gamepiece gamepiece.cc) +target_link_libraries(gamepiece wpilibc ntcore ${OpenCV_LIBS} camera utils yolo) + diff --git a/src/game_piece_main.cc b/src/gamepiece/gamepiece.cc similarity index 76% rename from src/game_piece_main.cc rename to src/gamepiece/gamepiece.cc index 4cad863..5f8c9a9 100644 --- a/src/game_piece_main.cc +++ b/src/gamepiece/gamepiece.cc @@ -1,12 +1,10 @@ -#include +#include "gamepiece.h" #include -#include #include #include #include #include #include -#include "src/camera/camera.h" #include "src/camera/camera_constants.h" #include "src/camera/cscore_streamer.h" #include "src/camera/cv_camera.h" @@ -14,8 +12,9 @@ #include "src/utils/camera_utils.h" #include "src/utils/nt_utils.h" #include "src/yolo/model_constants.h" -#include "src/yolo/yolo.h" + +namespace gamepiece { static constexpr int MAX_DETECTIONS = 6; static std::mutex mutex; @@ -39,7 +38,7 @@ std::ostream& operator<<(std::ostream& os, const frc::Transform3d& p) { void run_gamepiece_detect(yolo::Yolo& model, const std::vector& class_names, - std::unique_ptr camera, + std::shared_ptr camera, nt::StructTopic& coral_topic, nt::StructTopic& algae_topic, nlohmann::json intrinsics, nlohmann::json extrinsics, @@ -66,11 +65,11 @@ void run_gamepiece_detect(yolo::Yolo& model, frc::Rotation3d{ units::radian_t{extrinsics["rotation_x"].get()}, units::radian_t{extrinsics["rotation_y"].get()}, - units::radian_t{(float)extrinsics["rotation_z"].get()}}}; + units::radian_t{extrinsics["rotation_z"].get()}}}; frc::Transform3d target_pose_cam_relative; frc::Pose3d target_pose_robot_relative; while (true) { - camera->GetFrame(color); + color = camera->GetFrame(); mutex.lock(); model.Postprocess(color.rows, color.cols, model.RunModel(color), bboxes, confidences, class_ids); @@ -120,31 +119,4 @@ void run_gamepiece_detect(yolo::Yolo& model, } } } - -int main() { - std::cout << std::fixed << std::setprecision(2); - std::cout << "Starting gamepiece main" << std::endl; - std::cout << "Started networktables" << std::endl; - yolo::ModelInfo model_info = yolo::models[yolo::Model::COLOR]; - yolo::Yolo color_model(model_info.path, model_info.color); - utils::StartNetworktables(); - nt::NetworkTableInstance inst = nt::NetworkTableInstance::GetDefault(); - std::shared_ptr coral_table = - inst.GetTable("Orin/Gamepiece/coral"); - std::shared_ptr algae_table = - inst.GetTable("Orin/Gamepiece/algae"); - nt::StructTopic coral_topic = - coral_table->GetStructTopic("Pose"); - nt::StructTopic algae_topic = - algae_table->GetStructTopic("Pose"); - - std::vector camera_threads; - camera_threads.emplace_back( - run_gamepiece_detect, std::ref(color_model), - std::ref(model_info.class_names), - std::make_unique(), std::ref(coral_topic), - std::ref(algae_topic), - utils::read_intrinsics("/bos/constants/realsense_intrinsics.json"), - utils::read_extrinsics("/bos/constants/realsense_extrinsics.json"), true); - camera_threads[0].join(); -} +} // namespace gamepiece diff --git a/src/gamepiece/gamepiece.h b/src/gamepiece/gamepiece.h new file mode 100644 index 0000000..ea8dfb0 --- /dev/null +++ b/src/gamepiece/gamepiece.h @@ -0,0 +1,16 @@ +#pragma once +#include +#include +#include "src/camera/camera_source.h" +#include "src/yolo/yolo.h" +#include + +namespace gamepiece { +void run_gamepiece_detect(yolo::Yolo& model, + const std::vector& class_names, + std::shared_ptr camera, + nt::StructTopic& coral_topic, + nt::StructTopic& algae_topic, + nlohmann::json intrinsics, nlohmann::json extrinsics, + bool debug); +} // namespace gamepiece diff --git a/src/localization/run_localization.cc b/src/localization/run_localization.cc index 8c11860..6103fa9 100644 --- a/src/localization/run_localization.cc +++ b/src/localization/run_localization.cc @@ -8,20 +8,20 @@ namespace localization { -void run_localization(camera::CameraSource& source, +void run_localization(std::shared_ptr source, std::unique_ptr detector, std::string extrinsics, uint port, bool verbose) { - localization::PositionSender position_sender(source.GetName()); + localization::PositionSender position_sender(source->GetName()); - camera::CscoreStreamer streamer(source.GetName(), port, 30, 1080, 1080); + camera::CscoreStreamer streamer(source->GetName(), port, 30, 1080, 1080); nlohmann::json extrinsics_json = utils::read_extrinsics(extrinsics); frc::Transform3d camera_to_robot = localization::ExtrinsicsJsonToCameraToRobot(extrinsics_json); while (true) { - utils::Timer timer(source.GetName(), verbose); - camera::timestamped_frame_t timestamped_frame = source.Get(); + utils::Timer timer(source->GetName(), verbose); + camera::timestamped_frame_t timestamped_frame = source->Get(); streamer.WriteFrame(timestamped_frame.frame); std::vector estimates = localization::ToFeildRelitivePosition( diff --git a/src/localization/run_localization.h b/src/localization/run_localization.h index b000dd2..e15df9b 100644 --- a/src/localization/run_localization.h +++ b/src/localization/run_localization.h @@ -4,7 +4,7 @@ #include "src/localization/apriltag_detector.h" #include "src/localization/gpu_apriltag_detector.h" namespace localization { -void run_localization(camera::CameraSource& source, +void run_localization(std::shared_ptr source, std::unique_ptr detector, std::string extrinsics, uint port, bool verbose = false); } diff --git a/src/software_bot_main.cc b/src/software_bot_main.cc index 0458d22..f0bd47f 100644 --- a/src/software_bot_main.cc +++ b/src/software_bot_main.cc @@ -19,49 +19,25 @@ #include "src/utils/timer.h" #include "src/yolo/model_constants.h" #include "src/yolo/yolo.h" +#include "src/gamepiece/gamepiece.h" using json = nlohmann::json; -void run_yolo(const int frame_width, const int frame_height, - yolo::ModelInfo& model_info, camera::CameraSource& source, - std::string extrinsics, uint port) { - yolo::Yolo model(model_info.path, model_info.color, true); - - camera::CscoreStreamer streamer(source.GetName(), 4971, 30, 1080, 1080); - - std::vector bboxes(6); - std::vector confidences(6); - std::vector class_ids(6); - - while (true) { - camera::timestamped_frame_t timestamped_frame = source.Get(); - - std::vector detections = model.RunModel(timestamped_frame.frame); - model.Postprocess(timestamped_frame.frame.rows, - timestamped_frame.frame.cols, detections, bboxes, - confidences, class_ids); - - yolo::Yolo::DrawDetections(timestamped_frame.frame, bboxes, class_ids, - confidences, model_info.class_names); - streamer.WriteFrame(timestamped_frame.frame); - } -} - int main() { utils::StartNetworktables(); - camera::CameraSource back_left_camera( + std::shared_ptr back_left_camera = std::make_shared( "back_left", std::make_unique(cv::VideoCapture( camera::camera_constants[camera::Camera::USB0].pipeline))); - camera::CameraSource back_right_camera( + std::shared_ptr back_right_camera = std::make_shared( "back_right", std::make_unique(cv::VideoCapture( camera::camera_constants[camera::Camera::USB1].pipeline))); std::thread usb0_thread( - localization::run_localization, std::ref(back_left_camera), + localization::run_localization, back_left_camera, std::make_unique( 640, 480, utils::read_intrinsics( @@ -70,7 +46,7 @@ int main() { false); std::thread usb1_thread( - localization::run_localization, std::ref(back_right_camera), + localization::run_localization, back_right_camera, std::make_unique( 1280, 720, utils::read_intrinsics( @@ -78,7 +54,23 @@ int main() { camera::camera_constants[camera::Camera::USB1].extrinsics_path, 4972, false); - usb0_thread.join(); + nt::NetworkTableInstance inst = nt::NetworkTableInstance::GetDefault(); + std::shared_ptr coral_table = + inst.GetTable("Orin/Gamepiece/coral"); + std::shared_ptr algae_table = + inst.GetTable("Orin/Gamepiece/algae"); + nt::StructTopic coral_topic = + coral_table->GetStructTopic("Pose"); + nt::StructTopic algae_topic = + algae_table->GetStructTopic("Pose"); + + yolo::ModelInfo model_info = yolo::models[yolo::Model::COLOR]; + yolo::Yolo color_model(model_info.path, model_info.color); + + std::thread usb0_gamepiece_thread(gamepiece::run_gamepiece_detect, std::ref(color_model), std::ref(model_info.class_names), back_left_camera, std::ref(coral_topic), std::ref(algae_topic), utils::read_intrinsics(camera::camera_constants[camera::Camera::USB1].intrinsics_path), + utils::read_extrinsics(camera::camera_constants[camera::Camera::USB1].extrinsics_path), true); + + usb0_gamepiece_thread.join(); return 0; } diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 5ae2c30..08a7374 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -19,6 +19,9 @@ target_link_libraries(timer_test PRIVATE utils) add_executable(stress_test stress_test.cc) target_link_libraries(stress_test PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils yolo) +add_executable(gamepiece_test gamepiece_test.cc) +target_link_libraries(gamepiece_test PRIVATE gamepiece yolo camera utils) + add_executable(nvidia_apriltag_test nvidia_apriltag_test.cc) target_link_libraries(nvidia_apriltag_test PRIVATE ${OpenCV_LIBS} apriltag ntcore camera nlohmann_json::nlohmann_json Eigen3::Eigen localization utils yolo vpi utils) diff --git a/src/test/gamepiece_test.cc b/src/test/gamepiece_test.cc new file mode 100644 index 0000000..b0e2119 --- /dev/null +++ b/src/test/gamepiece_test.cc @@ -0,0 +1,30 @@ +#include "src/gamepiece/gamepiece.h" +#include "src/yolo/yolo.h" +#include "src/yolo/model_constants.h" +#include "src/camera/select_camera.h" +#include "src/camera/cscore_streamer.h" +#include "src/utils/camera_utils.h" + +int main() { + camera::Camera config = camera::SelectCameraConfig(); + std::shared_ptr camera = std::make_shared("nvidia_apriltag_test", + camera::GetCameraStream(config)); + camera::CscoreStreamer streamer("yolo_test", 4971, 30, 1080, 1080); + + nt::NetworkTableInstance inst = nt::NetworkTableInstance::GetDefault(); + std::shared_ptr coral_table = + inst.GetTable("Orin/Gamepiece/coral"); + std::shared_ptr algae_table = + inst.GetTable("Orin/Gamepiece/algae"); + nt::StructTopic coral_topic = + coral_table->GetStructTopic("Pose"); + nt::StructTopic algae_topic = + algae_table->GetStructTopic("Pose"); + yolo::ModelInfo model_info = yolo::models[yolo::Model::COLOR]; + yolo::Yolo color_model(model_info.path, model_info.color); + + std::thread usb0_gamepiece_thread(gamepiece::run_gamepiece_detect, std::ref(color_model), std::ref(model_info.class_names), camera, std::ref(coral_topic), std::ref(algae_topic), utils::read_intrinsics(camera::camera_constants[config].intrinsics_path), + utils::read_extrinsics(camera::camera_constants[config].extrinsics_path), true); + + usb0_gamepiece_thread.join(); +} diff --git a/src/test/stress_test.cc b/src/test/stress_test.cc index db34679..59c358c 100644 --- a/src/test/stress_test.cc +++ b/src/test/stress_test.cc @@ -26,12 +26,12 @@ int main() { utils::StartNetworktables(); camera::Camera config = camera::SelectCameraConfig(); - camera::CameraSource source("stress_test_camera", + std::shared_ptr source = std::make_shared("stress_test_camera", camera::GetCameraStream(config)); - cv::Mat frame = source.GetFrame(); + cv::Mat frame = source->GetFrame(); std::thread usb0_thread( - localization::run_localization, std::ref(source), + localization::run_localization, source, std::make_unique( frame.cols, frame.rows, utils::read_intrinsics( @@ -40,7 +40,7 @@ int main() { false); std::thread usb1_thread( - localization::run_localization, std::ref(source), + localization::run_localization, source, std::make_unique( frame.cols, frame.rows, utils::read_intrinsics( @@ -49,7 +49,7 @@ int main() { false); std::thread usb2_thread( - localization::run_localization, std::ref(source), + localization::run_localization, source, std::make_unique( frame.cols, frame.rows, utils::read_intrinsics( @@ -58,7 +58,7 @@ int main() { false); std::thread usb3_thread( - localization::run_localization, std::ref(source), + localization::run_localization, source, std::make_unique( frame.cols, frame.rows, utils::read_intrinsics( diff --git a/src/utils/camera_utils.h b/src/utils/camera_utils.h index 16b2764..49cb965 100644 --- a/src/utils/camera_utils.h +++ b/src/utils/camera_utils.h @@ -1,3 +1,4 @@ +#pragma once #include #include "nlohmann/json.hpp" diff --git a/src/utils/nt_utils.h b/src/utils/nt_utils.h index a2166db..2de41cc 100644 --- a/src/utils/nt_utils.h +++ b/src/utils/nt_utils.h @@ -1,3 +1,4 @@ +#pragma once namespace utils { void StartNetworktables(int team_number = 971); } // namespace utils diff --git a/src/utils/timer.h b/src/utils/timer.h index 9f6fda0..e645b47 100644 --- a/src/utils/timer.h +++ b/src/utils/timer.h @@ -1,3 +1,4 @@ +#pragma once #include #include namespace utils {