diff --git a/CMakeLists.txt b/CMakeLists.txt index 826b358a..d642d07d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.10) + project(BOS CXX C CUDA) set(CMAKE_CXX_STANDARD 20) @@ -10,19 +11,17 @@ set(CMAKE_CUDA_STANDARD_REQUIRED ON) set(CMAKE_CUDA_ARCHITECTURES 87) set(CMAKE_CUDA20_STANDARD_COMPILE_OPTION "-std=c++20") set(CMAKE_CUDA20_EXTENSION_COMPILE_OPTION "-std=c++20") -set(CMAKE_CUDA_FLAGS "--expt-relaxed-constexpr") +set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") option(ENABLE_CLANG_TIDY "Enable clang-tidy for static analysis" ON) -include_directories(/usr/local/cuda/include) -link_directories(/usr/local/cuda/lib64) - find_package(wpilib REQUIRED) find_package(OpenCV REQUIRED) find_package(Eigen3 REQUIRED) find_package(vpi REQUIRED) +find_package(CUDAToolkit REQUIRED) add_subdirectory(third_party/json) add_subdirectory(third_party/971apriltag) diff --git a/scripts/build.sh b/scripts/build.sh index 20c9fbf2..474906df 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -26,5 +26,11 @@ if [ "$(pwd)" != "/bos" ]; then cp -r constants /bos fi git submodule update --init --progress --depth 1 -cmake -DENABLE_CLANG_TIDY=OFF -DCMAKE_BUILD_TYPE=Release -B "$BUILD_DIR" -G Ninja . +ARCH=$(uname -m) +echo "$ARCH" +if [[ "$ARCH" == "x86_64" ]]; then + cmake -DENABLE_CLANG_TIDY=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake -B "$BUILD_DIR" -G Ninja . +else + cmake -DENABLE_CLANG_TIDY=OFF -DCMAKE_BUILD_TYPE=Release -B "$BUILD_DIR" -G Ninja . +fi cmake --build "$BUILD_DIR" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1f016da1..9cac9ddf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,19 +18,7 @@ add_subdirectory(gamepiece) add_subdirectory(localization) add_subdirectory(calibration) 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(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_subdirectory(test) set(CMAKE_CXX_CLANG_TIDY "") diff --git a/src/localization/CMakeLists.txt b/src/localization/CMakeLists.txt index 5a3ae30b..3b0f2ff1 100644 --- a/src/localization/CMakeLists.txt +++ b/src/localization/CMakeLists.txt @@ -1,4 +1,4 @@ cmake_minimum_required(VERSION 3.10) add_library(localization gpu_apriltag_detector.cc opencv_apriltag_detector.cc run_localization.cc nvidia_apriltag_detector.cc square_solver.cc joint_solver.cc multi_tag_solver.cc position_receiver.cc unambiguous_estimator.cc simulation_sender.cc networktable_sender.cc) -target_link_libraries(localization PUBLIC 971apriltag utils camera wpilibc wpiutil vpi absl::status) +target_link_libraries(localization PUBLIC 971apriltag utils camera wpilibc wpiutil absl::status) diff --git a/src/localization/gpu_apriltag_detector.cc b/src/localization/gpu_apriltag_detector.cc index f3f7e16f..656fd245 100644 --- a/src/localization/gpu_apriltag_detector.cc +++ b/src/localization/gpu_apriltag_detector.cc @@ -55,7 +55,7 @@ auto GPUAprilTagDetector::GetTagDetections( try { CHECK(timestamped_frame.frame.channels() == 3); cv::Mat gray; - cv::cvtColor(timestamped_frame.frame, gray, cv::COLOR_BGR2YUV_YUY2); + cv::cvtColor(timestamped_frame.frame, gray, cv::COLOR_BGR2YUV_YUYV); cv::Mat mat_ = ToMat(gray); absl::Status detection_status = gpu_detector_->Detect(mat_.data, nullptr); if (!detection_status.ok()) { diff --git a/src/test/integration_test/CMakeLists.txt b/src/test/integration_test/CMakeLists.txt index 3206fa4e..861f0b13 100644 --- a/src/test/integration_test/CMakeLists.txt +++ b/src/test/integration_test/CMakeLists.txt @@ -4,9 +4,6 @@ target_link_libraries(apriltag_detect_test PRIVATE cscore camera localization ut add_executable(intrinsics_test intrinsics_test.cc) target_link_libraries(intrinsics_test PRIVATE camera utils) -add_executable(yolo_test yolo_test.cc) -target_link_libraries(yolo_test PRIVATE camera yolo utils) - add_executable(path_plan_test path_plan_test.cc) target_link_libraries(path_plan_test PRIVATE utils) @@ -27,3 +24,7 @@ target_link_libraries(networktable_performance_test PRIVATE utils localization) add_executable(pva_test pva_test.cc) target_link_libraries(pva_test PRIVATE utils localization vpi) + +find_package(CUDAToolkit REQUIRED) +add_executable(yolo_test yolo_test.cc) +target_link_libraries(yolo_test PRIVATE camera yolo utils CUDA::cudart) diff --git a/src/test/unit_test/CMakeLists.txt b/src/test/unit_test/CMakeLists.txt index cf8055b3..21a133e0 100644 --- a/src/test/unit_test/CMakeLists.txt +++ b/src/test/unit_test/CMakeLists.txt @@ -13,8 +13,6 @@ add_executable(general_solver_test general_solver_test.cc) target_link_libraries(general_solver_test PRIVATE localization utils GTest::gtest_main) add_executable(matrix matrix.cc) -target_link_libraries(matrix PRIVATE localization utils GTest::gtest_main) +target_link_libraries(matrix PRIVATE localization utils GTest::gtest_main CUDA::cudart) include(GoogleTest) -gtest_discover_tests(multi_tag_test) -gtest_discover_tests(square_solve_test) diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index 87daae36..2c05bad7 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -1,5 +1,5 @@ add_library(utils timer.cc nt_utils.cc camera_utils.cc log.cc constants_from_json.cc transform.cc) -target_link_libraries(utils PUBLIC wpilibc nlohmann_json::nlohmann_json absl::log absl::check absl::flags absl::flags_parse apriltag ntcore vpi) +target_link_libraries(utils PUBLIC wpilibc nlohmann_json::nlohmann_json absl::log absl::check absl::flags absl::flags_parse apriltag ntcore) if(!ENABLE_CLANG_TIDY) target_precompile_headers(utils PUBLIC pch.h) diff --git a/src/yolo/CMakeLists.txt b/src/yolo/CMakeLists.txt index d37a22ab..79c1de62 100644 --- a/src/yolo/CMakeLists.txt +++ b/src/yolo/CMakeLists.txt @@ -1,2 +1,4 @@ +find_package(CUDAToolkit REQUIRED) add_library(yolo yolo.cc) -target_link_libraries(yolo PRIVATE nvinfer nvinfer_plugin cudart utils) +target_link_libraries(yolo PRIVATE nvinfer nvinfer_plugin CUDA::cudart utils) + diff --git a/src/yolo/yolo.cc b/src/yolo/yolo.cc index 54e81372..a18da422 100644 --- a/src/yolo/yolo.cc +++ b/src/yolo/yolo.cc @@ -4,13 +4,14 @@ #include #include #include -#include -#include #include #include #include -#include "opencv2/cudawarping.hpp" #include "src/utils/pch.h" +#include +#include +#include +#include namespace yolo { auto loadEngineFile(const std::string& filename) -> std::vector { diff --git a/third_party/971apriltag/CMakeLists.txt b/third_party/971apriltag/CMakeLists.txt index 0feaec03..5828caff 100644 --- a/third_party/971apriltag/CMakeLists.txt +++ b/third_party/971apriltag/CMakeLists.txt @@ -1,11 +1,6 @@ cmake_minimum_required(VERSION 3.10) -include_directories(. /usr/local/cuda/include ${OpenCV_INCLUDE_DIRS}) -add_compile_options(-march=armv8-a+simd) - -find_package(wpilib REQUIRED) -enable_language(CUDA) - +include_directories(. ${OpenCV_INCLUDE_DIRS}) add_library(971apriltag_dep) target_sources(971apriltag_dep @@ -15,12 +10,11 @@ target_sources(971apriltag_dep set_target_properties(971apriltag_dep PROPERTIES LINKER_LANGUAGE C) add_library(971apriltag_cuda_dep cuda.cc) -target_link_libraries(971apriltag_cuda_dep PUBLIC apriltag absl::log absl::check 971apriltag_dep cudart) +target_link_libraries(971apriltag_cuda_dep PUBLIC apriltag absl::log absl::check 971apriltag_dep) set_source_files_properties(threshold.cc PROPERTIES LANGUAGE CUDA) - add_library(971apriltag_threshold_dep threshold.cc fatal_neon_threshold.cc) -target_link_libraries(971apriltag_threshold_dep PUBLIC apriltag absl::log absl::check 971apriltag_dep) +target_link_libraries(971apriltag_threshold_dep PUBLIC absl::log absl::check 971apriltag_dep) add_library(971apriltag apriltag.cc @@ -30,9 +24,13 @@ add_library(971apriltag points.cc ) -target_link_libraries(971apriltag PUBLIC apriltag 971apriltag_cuda_dep 971apriltag_threshold_dep absl::log absl::check absl::status 971apriltag_dep) +target_link_libraries(971apriltag PUBLIC apriltag 971apriltag_cuda_dep 971apriltag_threshold_dep absl::log absl::check absl::status 971apriltag_dep CUDA::cudart CUDA::cudart_static) set_source_files_properties(labeling_allegretti_2019_BKE.cc apriltag_detect.cc apriltag.cc line_fit_filter.cc points.cc PROPERTIES LANGUAGE CUDA) +add_executable(test test.cc) +target_link_libraries(test PRIVATE CUDA::cudart) +set_source_files_properties(test.cc PROPERTIES LANGUAGE CUDA) + target_compile_options(971apriltag PRIVATE -w) target_compile_options(971apriltag_dep PRIVATE -w) target_compile_options(971apriltag_threshold_dep PRIVATE -w) diff --git a/third_party/971apriltag/apriltag.c b/third_party/971apriltag/apriltag.c index 4f4346e1..9f41f752 100644 --- a/third_party/971apriltag/apriltag.c +++ b/third_party/971apriltag/apriltag.c @@ -332,75 +332,6 @@ static inline int detection_compare_function(const void *_a, const void *_b) return a->id - b->id; } -void apriltag_detector_remove_family(apriltag_detector_t *td, apriltag_family_t *fam) -{ - quick_decode_uninit(fam); - zarray_remove_value(td->tag_families, &fam, 0); -} - -void apriltag_detector_add_family_bits(apriltag_detector_t *td, apriltag_family_t *fam, int bits_corrected) -{ - zarray_add(td->tag_families, &fam); - - if (!fam->impl) - quick_decode_init(fam, bits_corrected); -} - -void apriltag_detector_clear_families(apriltag_detector_t *td) -{ - for (int i = 0; i < zarray_size(td->tag_families); i++) { - apriltag_family_t *fam; - zarray_get(td->tag_families, i, &fam); - quick_decode_uninit(fam); - } - zarray_clear(td->tag_families); -} - -apriltag_detector_t *apriltag_detector_create() -{ - apriltag_detector_t *td = (apriltag_detector_t*) calloc(1, sizeof(apriltag_detector_t)); - - td->nthreads = 1; - td->quad_decimate = 2.0; - td->quad_sigma = 0.0; - - td->qtp.max_nmaxima = 10; - td->qtp.min_cluster_pixels = 5; - - td->qtp.max_line_fit_mse = 10.0; - td->qtp.cos_critical_rad = cos(10 * M_PI / 180); - td->qtp.deglitch = false; - td->qtp.min_white_black_diff = 5; - - td->tag_families = zarray_create(sizeof(apriltag_family_t*)); - - pthread_mutex_init(&td->mutex, NULL); - - td->tp = timeprofile_create(); - - td->refine_edges = true; - td->decode_sharpening = 0.25; - - - td->debug = false; - - // NB: defer initialization of td->wp so that the user can - // override td->nthreads. - - return td; -} - -void apriltag_detector_destroy(apriltag_detector_t *td) -{ - timeprofile_destroy(td->tp); - workerpool_destroy(td->wp); - - apriltag_detector_clear_families(td); - - zarray_destroy(td->tag_families); - free(td); -} - struct quad_decode_task { int i0, i1; @@ -982,15 +913,6 @@ static void quad_decode_task(void *_u) } } -void apriltag_detection_destroy(apriltag_detection_t *det) -{ - if (det == NULL) - return; - - matd_destroy(det->H); - free(det); -} - static int prefer_smaller(int pref, double q0, double q1) { if (pref) // already prefer something? exit. @@ -1067,397 +989,3 @@ void reconcile_detections(zarray_t *detections, zarray_t *poly0, zarray_t *poly1 retry0: ; } } - -zarray_t *apriltag_detector_detect(apriltag_detector_t *td, image_u8_t *im_orig) -{ - if (zarray_size(td->tag_families) == 0) { - zarray_t *s = zarray_create(sizeof(apriltag_detection_t*)); - debug_print("No tag families enabled\n"); - return s; - } - - if (td->wp == NULL || td->nthreads != workerpool_get_nthreads(td->wp)) { - workerpool_destroy(td->wp); - td->wp = workerpool_create(td->nthreads); - if (td->wp == NULL) { - // creating workerpool failed - return empty zarray - return zarray_create(sizeof(apriltag_detection_t*)); - } - } - - timeprofile_clear(td->tp); - timeprofile_stamp(td->tp, "init"); - - /////////////////////////////////////////////////////////// - // Step 1. Detect quads according to requested image decimation - // and blurring parameters. - image_u8_t *quad_im = im_orig; - if (td->quad_decimate > 1) { - quad_im = image_u8_decimate(im_orig, td->quad_decimate); - - timeprofile_stamp(td->tp, "decimate"); - } - - if (td->quad_sigma != 0) { - // compute a reasonable kernel width by figuring that the - // kernel should go out 2 std devs. - // - // max sigma ksz - // 0.499 1 (disabled) - // 0.999 3 - // 1.499 5 - // 1.999 7 - - float sigma = fabsf((float) td->quad_sigma); - - int ksz = 4 * sigma; // 2 std devs in each direction - if ((ksz & 1) == 0) - ksz++; - - if (ksz > 1) { - - if (td->quad_sigma > 0) { - // Apply a blur - image_u8_gaussian_blur(quad_im, sigma, ksz); - } else { - // SHARPEN the image by subtracting the low frequency components. - image_u8_t *orig = image_u8_copy(quad_im); - image_u8_gaussian_blur(quad_im, sigma, ksz); - - for (int y = 0; y < orig->height; y++) { - for (int x = 0; x < orig->width; x++) { - int vorig = orig->buf[y*orig->stride + x]; - int vblur = quad_im->buf[y*quad_im->stride + x]; - - int v = 2*vorig - vblur; - if (v < 0) - v = 0; - if (v > 255) - v = 255; - - quad_im->buf[y*quad_im->stride + x] = (uint8_t) v; - } - } - image_u8_destroy(orig); - } - } - } - - timeprofile_stamp(td->tp, "blur/sharp"); - - if (td->debug) - image_u8_write_pnm(quad_im, "debug_preprocess.pnm"); - - zarray_t *quads = apriltag_quad_thresh(td, quad_im); - - // adjust centers of pixels so that they correspond to the - // original full-resolution image. - if (td->quad_decimate > 1) { - for (int i = 0; i < zarray_size(quads); i++) { - struct quad *q; - zarray_get_volatile(quads, i, &q); - - for (int j = 0; j < 4; j++) { - if (td->quad_decimate == 1.5) { - q->p[j][0] *= td->quad_decimate; - q->p[j][1] *= td->quad_decimate; - } else { - q->p[j][0] = (q->p[j][0] - 0.5)*td->quad_decimate + 0.5; - q->p[j][1] = (q->p[j][1] - 0.5)*td->quad_decimate + 0.5; - } - } - } - } - - if (quad_im != im_orig) - image_u8_destroy(quad_im); - - zarray_t *detections = zarray_create(sizeof(apriltag_detection_t*)); - - td->nquads = zarray_size(quads); - - timeprofile_stamp(td->tp, "quads"); - - if (td->debug) { - image_u8_t *im_quads = image_u8_copy(im_orig); - image_u8_darken(im_quads); - image_u8_darken(im_quads); - - srandom(0); - - for (int i = 0; i < zarray_size(quads); i++) { - struct quad *quad; - zarray_get_volatile(quads, i, &quad); - - const int bias = 100; - int color = bias + (random() % (255-bias)); - - image_u8_draw_line(im_quads, quad->p[0][0], quad->p[0][1], quad->p[1][0], quad->p[1][1], color, 1); - image_u8_draw_line(im_quads, quad->p[1][0], quad->p[1][1], quad->p[2][0], quad->p[2][1], color, 1); - image_u8_draw_line(im_quads, quad->p[2][0], quad->p[2][1], quad->p[3][0], quad->p[3][1], color, 1); - image_u8_draw_line(im_quads, quad->p[3][0], quad->p[3][1], quad->p[0][0], quad->p[0][1], color, 1); - } - - image_u8_write_pnm(im_quads, "debug_quads_raw.pnm"); - image_u8_destroy(im_quads); - } - - //////////////////////////////////////////////////////////////// - // Step 2. Decode tags from each quad. - if (1) { - image_u8_t *im_samples = td->debug ? image_u8_copy(im_orig) : NULL; - - int chunksize = 1 + zarray_size(quads) / (APRILTAG_TASKS_PER_THREAD_TARGET * td->nthreads); - - struct quad_decode_task *tasks = malloc(sizeof(struct quad_decode_task)*(zarray_size(quads) / chunksize + 1)); - - int ntasks = 0; - for (int i = 0; i < zarray_size(quads); i+= chunksize) { - tasks[ntasks].i0 = i; - tasks[ntasks].i1 = imin(zarray_size(quads), i + chunksize); - tasks[ntasks].quads = quads; - tasks[ntasks].td = td; - tasks[ntasks].im = im_orig; - tasks[ntasks].detections = detections; - - tasks[ntasks].im_samples = im_samples; - - workerpool_add_task(td->wp, quad_decode_task, &tasks[ntasks]); - ntasks++; - } - - workerpool_run(td->wp); - - free(tasks); - - if (im_samples != NULL) { - image_u8_write_pnm(im_samples, "debug_samples.pnm"); - image_u8_destroy(im_samples); - } - } - - if (td->debug) { - image_u8_t *im_quads = image_u8_copy(im_orig); - image_u8_darken(im_quads); - image_u8_darken(im_quads); - - srandom(0); - - for (int i = 0; i < zarray_size(quads); i++) { - struct quad *quad; - zarray_get_volatile(quads, i, &quad); - - const int bias = 100; - int color = bias + (random() % (255-bias)); - - image_u8_draw_line(im_quads, quad->p[0][0], quad->p[0][1], quad->p[1][0], quad->p[1][1], color, 1); - image_u8_draw_line(im_quads, quad->p[1][0], quad->p[1][1], quad->p[2][0], quad->p[2][1], color, 1); - image_u8_draw_line(im_quads, quad->p[2][0], quad->p[2][1], quad->p[3][0], quad->p[3][1], color, 1); - image_u8_draw_line(im_quads, quad->p[3][0], quad->p[3][1], quad->p[0][0], quad->p[0][1], color, 1); - - } - - image_u8_write_pnm(im_quads, "debug_quads_fixed.pnm"); - image_u8_destroy(im_quads); - } - - timeprofile_stamp(td->tp, "decode+refinement"); - - //////////////////////////////////////////////////////////////// - // Step 3. Reconcile detections--- don't report the same tag more - // than once. (Allow non-overlapping duplicate detections.) - if (1) { - zarray_t *poly0 = g2d_polygon_create_zeros(4); - zarray_t *poly1 = g2d_polygon_create_zeros(4); - - reconcile_detections(detections, poly0, poly1); - - zarray_destroy(poly0); - zarray_destroy(poly1); - } - - timeprofile_stamp(td->tp, "reconcile"); - - //////////////////////////////////////////////////////////////// - // Produce final debug output - if (td->debug) { - - image_u8_t *darker = image_u8_copy(im_orig); - image_u8_darken(darker); - image_u8_darken(darker); - - // assume letter, which is 612x792 points. - FILE *f = fopen("debug_output.ps", "w"); - fprintf(f, "%%!PS\n\n"); - double scale = fmin(612.0/darker->width, 792.0/darker->height); - fprintf(f, "%f %f scale\n", scale, scale); - fprintf(f, "0 %d translate\n", darker->height); - fprintf(f, "1 -1 scale\n"); - postscript_image(f, darker); - - image_u8_destroy(darker); - - for (int i = 0; i < zarray_size(detections); i++) { - apriltag_detection_t *det; - zarray_get(detections, i, &det); - - float rgb[3]; - int bias = 100; - - for (int j = 0; j < 3; j++) { - rgb[j] = bias + (random() % (255-bias)); - } - - fprintf(f, "%f %f %f setrgbcolor\n", rgb[0]/255.0f, rgb[1]/255.0f, rgb[2]/255.0f); - fprintf(f, "%f %f moveto %f %f lineto %f %f lineto %f %f lineto %f %f lineto stroke\n", - det->p[0][0], det->p[0][1], - det->p[1][0], det->p[1][1], - det->p[2][0], det->p[2][1], - det->p[3][0], det->p[3][1], - det->p[0][0], det->p[0][1]); - } - - fprintf(f, "showpage\n"); - fclose(f); - } - - if (td->debug) { - image_u8_t *darker = image_u8_copy(im_orig); - image_u8_darken(darker); - image_u8_darken(darker); - - image_u8x3_t *out = image_u8x3_create(darker->width, darker->height); - for (int y = 0; y < im_orig->height; y++) { - for (int x = 0; x < im_orig->width; x++) { - out->buf[y*out->stride + 3*x + 0] = darker->buf[y*darker->stride + x]; - out->buf[y*out->stride + 3*x + 1] = darker->buf[y*darker->stride + x]; - out->buf[y*out->stride + 3*x + 2] = darker->buf[y*darker->stride + x]; - } - } - - image_u8_destroy(darker); - - for (int i = 0; i < zarray_size(detections); i++) { - apriltag_detection_t *det; - zarray_get(detections, i, &det); - - float rgb[3]; - int bias = 100; - - for (int j = 0; j < 3; j++) { - rgb[j] = bias + (random() % (255-bias)); - } - - for (int j = 0; j < 4; j++) { - int k = (j + 1) & 3; - image_u8x3_draw_line(out, - det->p[j][0], det->p[j][1], det->p[k][0], det->p[k][1], - (uint8_t[]) { rgb[0], rgb[1], rgb[2] }); - } - } - - image_u8x3_write_pnm(out, "debug_output.pnm"); - image_u8x3_destroy(out); - } - - // deallocate - if (td->debug) { - FILE *f = fopen("debug_quads.ps", "w"); - fprintf(f, "%%!PS\n\n"); - - image_u8_t *darker = image_u8_copy(im_orig); - image_u8_darken(darker); - image_u8_darken(darker); - - // assume letter, which is 612x792 points. - double scale = fmin(612.0/darker->width, 792.0/darker->height); - fprintf(f, "%f %f scale\n", scale, scale); - fprintf(f, "0 %d translate\n", darker->height); - fprintf(f, "1 -1 scale\n"); - - postscript_image(f, darker); - - image_u8_destroy(darker); - - for (int i = 0; i < zarray_size(quads); i++) { - struct quad *q; - zarray_get_volatile(quads, i, &q); - - float rgb[3]; - int bias = 100; - - for (int j = 0; j < 3; j++) { - rgb[j] = bias + (random() % (255-bias)); - } - - fprintf(f, "%f %f %f setrgbcolor\n", rgb[0]/255.0f, rgb[1]/255.0f, rgb[2]/255.0f); - fprintf(f, "%f %f moveto %f %f lineto %f %f lineto %f %f lineto %f %f lineto stroke\n", - q->p[0][0], q->p[0][1], - q->p[1][0], q->p[1][1], - q->p[2][0], q->p[2][1], - q->p[3][0], q->p[3][1], - q->p[0][0], q->p[0][1]); - } - - fprintf(f, "showpage\n"); - fclose(f); - } - - timeprofile_stamp(td->tp, "debug output"); - - for (int i = 0; i < zarray_size(quads); i++) { - struct quad *quad; - zarray_get_volatile(quads, i, &quad); - matd_destroy(quad->H); - matd_destroy(quad->Hinv); - } - - zarray_destroy(quads); - - zarray_sort(detections, detection_compare_function); - timeprofile_stamp(td->tp, "cleanup"); - - return detections; -} - - -// Call this method on each of the tags returned by apriltag_detector_detect -void apriltag_detections_destroy(zarray_t *detections) -{ - for (int i = 0; i < zarray_size(detections); i++) { - apriltag_detection_t *det; - zarray_get(detections, i, &det); - - apriltag_detection_destroy(det); - } - - zarray_destroy(detections); -} - -image_u8_t *apriltag_to_image(apriltag_family_t *fam, int idx) -{ - assert(fam != NULL); - assert(idx >= 0 && idx < fam->ncodes); - - uint64_t code = fam->codes[idx]; - - image_u8_t *im = image_u8_create(fam->total_width, fam->total_width); - - int white_border_width = fam->width_at_border + (fam->reversed_border ? 0 : 2); - int white_border_start = (fam->total_width - white_border_width)/2; - // Make 1px white border - for (int i = 0; i < white_border_width - 1; i += 1) { - im->buf[white_border_start*im->stride + white_border_start + i] = 255; - im->buf[(white_border_start + i)*im->stride + fam->total_width - 1 - white_border_start] = 255; - im->buf[(fam->total_width - 1 - white_border_start)*im->stride + white_border_start + i + 1] = 255; - im->buf[(white_border_start + 1 + i)*im->stride + white_border_start] = 255; - } - - int border_start = (fam->total_width - fam->width_at_border)/2; - for (int i = 0; i < fam->nbits; i++) { - if (code & (APRILTAG_U64_ONE << (fam->nbits - i - 1))) { - im->buf[(fam->bit_y[i] + border_start)*im->stride + fam->bit_x[i] + border_start] = 255; - } - } - return im; -} diff --git a/third_party/971apriltag/test.cc b/third_party/971apriltag/test.cc new file mode 100644 index 00000000..432389b6 --- /dev/null +++ b/third_party/971apriltag/test.cc @@ -0,0 +1,25 @@ +#include +#include + +// A simple CUDA kernel to verify the GPU compiler works +__global__ void testKernel() { + printf("Hello from the GPU! (Thread %d)\n", threadIdx.x); +} + +int main() { + std::cout << "Hello from the CPU (AArch64)!" << std::endl; + std::cout << "Hello from the CPU (AArch64)!" << std::endl; + + // Launch the kernel with 5 threads + testKernel<<<1, 5>>>(); + + // Check for errors and wait for the GPU to finish + cudaError_t err = cudaDeviceSynchronize(); + if (err != cudaSuccess) { + std::cout << "CUDA Error: " << cudaGetErrorString(err) << std::endl; + return 1; + } + + std::cout << "GPU execution finished successfully!" << std::endl; + return 0; +} diff --git a/toolchain.cmake b/toolchain.cmake new file mode 100644 index 00000000..6f5dafe6 --- /dev/null +++ b/toolchain.cmake @@ -0,0 +1,28 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +# Specify the cross-compilers +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +set(CMAKE_AR aarch64-linux-gnu-ar) +set(CMAKE_RANLIB aarch64-linux-gnu-ranlib) + +set(CMAKE_CROSSCOMPILING TRUE) + +set(TARGET_FS /l4t/targetfs) +set(CMAKE_SYSROOT "${TARGET_FS}") +set(CMAKE_FIND_ROOT_PATH "${TARGET_FS}") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(CMAKE_C_FLAGS "--sysroot=${CMAKE_SYSROOT} ${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS "--sysroot=${CMAKE_SYSROOT} ${CMAKE_CXX_FLAGS}") + +include_directories(SYSTEM ${TARGET_FS}/usr/local/include) +include_directories(SYSTEM /l4t/targetfs/usr/local/cuda-12.6/targets/aarch64-linux/include) + +set(CMAKE_CUDA_HOST_COMPILER aarch64-linux-gnu-g++) +set(CMAKE_CUDA_COMPILER /usr/local/cuda-12.6/bin/nvcc)