From 2c0bcbff97b13fd4e1df24d931d65ef67412b721 Mon Sep 17 00:00:00 2001 From: k Date: Thu, 26 Jan 2023 20:38:12 +0100 Subject: [PATCH 01/14] Add Dockerfile --- .github/workflows/docker.yaml | 59 +++++++++++++++++++++++++++++++++++ Dockerfile | 11 +++++++ requirements.in | 7 +++++ requirements.txt | 22 +++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 .github/workflows/docker.yaml create mode 100644 Dockerfile create mode 100644 requirements.in create mode 100644 requirements.txt diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml new file mode 100644 index 0000000..b8de647 --- /dev/null +++ b/.github/workflows/docker.yaml @@ -0,0 +1,59 @@ +name: docker build + +on: + push: + branches: + - "**" + tags: + - "**" + pull_request_target: + +permissions: + contents: read + packages: write + +jobs: + docker: + name: Publish Docker image + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Docker meta + id: docker_meta + uses: docker/metadata-action@v3.2.0 + with: + images: ghcr.io/${{ github.repository }} + flavor: | + latest=false + tags: | + type=ref,event=pr + type=ref,event=branch + type=sha,prefix=,format=long,event=branch + type=ref,event=tag + type=sha,prefix=,format=long,event=tag + type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Cache Docker layers + uses: actions/cache@v2.1.5 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + - name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1a4568a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11-slim +WORKDIR /app +COPY requirements.txt . +RUN apt-get update && \ + apt-get -y install gcc && \ + pip install --no-cache-dir -r requirements.txt && \ + rm -rf /var/lib/apt/lists/* +COPY . . +RUN python3 setup.py build_ext --inplace +COPY . . +ENTRYPOINT [ "python", "/app/mlat-server"] diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..39ba290 --- /dev/null +++ b/requirements.in @@ -0,0 +1,7 @@ +numpy +scipy +pykalman +python-graph-core +uvloop +ujson +Cython diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3965ac8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with python 3.10 +# To update, run: +# +# pip-compile +# +cython==0.29.33 + # via -r requirements.in +numpy==1.24.1 + # via + # -r requirements.in + # scipy +pykalman==0.9.5 + # via -r requirements.in +python-graph-core==1.8.2 + # via -r requirements.in +scipy==1.10.0 + # via -r requirements.in +ujson==5.7.0 + # via -r requirements.in +uvloop==0.17.0 + # via -r requirements.in From ae6d099b267219511743e700b57314c0c6960229 Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 3 Mar 2023 14:53:08 +0100 Subject: [PATCH 02/14] Fix AGPL link --- mlat/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlat/config.py b/mlat/config.py index 1eb2e2a..bb54c20 100644 --- a/mlat/config.py +++ b/mlat/config.py @@ -29,7 +29,7 @@ # # Please remember that this needs to be _the code that the server is running_. # -AGPL_SERVER_CODE_URL = "https://github.com/wiedehopf/mlat-server" +AGPL_SERVER_CODE_URL = "https://github.com/katlol/mlat-server" # minimum NUCp value to accept as a sync message MIN_NUC = 6 From ba465c5f39a9fba4dcebe6fd882d448d2e3e726c Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 13 Apr 2023 01:18:21 +0200 Subject: [PATCH 03/14] Update requirements --- requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 3965ac8..7c0cef9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,12 @@ # -# This file is autogenerated by pip-compile with python 3.10 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: # # pip-compile # -cython==0.29.33 +cython==0.29.34 # via -r requirements.in -numpy==1.24.1 +numpy==1.24.2 # via # -r requirements.in # scipy @@ -14,7 +14,7 @@ pykalman==0.9.5 # via -r requirements.in python-graph-core==1.8.2 # via -r requirements.in -scipy==1.10.0 +scipy==1.10.1 # via -r requirements.in ujson==5.7.0 # via -r requirements.in From e4986fad7e97e1aaf6090a24df8cf9abe4726ac2 Mon Sep 17 00:00:00 2001 From: Katia Esposito <1695469+katlol@users.noreply.github.com> Date: Sat, 15 Apr 2023 13:14:23 +0200 Subject: [PATCH 04/14] Update docker.yaml --- .github/workflows/docker.yaml | 89 ++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index b8de647..2411332 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -3,9 +3,9 @@ name: docker build on: push: branches: - - "**" + - "**" tags: - - "**" + - "**" pull_request_target: permissions: @@ -17,43 +17,48 @@ jobs: name: Publish Docker image runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Docker meta - id: docker_meta - uses: docker/metadata-action@v3.2.0 - with: - images: ghcr.io/${{ github.repository }} - flavor: | - latest=false - tags: | - type=ref,event=pr - type=ref,event=branch - type=sha,prefix=,format=long,event=branch - type=ref,event=tag - type=sha,prefix=,format=long,event=tag - type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Login to GitHub Container Registry - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Cache Docker layers - uses: actions/cache@v2.1.5 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ steps.docker_meta.outputs.tags }} - labels: ${{ steps.docker_meta.outputs.labels }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + - name: Checkout + uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=schedule + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha,prefix=,format=long,event=tag + type=sha + type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + type=raw,value=${{ github.ref_name }}-${{ steps.vars.outputs.short_sha }}-${{ steps.vars.outputs.timestamp }},enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Cache Docker layers + uses: actions/cache@v2.1.5 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + push: true + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + platforms: linux/amd64,linux/arm64,linux/arm/v7 From 1c826ba1b231b4a7b1eacd6b7e36e8c9f055a8ba Mon Sep 17 00:00:00 2001 From: Katia Esposito <1695469+katlol@users.noreply.github.com> Date: Sat, 15 Apr 2023 13:20:47 +0200 Subject: [PATCH 05/14] Update docker.yaml --- .github/workflows/docker.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 2411332..d46bc10 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -22,7 +22,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Docker meta - id: meta + id: docker_meta uses: docker/metadata-action@v4 with: images: ghcr.io/${{ github.repository }} From 3b070fff0b7980dc9a1874562bf5be4493edfe60 Mon Sep 17 00:00:00 2001 From: Katia Esposito <1695469+katlol@users.noreply.github.com> Date: Sat, 15 Apr 2023 14:46:43 +0200 Subject: [PATCH 06/14] Update docker.yaml --- .github/workflows/docker.yaml | 39 ++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index d46bc10..4edede3 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -1,12 +1,16 @@ name: docker build on: + schedule: + - cron: "0 10 * * *" push: branches: - "**" tags: - - "**" - pull_request_target: + - "v*.*.*" + pull_request: + branches: + - "master" permissions: contents: read @@ -14,13 +18,17 @@ permissions: jobs: docker: - name: Publish Docker image runs-on: ubuntu-latest + permissions: + packages: write steps: + - name: Set variables useful for later + id: useful_vars + run: |- + echo "::set-output name=timestamp::$(date +%s)" + echo "::set-output name=short_sha::${GITHUB_SHA::8}" - name: Checkout - uses: actions/checkout@v2 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: actions/checkout@v3 - name: Docker meta id: docker_meta uses: docker/metadata-action@v4 @@ -36,29 +44,32 @@ jobs: type=sha,prefix=,format=long,event=tag type=sha type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} - type=raw,value=${{ github.ref_name }}-${{ steps.vars.outputs.short_sha }}-${{ steps.vars.outputs.timestamp }},enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + type=raw,value=${{ github.ref_name }}-${{ steps.useful_vars.outputs.short_sha }}-${{ steps.useful_vars.outputs.timestamp }},enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Login to GitHub Container Registry - uses: docker/login-action@v1 + uses: docker/setup-buildx-action@v2 + - name: Login to GHCR + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Cache Docker layers - uses: actions/cache@v2.1.5 + uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: Build and push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . - push: true + push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache,mode=max - platforms: linux/amd64,linux/arm64,linux/arm/v7 From 3f77ec229f190b9c62682462265886fe266e27dd Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 4 Jul 2023 21:57:01 +0200 Subject: [PATCH 07/14] coordinator: Do not write coordinates to file --- mlat/coordinator.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mlat/coordinator.py b/mlat/coordinator.py index 7d59205..1bda767 100644 --- a/mlat/coordinator.py +++ b/mlat/coordinator.py @@ -421,10 +421,6 @@ def _write_state(self): 'user': r.user, 'uid': r.uid, 'uuid': r.uuid, - 'coords': "{0:.6f},{1:.6f}".format(r.position_llh[0], r.position_llh[1]), - 'lat': r.position_llh[0], - 'lon': r.position_llh[1], - 'alt': r.position_llh[2], 'privacy': r.privacy, 'connection': r.connection_info, 'source_ip': r.connection.source_ip, From a4825ae779509e147f7836d13d750f0361c0f49c Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 4 Jul 2023 21:59:40 +0200 Subject: [PATCH 08/14] Update requirements --- requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7c0cef9..56ecd0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile # -cython==0.29.34 +cython==0.29.36 # via -r requirements.in -numpy==1.24.2 +numpy==1.25.0 # via # -r requirements.in # scipy @@ -14,9 +14,9 @@ pykalman==0.9.5 # via -r requirements.in python-graph-core==1.8.2 # via -r requirements.in -scipy==1.10.1 +scipy==1.11.1 # via -r requirements.in -ujson==5.7.0 +ujson==5.8.0 # via -r requirements.in uvloop==0.17.0 # via -r requirements.in From 494c2daf50a22d58454dcd633d9f9df6df7709cf Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 14 Jul 2023 12:09:31 +0200 Subject: [PATCH 09/14] Update requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 56ecd0a..c61544c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ # cython==0.29.36 # via -r requirements.in -numpy==1.25.0 +numpy==1.25.1 # via # -r requirements.in # scipy From 5b2de2d6ec7237f623118eb14e497d152f07c528 Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 20 Jul 2023 21:08:12 +0200 Subject: [PATCH 10/14] Upgrade to cython 3.0.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c61544c..7258bd7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ # # pip-compile # -cython==0.29.36 +cython==3.0.0 # via -r requirements.in numpy==1.25.1 # via From b5a00415f5c32ca874e8f624296189aac31598e9 Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 20 Jul 2023 21:43:09 +0200 Subject: [PATCH 11/14] jsonclient: Debug handle_messages error --- mlat/jsonclient.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mlat/jsonclient.py b/mlat/jsonclient.py index 2a47097..2e6db9f 100644 --- a/mlat/jsonclient.py +++ b/mlat/jsonclient.py @@ -375,6 +375,10 @@ async def process_handshake(self): if self.compress is None: raise ValueError('No mutually usable compression type') + if self.handle_messages is None: + print(hs) # FIXME temporary debugging + raise ValueError('No handle_messages method. Why??') + lat = float(hs['lat']) if lat < -90 or lat > 90: raise ValueError('invalid latitude, should be -90 .. 90') From 9a6a5d60fd26bbc4bf25d262861923910a8df820 Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 20 Jul 2023 21:59:59 +0200 Subject: [PATCH 12/14] jsonclient: Handle handshake compress dependency --- mlat/jsonclient.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mlat/jsonclient.py b/mlat/jsonclient.py index 2e6db9f..8f85a89 100644 --- a/mlat/jsonclient.py +++ b/mlat/jsonclient.py @@ -340,6 +340,13 @@ async def process_handshake(self): if hs['version'] != 2 and hs['version'] != 3: raise ValueError('Unsupported version in handshake') + # If no compress key in hs, then the client is using an old version. see ya later! + if 'compress' not in hs.keys(): + raise ValueError('Unsupported: Missing compression') + # also, check against self._compression_methods + if not set(hs['compress']).issubset(set([c[0] for c in self._compression_methods])): + raise ValueError('Unsupported compression type, got: ' + str(hs)) + user = str(hs['user']) uuid = hs.get('uuid') @@ -376,7 +383,7 @@ async def process_handshake(self): raise ValueError('No mutually usable compression type') if self.handle_messages is None: - print(hs) # FIXME temporary debugging + print(hs) # FIXME temp raise ValueError('No handle_messages method. Why??') lat = float(hs['lat']) From b8d37b8ccf133b77b394feeacba9226b9648bec2 Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 20 Jul 2023 22:29:18 +0200 Subject: [PATCH 13/14] prometheus: Write to /run/mlat-server/metrics --- mlat/coordinator.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mlat/coordinator.py b/mlat/coordinator.py index 1bda767..65bd283 100644 --- a/mlat/coordinator.py +++ b/mlat/coordinator.py @@ -478,24 +478,24 @@ def _write_state(self): cpu_time_us_per_sec = round((cpu_time - self.last_cpu_time) * (1e6 / 15)) self.last_cpu_time = cpu_time try: - with open('/run/node_exporter/mlat-server.prom', 'w', encoding='utf-8') as f: - out = '' - out += 'mlat_server_cpu_ppm ' + str(cpu_time_us_per_sec) + '\n' - out += 'mlat_server_receivers ' + str(len(self.receivers)) + '\n' - out += 'mlat_server_ac_mlat ' + str(ac_count_mlat) + '\n' - out += 'mlat_server_ac_sync ' + str(ac_count_sync) + '\n' - out += 'mlat_server_ac_total ' + str(len(self.tracker.aircraft)) + '\n' - out += 'mlat_server_outlier_ppm ' + "{0:.0f}".format(total_outlier_percent * 1000) + '\n' - out += 'mlat_server_sync_points ' + "{0:.0f}".format(self.stats_sync_points / self.main_interval) + '\n' - out += 'mlat_server_sync_msgs ' + "{0:.0f}".format(self.stats_sync_msgs / self.main_interval) + '\n' - out += 'mlat_server_mlat_msgs ' + "{0:.0f}".format(self.stats_mlat_msgs / self.main_interval) + '\n' - out += 'mlat_server_valid_groups ' + "{0:.0f}".format(self.stats_valid_groups / self.main_interval) + '\n' - out += 'mlat_server_normalize_called ' + "{0:.0f}".format(self.stats_normalize / self.main_interval) + '\n' - out += 'mlat_server_solve_attempt ' + "{0:.0f}".format(self.stats_solve_attempt / self.main_interval) + '\n' - out += 'mlat_server_solve_success ' + "{0:.0f}".format(self.stats_solve_success / self.main_interval) + '\n' - out += 'mlat_server_solve_used ' + "{0:.0f}".format(self.stats_solve_used / self.main_interval) + '\n' - - f.write(out) + out = [ + 'mlat_server_cpu_ppm ' + str(cpu_time_us_per_sec) + '\n', + 'mlat_server_receivers ' + str(len(self.receivers)) + '\n', + 'mlat_server_ac_mlat ' + str(ac_count_mlat) + '\n', + 'mlat_server_ac_sync ' + str(ac_count_sync) + '\n', + 'mlat_server_ac_total ' + str(len(self.tracker.aircraft)) + '\n', + 'mlat_server_outlier_ppm ' + "{0:.0f}".format(total_outlier_percent * 1000) + '\n', + 'mlat_server_sync_points ' + "{0:.0f}".format(self.stats_sync_points / self.main_interval) + '\n', + 'mlat_server_sync_msgs ' + "{0:.0f}".format(self.stats_sync_msgs / self.main_interval) + '\n', + 'mlat_server_mlat_msgs ' + "{0:.0f}".format(self.stats_mlat_msgs / self.main_interval) + '\n', + 'mlat_server_valid_groups ' + "{0:.0f}".format(self.stats_valid_groups / self.main_interval) + '\n', + 'mlat_server_normalize_called ' + "{0:.0f}".format(self.stats_normalize / self.main_interval) + '\n', + 'mlat_server_solve_attempt ' + "{0:.0f}".format(self.stats_solve_attempt / self.main_interval) + '\n', + 'mlat_server_solve_success ' + "{0:.0f}".format(self.stats_solve_success / self.main_interval) + '\n', + 'mlat_server_solve_used ' + "{0:.0f}".format(self.stats_solve_used / self.main_interval) + '\n', + ] + with open('/run/mlat-server/metrics', 'w', encoding='utf-8') as f: + f.writelines(out) except OSError: pass except: From 9f903e426a0af9c5e44ce39067a9d0a54c3ceb05 Mon Sep 17 00:00:00 2001 From: Katia Esposito Date: Fri, 28 Jul 2023 00:12:16 +0200 Subject: [PATCH 14/14] Update solver.py --- mlat/solver.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/mlat/solver.py b/mlat/solver.py index d0870c7..58791b6 100644 --- a/mlat/solver.py +++ b/mlat/solver.py @@ -28,6 +28,7 @@ from mlat import geodesy, constants, profile from mlat import config +import numpy as np # The core of it all. Not very big, is it? # (Admittedly the entire least-squares solver is hidden within scipy..) @@ -36,7 +37,7 @@ def _residuals(x_guess, pseudorange_data, altitude, altitude_error): - """Return an array of residuals for a position guess at x_guess versus + """Return the sum of squared residuals for a position guess at x_guess versus actual measurements pseudorange_data and altitude.""" (*position_guess, offset) = x_guess @@ -53,7 +54,8 @@ def _residuals(x_guess, pseudorange_data, altitude, altitude_error): _, _, altitude_guess = geodesy.ecef2llh(position_guess) res.append((altitude - altitude_guess) / altitude_error) - return res + # return the sum of squared residuals + return np.sum(np.array(res)**2) @profile.trackcpu @@ -91,19 +93,19 @@ def solve(measurements, altitude, altitude_error, initial_guess): math.sqrt(variance) * constants.Cair) for receiver, timestamp, variance in measurements] x_guess = [initial_guess[0], initial_guess[1], initial_guess[2], 0.0] - x_est, cov_x, infodict, mesg, ler = scipy.optimize.leastsq( + res = scipy.optimize.minimize( _residuals, x_guess, args=(pseudorange_data, altitude, altitude_error), - full_output=True, - maxfev=config.SOLVER_MAXFEV) + method='BFGS', + options={'maxiter': config.SOLVER_MAXFEV}) - if ler in (1, 2, 3, 4): + if res.success: #glogger.info("solver success: {0} {1}".format(ler, mesg)) # Solver found a result. Validate that it makes # some sort of physical sense. - (*position_est, offset_est) = x_est + (*position_est, offset_est) = res.x if offset_est < 0 or offset_est > 500e3: #glogger.info("solver: bad offset: {0}".formaT(offset_est)) @@ -118,10 +120,10 @@ def solve(measurements, altitude, altitude_error, initial_guess): # #glogger.info("solver: bad range: {0}".format(d)) # return None - if cov_x is None: + if res.hess_inv is None: return position_est, None else: - return position_est, cov_x[0:3, 0:3] + return position_est, res.hess_inv[0:3, 0:3] else: # Solver failed