diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..05ae7e27
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,40 @@
+name: build-modules
+on:
+ workflow_dispatch: # allows manual triggering
+ push:
+ pull_request:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ - name: Install Nix
+ uses: DeterminateSystems/nix-installer-action@main
+ - name: Setup CI binary cache
+ uses: DeterminateSystems/magic-nix-cache-action@main
+ - name: Launch Nix development environment and build Nix package manifests
+ run: cd ..;
+ git clone https://github.com/ArcturusNavigation/arcturus_nix;
+ cd arcturus_nix;
+ chmod +x *.sh;
+ chmod +x ci/*.sh;
+ ci/pull.sh;
+ cp -r ../all_seaing_vehicle dev_ws/src/;
+ nix develop -i --accept-flake-config --keep HOME --command bash -c "./build.sh;";
+ - name: Build modules and run nodes
+ run: cd ../arcturus_nix;
+ nix develop -i --accept-flake-config --keep HOME --command bash -c "
+ ci/run.sh all_seaing_autonomy;
+ ci/run.sh all_seaing_bringup;
+ ci/run.sh all_seaing_common;
+ ci/run.sh all_seaing_controller;
+ ci/run.sh all_seaing_description;
+ ci/run.sh all_seaing_driver;
+ ci/run.sh all_seaing_interfaces;
+ ci/run.sh all_seaing_navigation;
+ ci/run.sh all_seaing_perception;
+ ci/run.sh all_seaing_rviz_plugins;
+ ci/run.sh all_seaing_utility;
+ "
diff --git a/.gitignore b/.gitignore
index 1464170e..c8774b01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,3 +50,7 @@ bag/
# Vim related
.swp
+
+# Nix related
+# ignore package.nix in favor of package.xml
+package.nix
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..74ae61c1
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,1097 @@
+# DO NOT MODIFY
+# This file was generated by git-hooks.nix
+{
+ "default_stages": [
+ "pre-commit"
+ ],
+ "repos": [
+ {
+ "hooks": [
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/5kgv7i5c4m2nb66gdvgyp6dwx26gn573-actionlint-1.7.3/bin/actionlint",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "^.github/workflows/",
+ "id": "actionlint",
+ "language": "system",
+ "name": "actionlint",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "yaml"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/75a424xwjywfbi22jmihpf6n01c7wvqd-bats-with-libraries-1.11.0/bin/bats -p",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "bats",
+ "language": "system",
+ "name": "bats",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "shell"
+ ],
+ "types_or": [
+ "bats",
+ "bash"
+ ],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-builtin-literals",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-builtin-literals",
+ "language": "system",
+ "name": "check-builtin-literals",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-case-conflict",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-case-conflicts",
+ "language": "system",
+ "name": "check-case-conflicts",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-docstring-first",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-docstring-first",
+ "language": "system",
+ "name": "check-docstring-above",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-executables-have-shebangs",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-executables-have-shebangs",
+ "language": "system",
+ "name": "check-executables-have-shebangs",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit",
+ "pre-push",
+ "manual"
+ ],
+ "types": [
+ "text",
+ "executable"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-json",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-json",
+ "language": "system",
+ "name": "check-json",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "json"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-merge-conflict",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-merge-conflicts",
+ "language": "system",
+ "name": "check-merge-conflicts",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-ast",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-python",
+ "language": "system",
+ "name": "check-python",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-shebang-scripts-are-executable",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-shebang-scripts-are-executable",
+ "language": "system",
+ "name": "check-shebang-scripts-are-executable",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit",
+ "pre-push",
+ "manual"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-symlinks",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-symlinks",
+ "language": "system",
+ "name": "check-symlinks",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "symlink"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-toml",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-toml",
+ "language": "system",
+ "name": "check-toml",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "toml"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-vcs-permalinks",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-vcs-permalinks",
+ "language": "system",
+ "name": "check-vcs-permalinks",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-xml",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-xml",
+ "language": "system",
+ "name": "check-xml",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "xml"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/check-yaml --multi",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "check-yaml",
+ "language": "system",
+ "name": "check-yaml",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "yaml"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/c4vp5xwlr38137nz4378axmrx53iprcz-checkmake-0.2.2/bin/checkmake",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "checkmake",
+ "language": "system",
+ "name": "checkmake",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "makefile"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/m10gp15s4yykb801p5y2yja6vsi8d3zy-clang-tools-19.1.1/bin/clang-format -style=file -i",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "clang-format",
+ "language": "system",
+ "name": "clang-format",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [
+ "c",
+ "c++",
+ "c#",
+ "cuda",
+ "java",
+ "javascript",
+ "json",
+ "objective-c",
+ "proto"
+ ],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/m10gp15s4yykb801p5y2yja6vsi8d3zy-clang-tools-19.1.1/bin/clang-tidy --fix",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "clang-tidy",
+ "language": "system",
+ "name": "clang-tidy",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [
+ "c",
+ "c++",
+ "c#",
+ "objective-c"
+ ],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/zlpxba0ak7rnx1y08xk4sdfx7cj14g05-cmake-format-0.6.13/bin/cmake-format --check ",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.cmake$|CMakeLists.txt",
+ "id": "cmake-format",
+ "language": "system",
+ "name": "cmake-format",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/k99hw9kchph0ssyndvqkcq3fwwnjgwsx-python3.12-commitizen-3.30.0/bin/cz check --allow-abort --commit-msg-file",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "commitizen",
+ "language": "system",
+ "name": "commitizen check",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "commit-msg"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/9s0qd3xlb8la3pnsym6qdq1dk6lmjzc5-deadnix-1.2.1/bin/deadnix --fail",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.nix$",
+ "id": "deadnix",
+ "language": "system",
+ "name": "deadnix",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/end-of-file-fixer",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "end-of-file-fixer",
+ "language": "system",
+ "name": "end-of-file-fixer",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/fix-byte-order-marker",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "fix-byte-order-marker",
+ "language": "system",
+ "name": "fix-byte-order-marker",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/fix-encoding-pragma",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "fix-encoding-pragma",
+ "language": "system",
+ "name": "fix-encoding-pragma",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/forbid-new-submodules",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "forbid-new-submodules",
+ "language": "system",
+ "name": "forbid-new-submodules",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "directory"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/8119zq9gykvzpcsshl43q3gfmvg1lyvs-hadolint-2.12.0/bin/hadolint",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "Dockerfile$",
+ "id": "hadolint",
+ "language": "system",
+ "name": "hadolint",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/mf0i6ws7a9vd4b37mihawjqhbj23vsnr-headache-stripped/bin/headache -h .header",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "(\\.ml[ily]?$)|(\\.fmli?$)|(\\.[chy]$)|(\\.tex$)|(Makefile)|(README)|(LICENSE)",
+ "id": "headache",
+ "language": "system",
+ "name": "headache",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/qylrvbizjnjqqkg89nvpflzkjagy98fn-python3.12-isort-5.13.2/bin/isort ",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "isort",
+ "language": "system",
+ "name": "isort",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file",
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/rsfdr721vkmcfbkb8ws75nyfghxyg3sr-markdownlint-cli-0.42.0/bin/markdownlint -c /nix/store/av4n7qmbh20030zxra404r99jwcg0aln-markdownlint.json",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.md$",
+ "id": "markdownlint",
+ "language": "system",
+ "name": "markdownlint",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/8rig09anr1vl2sc7ryhjb7pm3c9742a6-precommit-mdsh",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.md$",
+ "id": "mdsh",
+ "language": "system",
+ "name": "mdsh",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/mixed-line-ending",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "mixed-line-endings",
+ "language": "system",
+ "name": "mixed-line-endings",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/ksx2k09xxnpid0rvnsds7ka7zfwp8g8h-python3.12-mypy-1.11.2/bin/mypy",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.py$",
+ "id": "mypy",
+ "language": "system",
+ "name": "mypy",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/tests_should_end_in_test.py",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "(^|/)tests/.+\\.py$",
+ "id": "name-tests-test",
+ "language": "system",
+ "name": "mypy",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/rkgj11yr9y25m10jzwj7ixdn6h1w3p1z-precommit-nil",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.nix$",
+ "id": "nil",
+ "language": "system",
+ "name": "nil",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/lnpz4yysm5srb6yls9inw281rv981p8q-nixfmt-unstable-2024-08-16/bin/nixfmt ",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.nix$",
+ "id": "nixfmt-rfc-style",
+ "language": "system",
+ "name": "nixfmt-rfc-style",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/vaqkwld0yqj860kbp89fs0x4y6m7y5sw-pyright-1.1.382/bin/pyright",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.py$",
+ "id": "pyright",
+ "language": "system",
+ "name": "pyright",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/debug-statement-hook",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "python-debug-statements",
+ "language": "system",
+ "name": "python-debug-statements",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/sa74s7yp8mj78vqygvqn9z57d8w0m2s4-python3.12-pyupgrade-3.15.0/bin/pyupgrade",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "pyupgrade",
+ "language": "system",
+ "name": "pyupgrade",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/k1gvqsawi5q0xjyw0izdws1w0vwraj81-python3.12-ruff-0.7.2-bin/bin/ruff check --fix",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "ruff",
+ "language": "system",
+ "name": "ruff",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/k1gvqsawi5q0xjyw0izdws1w0vwraj81-python3.12-ruff-0.7.2-bin/bin/ruff format",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "ruff-format",
+ "language": "system",
+ "name": "ruff-format",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "python"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/n08cbsh7ns3836dbblby89gxwd1sjwvc-shfmt-3.10.0/bin/shfmt -w -l -s",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "shfmt",
+ "language": "system",
+ "name": "shfmt",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "shell"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/requirements-txt-fixer",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.*(requirements|constraints)\\.*\\.txt$",
+ "id": "sort-requirements-txt",
+ "language": "system",
+ "name": "sort-requirements.txt",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/gc7n02slbbxm7ix8x4l1i8lzfr779zza-statix-0.5.8/bin/statix check --format errfmt",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "\\.nix$",
+ "id": "statix",
+ "language": "system",
+ "name": "statix",
+ "pass_filenames": false,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/p4nig4rqhii5drvgf7x67x2cl2si53z0-tagref-1.10.0/bin/tagref",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "tagref",
+ "language": "system",
+ "name": "tagref",
+ "pass_filenames": false,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wyxj0lg2dkaylqdppybgc4rwisnmshxz-python3.12-pre-commit-hooks-4.6.0/bin/trailing-whitespace-fixer",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "trim-trailing-whitespace",
+ "language": "system",
+ "name": "trim-trailing-whitespace",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit",
+ "pre-push",
+ "manual"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/wvzmff9axk60csdk1d24rfb08fprg642-precommit-trufflehog",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "trufflehog",
+ "language": "system",
+ "name": "trufflehog",
+ "pass_filenames": false,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/rkna8qxnmwx8yalplxhcwm1lkx0xqjq0-typos-1.26.0/bin/typos ",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "typos",
+ "language": "system",
+ "name": "typos",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "text"
+ ],
+ "types_or": [],
+ "verbose": false
+ },
+ {
+ "always_run": false,
+ "args": [],
+ "entry": "/nix/store/7yk80d3f9744cbsrj6qyb42akri9v645-yamlfmt-0.14.0/bin/yamlfmt -lint -quiet",
+ "exclude": "^$",
+ "exclude_types": [],
+ "fail_fast": false,
+ "files": "",
+ "id": "yamlfmt",
+ "language": "system",
+ "name": "yamlfmt",
+ "pass_filenames": true,
+ "require_serial": false,
+ "stages": [
+ "pre-commit"
+ ],
+ "types": [
+ "file",
+ "yaml"
+ ],
+ "types_or": [],
+ "verbose": false
+ }
+ ],
+ "repo": "local"
+ }
+ ]
+}
diff --git a/all_seaing_bringup/launch/vehicle-nix-test.launch.py b/all_seaing_bringup/launch/vehicle-nix-test.launch.py
new file mode 100644
index 00000000..a55155b8
--- /dev/null
+++ b/all_seaing_bringup/launch/vehicle-nix-test.launch.py
@@ -0,0 +1,143 @@
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, OpaqueFunction
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+from launch.substitutions import LaunchConfiguration
+import launch_ros
+import os
+import yaml
+
+
+def launch_setup(context, *args, **kwargs):
+
+ bringup_prefix = get_package_share_directory("all_seaing_bringup")
+ driver_prefix = get_package_share_directory("all_seaing_driver")
+
+ robot_localization_params = os.path.join(
+ bringup_prefix, "config", "localization", "localize_real.yaml"
+ )
+ locations_file = os.path.join(
+ bringup_prefix, "config", "localization", "locations.yaml"
+ )
+
+ location = context.perform_substitution(LaunchConfiguration("location"))
+
+ ekf_node = launch_ros.actions.Node(
+ package="robot_localization",
+ executable="ekf_node",
+ parameters=[robot_localization_params],
+ )
+
+ with open(locations_file, 'r') as f:
+ locations = yaml.safe_load(f)
+ lat = locations[location]["lat"]
+ lon = locations[location]["lon"]
+ navsat_node = launch_ros.actions.Node(
+ package="robot_localization",
+ executable="navsat_transform_node",
+ remappings=[("gps/fix", "/mavros/global_position/raw/fix")],
+ parameters=[
+ robot_localization_params,
+ {"datum": [lat, lon, 0.0]},
+ ],
+ )
+
+ controller_node = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="xdrive_controller.py",
+ parameters=[
+ {
+ "front_right_xy": [0.5, -0.5],
+ "back_left_xy": [-0.5, 0.5],
+ "front_left_xy": [0.5, 0.5],
+ "back_right_xy": [-0.5, -0.5],
+ "thruster_angle": 45.0,
+ "drag_constants": [5.0, 5.0, 40.0],
+ "output_range": [1100.0, 1900.0],
+ "smoothing_factor": 0.8,
+ }
+ ],
+ )
+
+ thrust_commander_node = launch_ros.actions.Node(
+ package="all_seaing_driver",
+ executable="thrust_commander.py",
+ parameters=[
+ {
+ "front_right_port": 2,
+ "front_left_port": 3,
+ "back_right_port": 4,
+ "back_left_port": 5,
+ }
+ ],
+ )
+
+ control_mux = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="control_mux.py",
+ )
+
+ controller_server = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="controller_server.py",
+ parameters=[
+ {"global_frame_id": "odom"},
+ {"Kpid_x": [1.0, 0.0, 0.0]},
+ {"Kpid_y": [1.0, 0.0, 0.0]},
+ {"Kpid_theta": [1.0, 0.0, 0.0]},
+ {"max_vel": [2.0, 1.0, 0.8]},
+ ],
+ output="screen",
+ )
+
+ rviz_waypoint_sender = launch_ros.actions.Node(
+ package="all_seaing_navigation",
+ executable="rviz_waypoint_sender.py",
+ parameters=[
+ {"xy_threshold": 1.0},
+ {"theta_threshold": 5.0},
+ ],
+ output="screen",
+ )
+
+ lidar_ld = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(
+ [
+ driver_prefix,
+ "/launch/32e_points.launch.py",
+ ]
+ )
+ )
+
+ mavros_ld = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(
+ [
+ driver_prefix,
+ "/launch/mavros.launch.py",
+ ]
+ ),
+ launch_arguments={
+ "port": "/dev/ttyACM0",
+ }.items(),
+ )
+
+ return [
+ ekf_node,
+ navsat_node,
+ control_mux,
+ controller_node,
+ controller_server,
+ rviz_waypoint_sender,
+ thrust_commander_node,
+ mavros_ld,
+ lidar_ld
+ ]
+
+
+def generate_launch_description():
+ return LaunchDescription(
+ [
+ DeclareLaunchArgument("location", default_value="boathouse"),
+ OpaqueFunction(function=launch_setup),
+ ]
+ )
diff --git a/all_seaing_bringup/launch/vehicle-nix.launch.py b/all_seaing_bringup/launch/vehicle-nix.launch.py
new file mode 100644
index 00000000..c49c8b0e
--- /dev/null
+++ b/all_seaing_bringup/launch/vehicle-nix.launch.py
@@ -0,0 +1,150 @@
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, OpaqueFunction
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+from launch.substitutions import LaunchConfiguration
+import launch_ros
+import os
+import yaml
+
+
+def launch_setup(context, *args, **kwargs):
+
+ bringup_prefix = get_package_share_directory("all_seaing_bringup")
+ driver_prefix = get_package_share_directory("all_seaing_driver")
+
+ robot_localization_params = os.path.join(
+ bringup_prefix, "config", "localization", "localize_real.yaml"
+ )
+ locations_file = os.path.join(
+ bringup_prefix, "config", "localization", "locations.yaml"
+ )
+
+ location = context.perform_substitution(LaunchConfiguration("location"))
+
+ ekf_node = launch_ros.actions.Node(
+ package="robot_localization",
+ executable="ekf_node",
+ parameters=[robot_localization_params],
+ )
+
+ with open(locations_file, 'r') as f:
+ locations = yaml.safe_load(f)
+ lat = locations[location]["lat"]
+ lon = locations[location]["lon"]
+ navsat_node = launch_ros.actions.Node(
+ package="robot_localization",
+ executable="navsat_transform_node",
+ remappings=[("gps/fix", "/mavros/global_position/raw/fix")],
+ parameters=[
+ robot_localization_params,
+ {"datum": [lat, lon, 0.0]},
+ ],
+ )
+
+ controller_node = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="xdrive_controller.py",
+ parameters=[
+ {
+ "front_right_xy": [0.5, -0.5],
+ "back_left_xy": [-0.5, 0.5],
+ "front_left_xy": [0.5, 0.5],
+ "back_right_xy": [-0.5, -0.5],
+ "thruster_angle": 45.0,
+ "drag_constants": [5.0, 5.0, 40.0],
+ "output_range": [1100.0, 1900.0],
+ "smoothing_factor": 0.8,
+ }
+ ],
+ )
+
+ thrust_commander_node = launch_ros.actions.Node(
+ package="all_seaing_driver",
+ executable="thrust_commander.py",
+ parameters=[
+ {
+ "front_right_port": 2,
+ "front_left_port": 3,
+ "back_right_port": 4,
+ "back_left_port": 5,
+ }
+ ],
+ )
+
+ control_mux = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="control_mux.py",
+ )
+
+ controller_server = launch_ros.actions.Node(
+ package="all_seaing_controller",
+ executable="controller_server.py",
+ parameters=[
+ {"global_frame_id": "odom"},
+ {"Kpid_x": [1.0, 0.0, 0.0]},
+ {"Kpid_y": [1.0, 0.0, 0.0]},
+ {"Kpid_theta": [1.0, 0.0, 0.0]},
+ {"max_vel": [2.0, 1.0, 0.8]},
+ ],
+ output="screen",
+ )
+
+ rviz_waypoint_sender = launch_ros.actions.Node(
+ package="all_seaing_navigation",
+ executable="rviz_waypoint_sender.py",
+ parameters=[
+ {"xy_threshold": 1.0},
+ {"theta_threshold": 5.0},
+ ],
+ output="screen",
+ )
+
+ rover_lora_controller = launch_ros.actions.Node(
+ package="all_seaing_driver",
+ executable="rover_lora_controller.py",
+ output="screen",
+ )
+
+ lidar_ld = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(
+ [
+ driver_prefix,
+ "/launch/32e_points.launch.py",
+ ]
+ )
+ )
+
+ mavros_ld = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(
+ [
+ driver_prefix,
+ "/launch/mavros.launch.py",
+ ]
+ ),
+ launch_arguments={
+ "port": "/dev/ttyACM0",
+ }.items(),
+ )
+
+ return [
+ ekf_node,
+ navsat_node,
+ control_mux,
+ controller_node,
+ controller_server,
+ rviz_waypoint_sender,
+ rover_lora_controller,
+ thrust_commander_node,
+ lidar_ld,
+ mavros_ld
+ ]
+
+
+def generate_launch_description():
+ return LaunchDescription(
+ [
+ DeclareLaunchArgument("location", default_value="boathouse"),
+ OpaqueFunction(function=launch_setup),
+ ]
+ )
diff --git a/all_seaing_bringup/launch/vehicle-non-nix.launch.py b/all_seaing_bringup/launch/vehicle-non-nix.launch.py
new file mode 100644
index 00000000..574b3a98
--- /dev/null
+++ b/all_seaing_bringup/launch/vehicle-non-nix.launch.py
@@ -0,0 +1,31 @@
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, OpaqueFunction
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+
+
+def launch_setup(context, *args, **kwargs):
+
+ driver_prefix = get_package_share_directory("all_seaing_driver")
+
+ zed_ld = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(
+ [
+ driver_prefix,
+ "/launch/zed2i.launch.py",
+ ]
+ )
+ )
+
+ return [
+ zed_ld
+ ]
+
+
+def generate_launch_description():
+ return LaunchDescription(
+ [
+ DeclareLaunchArgument("location", default_value="boathouse"),
+ OpaqueFunction(function=launch_setup),
+ ]
+ )
diff --git a/all_seaing_perception/package.xml b/all_seaing_perception/package.xml
index 2bc9982b..b0a3e72e 100644
--- a/all_seaing_perception/package.xml
+++ b/all_seaing_perception/package.xml
@@ -28,6 +28,8 @@
std_msgs
visualization_msgs
+ python-ultralytics
+
ament_cmake