Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
f2c76b7
Add test and python script
rsasaki0109 Sep 4, 2025
7abe080
Fix RTK positioning: implement outlier rejection and geometric range …
rsasaki0109 Dec 1, 2025
a0d56ab
Implement self-contained RTK positioning library (zero RTKLIB depende…
rsasaki0109 Mar 23, 2026
cde72e6
Add RTKLIB comparison table to README
rsasaki0109 Mar 23, 2026
c411435
Fix CI: Eigen path on macOS, cppcheck paths, add trajectory plot tool
rsasaki0109 Mar 23, 2026
20affbb
Fix CI: use Eigen3::Eigen target for portable include paths
rsasaki0109 Mar 23, 2026
f6e77be
Add kinematic comparison plot to README
rsasaki0109 Mar 23, 2026
a7708e7
Add comprehensive development plan (PLAN.md)
rsasaki0109 Mar 23, 2026
73b4f78
Add UrbanNav comparison and expand tests
rsasaki0109 Mar 23, 2026
3c79555
Tighten Odaiba RTK outlier handling
rsasaki0109 Mar 23, 2026
2d726e4
Improve Odaiba interpolation handling
rsasaki0109 Mar 23, 2026
3e0463c
Promote Odaiba benchmark lead
rsasaki0109 Mar 23, 2026
6147b4e
Add gnss_solve CLI and refresh Odaiba reports
rsasaki0109 Mar 23, 2026
7a84b71
Expand GNSS tooling and refine Odaiba visuals
rsasaki0109 Mar 25, 2026
ced9e4c
Split Odaiba trajectory panels by solver
rsasaki0109 Mar 25, 2026
ab87ac9
Add numbered Odaiba figure panels
rsasaki0109 Mar 25, 2026
b974ea2
Declutter Odaiba comparison layout
rsasaki0109 Mar 25, 2026
061f0e8
Expand UBX live tooling and serial coverage
rsasaki0109 Mar 25, 2026
e6f9e5c
Complete GNSS toolchain parity groundwork
rsasaki0109 Mar 25, 2026
347d57f
Finalize non-GUI GNSS toolchain
rsasaki0109 Mar 26, 2026
b0ee893
Improve installed signoff UX
rsasaki0109 Mar 26, 2026
b34854a
Refresh README landing page
rsasaki0109 Mar 26, 2026
98219b6
Add shareable Odaiba social card
rsasaki0109 Mar 26, 2026
84a2129
Simplify Odaiba social visuals
rsasaki0109 Mar 26, 2026
a2b67ad
Refine Odaiba social card layout
rsasaki0109 Mar 26, 2026
f834d4c
Add feature overview card
rsasaki0109 Mar 26, 2026
2de129e
Fix feature overview card layout
rsasaki0109 Mar 26, 2026
ea85a0c
Tighten README image layouts
rsasaki0109 Mar 26, 2026
6141c59
Add status legend to Odaiba social card
rsasaki0109 Mar 26, 2026
9f51315
Polish Odaiba social card legend
rsasaki0109 Mar 26, 2026
26306d1
Refine Odaiba social card legend layout
rsasaki0109 Mar 26, 2026
7ff5aff
Adjust Odaiba social card spacing
rsasaki0109 Mar 26, 2026
99433bc
Relax Odaiba social card header spacing
rsasaki0109 Mar 26, 2026
285838c
Simplify README and expand dogfooding tests
rsasaki0109 Mar 26, 2026
f6dc479
Fix CI dependency setup and failure handling
rsasaki0109 Mar 26, 2026
976aa83
Fix ROS2 dependency gating for std_msgs
rsasaki0109 Mar 26, 2026
f14d86b
Add PPC dataset demo and stabilize CI data-dependent tests
rsasaki0109 Mar 26, 2026
028a984
Add benchmark references to README
rsasaki0109 Mar 26, 2026
69c8598
Install Python plotting deps in CI
rsasaki0109 Mar 26, 2026
e7f502e
Fix CI Python env and data-dependent CLI skips
rsasaki0109 Mar 26, 2026
5c88e64
Force macOS CI to use venv Python
rsasaki0109 Mar 26, 2026
9283356
Expand CLI regression coverage
rsasaki0109 Mar 27, 2026
99034a9
Document PR-based workflow for external references
rsasaki0109 Mar 27, 2026
cc76297
Refactor solver modules and harden live validation
rsasaki0109 Mar 27, 2026
ce32f78
Add local web UI and browser smoke tests
rsasaki0109 Mar 27, 2026
e6ffaaf
Add live realtime signoff and validation
rsasaki0109 Mar 28, 2026
682f105
Add live signoff metrics to web UI
rsasaki0109 Mar 28, 2026
62828c6
Optimize RTK AR path and add PPC RTKLIB checks
rsasaki0109 Mar 28, 2026
4b51d03
Tighten RTK validation and improve PPC Tokyo fixes
rsasaki0109 Mar 28, 2026
89d9a95
Add PPC RTK signoff and split RTK update stage
rsasaki0109 Mar 28, 2026
0ce61fe
Refactor RTK AR evaluation and add optional PPC CI signoff
rsasaki0109 Mar 28, 2026
5be69f2
Add MkDocs site and docs publishing workflow
rsasaki0109 Mar 28, 2026
06624a0
Polish docs visuals and configurable web docs link
rsasaki0109 Mar 28, 2026
43ad503
Promote inspect commands in README
rsasaki0109 Mar 29, 2026
745b1be
Publish upstream reference analyses
rsasaki0109 Mar 29, 2026
40bbfe7
Add PPP product tooling and visibility analysis
rsasaki0109 Mar 29, 2026
fc26757
Stabilize PPP kinematic signoff and surface visibility artifacts
rsasaki0109 Mar 29, 2026
a703af1
Add moving-base mode and demo5-style RTK guards
rsasaki0109 Mar 29, 2026
9b180b4
Add moving-base replay prep and Docker delivery
rsasaki0109 Mar 29, 2026
1d7a826
Expand RTK tuning and PPP product signoffs
rsasaki0109 Mar 29, 2026
a9daa5d
Fix CI stability and add moving-base plot previews
rsasaki0109 Mar 29, 2026
90bfaa7
Add artifact dashboards and PPP comparison gates
rsasaki0109 Mar 29, 2026
423412d
Expand web artifact views and PPP product checks
rsasaki0109 Mar 29, 2026
9707e20
Improve artifact browsing and moving-base history views
rsasaki0109 Mar 29, 2026
ad95cc2
Add PPP comparison artifacts to dashboards
rsasaki0109 Mar 30, 2026
54b648a
Add TOML configs for PPP, moving-base, and web workflows
rsasaki0109 Mar 30, 2026
6bb2873
Expand PPP product workflows and config-driven dashboards
rsasaki0109 Mar 30, 2026
101af1b
Add visibility, KML, SBF parser, serial port, ROS 2 GNSS driver
rsasaki0109 Mar 31, 2026
b4c956a
Refactor PPP CLAS and AR pipeline modules
rsasaki0109 Apr 1, 2026
f7d3cd9
Add CLAS PPP experiment lanes and promotion decisions
rsasaki0109 Apr 1, 2026
11901f0
Expand CLAS PPP phase-bias semantics experiments
rsasaki0109 Apr 2, 2026
1a4bcbf
expose corrected pseudoranges via preprocessEpoch API
rsasaki0109 Apr 5, 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
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.git
.github
.venv
build
site
output
__pycache__
*.pyc
*.pyo
*.swp
data
docs/site
tmp
42 changes: 42 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## Summary

- What changed?
- Why?

## Scope

- [ ] Single feature / single user-visible value
- [ ] No unrelated refactor mixed in
- [ ] No docs-only noise mixed into solver/protocol work

## External Reference

- Source repo used for comparison, if any:
- What was adopted here:
- What was intentionally not adopted:

## Validation

- [ ] `python3 tests/test_cli_tools.py`
- [ ] `python3 tests/test_benchmark_scripts.py`
- [ ] `python3 tests/test_packaging.py`
- [ ] `python3 tests/test_python_bindings.py -v`
- [ ] `python3 tests/test_ros2_node.py`
- [ ] `ctest --test-dir build --output-on-failure`

Focused checks run:

```bash
# paste focused commands here
```

## Sign-off / Benchmark Impact

- Added or updated sign-off:
- Affected dataset(s):
- Expected metric impact:

## Notes

- Risk:
- Follow-up PRs:
207 changes: 181 additions & 26 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ jobs:
build-and-test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
compiler: [gcc, clang]
Expand All @@ -18,67 +19,221 @@ jobs:
compiler: gcc

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Install dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y libeigen3-dev libgtest-dev cmake build-essential
sudo apt-get install -y libeigen3-dev libgtest-dev cmake build-essential python3-dev pybind11-dev python3-numpy python3-matplotlib
if [ "${{ matrix.compiler }}" = "clang" ]; then
sudo apt-get install -y clang
fi

- name: Install dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
brew install eigen googletest cmake
if [ "${{ matrix.compiler }}" = "clang" ]; then
brew install llvm
fi
brew install eigen googletest cmake pybind11 python
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install numpy matplotlib
echo "${GITHUB_WORKSPACE}/.venv/bin" >> "$GITHUB_PATH"

- name: Install docs dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: python3 -m pip install --user -r requirements-docs.txt

- name: Install docs dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
. .venv/bin/activate
python -m pip install -r requirements-docs.txt

- name: Configure CMake
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
export CC=clang
export CXX=clang++
fi
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON
cmake_args="-B build -DCMAKE_BUILD_TYPE=Release"
if [ "${{ matrix.os }}" = "macos-latest" ]; then
cmake_args="$cmake_args -DPython3_EXECUTABLE=${GITHUB_WORKSPACE}/.venv/bin/python"
fi
cmake ${cmake_args}

- name: Build
run: cmake --build build --config Release -j$(nproc)
run: cmake --build build --config Release --parallel

- name: Run tests
working-directory: build
run: ctest --output-on-failure

- name: Run examples
working-directory: build
- name: Docker smoke
if: matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
run: |
# Create test data directory
mkdir -p test_data
# Note: In real usage, you would add actual RINEX test files here
echo "Examples would run with real RINEX data"
docker build -t libgnsspp-ci .
docker run --rm libgnsspp-ci --help >/dev/null
docker run --rm libgnsspp-ci web --help >/dev/null
docker compose -f compose.yaml config >/dev/null

- name: Optional PPC RTK sign-off
if: matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
env:
GNSSPP_PPC_DATASET_ROOT: ${{ vars.GNSSPP_PPC_DATASET_ROOT }}
GNSSPP_RTKLIB_BIN: ${{ vars.GNSSPP_RTKLIB_BIN }}
run: |
if [ -z "${GNSSPP_PPC_DATASET_ROOT}" ] || [ ! -d "${GNSSPP_PPC_DATASET_ROOT}" ]; then
echo "PPC-Dataset root is unavailable; skipping PPC RTK sign-off."
exit 0
fi
mkdir -p output
python3 apps/gnss.py ppc-rtk-signoff \
--dataset-root "${GNSSPP_PPC_DATASET_ROOT}" \
--city nagoya \
--max-epochs 120 \
--summary-json output/ppc_nagoya_run1_rtk_summary.json
if [ -n "${GNSSPP_RTKLIB_BIN}" ] && [ -x "${GNSSPP_RTKLIB_BIN}" ]; then
python3 apps/gnss.py ppc-rtk-signoff \
--dataset-root "${GNSSPP_PPC_DATASET_ROOT}" \
--city tokyo \
--max-epochs 120 \
--rtklib-bin "${GNSSPP_RTKLIB_BIN}" \
--summary-json output/ppc_tokyo_run1_rtk_summary.json
else
echo "RTKLIB binary is unavailable; skipping Tokyo RTKLIB side-by-side sign-off."
fi

- name: Upload PPC sign-off summaries
if: always() && matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
uses: actions/upload-artifact@v4
with:
name: ppc-signoff-${{ matrix.os }}-${{ matrix.compiler }}
path: |
output/ppc_nagoya_run1_rtk_summary.json
output/ppc_tokyo_run1_rtk_summary.json
if-no-files-found: ignore

- name: Optional SCORPION moving-base sign-off
if: matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
env:
GNSSPP_SCORPION_MOVING_BASE_INPUT: ${{ vars.GNSSPP_SCORPION_MOVING_BASE_INPUT }}
GNSSPP_SCORPION_MOVING_BASE_URL: ${{ vars.GNSSPP_SCORPION_MOVING_BASE_URL }}
run: |
input_args=()
if [ -n "${GNSSPP_SCORPION_MOVING_BASE_INPUT}" ] && [ -e "${GNSSPP_SCORPION_MOVING_BASE_INPUT}" ]; then
input_args=(--input "${GNSSPP_SCORPION_MOVING_BASE_INPUT}")
elif [ -n "${GNSSPP_SCORPION_MOVING_BASE_URL}" ]; then
input_args=(--input-url "${GNSSPP_SCORPION_MOVING_BASE_URL}")
else
echo "SCORPION moving-base input is unavailable; skipping sign-off."
exit 0
fi
mkdir -p output
python3 apps/gnss.py scorpion-moving-base-signoff \
"${input_args[@]}" \
--summary-json output/scorpion_moving_base_summary.json \
--max-epochs 120 \
--require-matched-epochs-min 80 \
--require-fix-rate-min 90 \
--require-p95-baseline-error-max 0.20 \
--require-p95-heading-error-max 10 \
--require-realtime-factor-min 1.0

- name: Optional PPP products sign-off with MALIB comparison
if: matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
env:
GNSSPP_MALIB_BIN: ${{ vars.GNSSPP_MALIB_BIN }}
run: |
if [ -z "${GNSSPP_MALIB_BIN}" ] || [ ! -x "${GNSSPP_MALIB_BIN}" ]; then
echo "MALIB binary is unavailable; skipping PPP products comparison sign-off."
exit 0
fi
mkdir -p output
python3 apps/gnss.py ppp-products-signoff \
--profile kinematic \
--obs data/rover_kinematic.obs \
--base data/base_kinematic.obs \
--nav data/navigation_kinematic.nav \
--summary-json output/ppp_kinematic_products_summary.json \
--max-epochs 60 \
--malib-bin "${GNSSPP_MALIB_BIN}" \
--require-common-epoch-pairs-min 20 \
--require-ppp-solution-rate-min 100

- name: Generate dashboard artifacts
if: matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
run: |
mkdir -p output
python3 apps/gnss.py visibility \
--obs data/rover_static.obs \
--nav data/navigation_static.nav \
--csv output/visibility_static.csv \
--summary-json output/visibility_static_summary.json \
--max-epochs 5 \
--quiet
python3 apps/gnss.py visibility-plot output/visibility_static.csv output/visibility_static.png
python3 apps/gnss.py artifact-manifest --root . --output output/artifact_manifest.json

- name: Upload SCORPION moving-base artifacts
if: always() && matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
uses: actions/upload-artifact@v4
with:
name: scorpion-moving-base-${{ matrix.os }}-${{ matrix.compiler }}
path: |
output/scorpion_moving_base_summary.json
output/scorpion_moving_base/prepare_summary.json
output/scorpion_moving_base/products_summary.json
output/scorpion_moving_base/scorpion_moving_base.pos
output/scorpion_moving_base/scorpion_moving_base_matches.csv
output/scorpion_moving_base/scorpion_moving_base.png
output/scorpion_moving_base/reference.csv
if-no-files-found: ignore

- name: Upload PPP products comparison artifacts
if: always() && matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
uses: actions/upload-artifact@v4
with:
name: ppp-products-${{ matrix.os }}-${{ matrix.compiler }}
path: |
output/ppp_kinematic_products_summary.json
output/ppp_kinematic_products_solution.pos
output/ppp_kinematic_products_comparison.csv
output/ppp_kinematic_products_comparison.png
output/malib_ppp_kinematic_solution.pos
output/ppp_static_products_summary.json
output/ppp_static_products_solution.pos
output/ppp_static_products_comparison.csv
output/ppp_static_products_comparison.png
if-no-files-found: ignore

- name: Upload dashboard artifacts
if: always() && matrix.os == 'ubuntu-latest' && matrix.compiler == 'gcc'
uses: actions/upload-artifact@v4
with:
name: dashboard-artifacts-${{ matrix.os }}-${{ matrix.compiler }}
path: |
output/artifact_manifest.json
output/visibility_static_summary.json
output/visibility_static.csv
output/visibility_static.png
if-no-files-found: ignore

static-analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libeigen3-dev cppcheck clang-tidy
sudo apt-get install -y libeigen3-dev cppcheck

- name: Run cppcheck
run: |
cppcheck --enable=all --std=c++17 --suppress=missingIncludeSystem \
--suppress=unusedFunction --error-exitcode=1 include/

- name: Configure for clang-tidy
run: |
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

- name: Run clang-tidy
run: |
find include/ -name "*.hpp" | xargs clang-tidy -p build/
cppcheck --enable=warning,style --std=c++17 \
--suppress=missingIncludeSystem \
--suppress=unusedFunction \
--suppress=unmatchedSuppression \
-I include/ \
src/
51 changes: 51 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Docker

on:
push:
branches: [ main, develop ]
tags: [ "v*" ]
workflow_dispatch:

permissions:
contents: read
packages: write

jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/rsasaki0109/gnssplusplus-library
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha,format=short
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

- name: Build and push image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Loading
Loading