Difference between revisions of "OpenPlotter"

From wiki.bastelbude.grade.de
Jump to: navigation, search
(global install tilethief (as pi))
(tile server /w cache+proxy)
Line 576: Line 576:
 
** a 'raw' tile store /w deep /{z}/{x}/{y} directory structure might cause trouble on (sd-card driven) rasPIs ...
 
** a 'raw' tile store /w deep /{z}/{x}/{y} directory structure might cause trouble on (sd-card driven) rasPIs ...
  
=== global install tilethief (as pi)===
+
=== tiletief ===
 +
==== global install tilethief (as pi)====
 
* <code>$ sudo npm install -g tilethief</code>
 
* <code>$ sudo npm install -g tilethief</code>
 
* <code>cd /usr/lib/node_modules/tilethief</code>
 
* <code>cd /usr/lib/node_modules/tilethief</code>
Line 659: Line 660:
 
** serving tiles from disk is fast
 
** serving tiles from disk is fast
  
=== nginx + tilethief ===
+
==== nginx + tilethief ====
 
tilethiev does not serve tiles from cache while offline. ngix speeds up serving and works well offline.
 
tilethiev does not serve tiles from cache while offline. ngix speeds up serving and works well offline.
 
* <code>sudo apt install nginx</code>
 
* <code>sudo apt install nginx</code>
Line 802: Line 803:
 
** <strike>tileblaster hangs after short time</strike>
 
** <strike>tileblaster hangs after short time</strike>
 
** tileblaster compresses tiles (thus need to compress mobac tile, too)
 
** tileblaster compresses tiles (thus need to compress mobac tile, too)
 +
 +
=== nginx only ===
 +
* https://coderwall.com/p/--wgba/nginx-reverse-proxy-cache-for-openstreetmap
  
 
=== preload cache /w mobac tilestore ===
 
=== preload cache /w mobac tilestore ===

Revision as of 11:18, 7 May 2019

general

Aim

  • fit a cheap and open source ECDIS on board of a sailing vessel

analog

nmea0183

SeaTalkng network

  • em-trak B100 ( http://www.allaboutais.com/index.php/en/products/products-on-the-market )
    • PGN 129025 Position
    • PGN 129026 COG and SOG
    • NOT 129029 GNSS Position Data
  • autopilot control unit (Raymarine ACU-200)
  • autopilot sensor (Raymarine EV1)
    • PGN 127245 Rudder
    • PGN 127250 Vessel Heading
    • PGN 127251 Rate of Turn
    • PGN 127357 Attitude
  • autopilot instrument (Raymarine p70s)
    • PGN 127245 Rudder
    • PGN 127258 Magnetic Variation
  • battery monitor (Victron BMV-702, 'VE.Direct to NMEA2000 interface')
  • battery inverter/charger (Victron MultiPlus, 'VE.Bus to NMEA2000 interface')
  • Raymarine iTC-5 converter
    • sumlog (VDO, Model?)
    • depth sounder (Airmar, Model?)
    • optional: Raymarine M81105 rudder angle sensor
      • Red to Green: 5K Ohms (+/- 10%) steady
      • Red to Blue: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
      • Blue to Green: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
      • A 5K pot, probably wire wound, not particularly good precision ($10) packaged in a plastic moulding ($200), but typically very reliable
      • http://raymarine.ning.com/forum/topics/rudder-angle-indicator
  • Raymarine SeaTalk-SeaTalkng converter
    • instrument (ST70)
    • autopilot remote Raymarine A18106
    • wind & close hauled/VMG instrument (Raymarine Wind ST50 Plus)

Parts (boat specific)

  • Seatalkng extensions:
    • Spur-Kabel mit 1 offenen Ende 3m Art.-Nr: A06044 EUR 40,-
    • 5-Wege-Verbinder Art.-Nr: A06064 EUR 35,- (alternativ T-Stück Art.-Nr.: A06028 EUR 25,-)
    • Backbone-Kabel 0,40m - A06033 EUR 30,-

Mini-PC

  • Raspberry Pi 3 Model B EUR 33,50 or Raspberry Pi 3 Model B+ EUR 35,-
  • 16GB MicroSD Card EUR 10,-
  • PiCAN 2 EUR 45,- or PiCAN 2 incl. SMPS EUR 52,-

openPlotter

  • hardware
    • Raspberry Pi 3 Model B
    • PiCAN 2
  • eth0 IP set to static (192.168.1.112)

Setup Pi:

  • see also
  • connect to openplotter-UI (eg. VNC)
    • update openCPN
    • upgrade Raspbian
    • upgrade to openPlotter 0.17.1
    • Preferences > Raspberry Configuration > Interfaces > SSH:enable (Remote-access via WinSCP and Putty defaults pi:raspberry)
  • (sudo apt-get install tightvncserver (make RDP working))
  • sudo apt-get install can-utils
  • sudo apt-get install mc
  • update node
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt install nodejs
  • update signalk to latest
    • kill running signalk-server process
cd /home/pi/.config
rm -rf signalk-server-node_tmp
git clone https://github.com/SignalK/signalk-server-node.git signalk-server-node_tmp
cd signalk-server-node_tmp
npm install && npm run prepublishOnly
npm install mdns
cd /home/pi/.config
rm -rf signalk-server-node
mv signalk-server-node_tmp signalk-server-node
  • restart signalk @ openplotter-UI

Setup Android:

  • RDC from playStore (working)
  • aRDP free from playStore (suits my needs best)

Setup piCAN2:

  • (in case you want to play with virtual-can-interfaces) add to /etc/modules
vcan
  • add to /boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
source /etc/network/interfaces.d/*
  • add to /etc/network/interfaces/interfaces.d/can0
#physical can interfaces
allow-hotplug can0
iface can0 can static
bitrate 250000
down /sbin/ip link set $IFACE down
up /sbin/ifconfig $IFACE txqueuelen 10000
  • (in case you want to play with virtual-can-interfaces) add to /etc/network/interfaces/interfaces.d/vcan0
#virtual can interfaces
auto vcan0
iface vcan0 inet manual
pre-up /sbin/ip link add dev $IFACE type vcan
up /sbin/ifconfig $IFACE up
  • restart interfaces
service networking restart
  • check interfaces (can0 and vcan0)
ifconfig
  • install canboat
mkdir ~/canboat
cd ~/canboat
sudo apt-get install xsltproc
git clone git://github.com/canboat/canboat
cd canboat
sudo make
sudo make install
  • working admin-ui generated canboat sample
    {
      "id": "canboat",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": false
    }
  • not working admin-ui generated canboatjs sample
    {
      "id": "canboatjs",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus-canboatjs",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }
  • working canboatjs sample
    {                                                                           
      "id": "canbus-canboatjs",                                          
      "enabled": true,                                                          
      "pipeElements": [                                                         
        {                                                                       
          "type": "providers/canbus",                                           
          "options": {
            "canDevice": "vcan0"
          }                                                                     
        },                                                                      
        {                                                                       
          "type": "providers/canboatjs"                                         
        },                                                                      
        {                                                                       
          "type": "providers/n2k-signalk"                                       
        }                                                                       
      ]                                                                         
    }


  • old working canboat sample
{
  "id": "n2k-vcan0",
  "pipeElements": [
    {
      "type": "providers/execute",
      "options": {
        "command": "candump vcan0 | candump2analyzer "
      }
    },
    {
      "type": "providers/liner",
      "options": {
        "rawlogging": true,
        "logdir": "logs",
        "discriminator": "2"
      }
    },
    {
      "type": "providers/n2kAnalyzer"
    },
    {
      "type": "providers/n2k-signalk"
    }
  ]
}

configure kplex and signalk

  • 'Signal K Server Plugin Configuration' > activate 'Convert Signal K to NMEA0183'
    • select sentences you are interested in
  • NMEA0183 (this is kplex) > Advanced >
    • add input channel tcp:localhost:10110
    • remove filter at opencpn out channel
[tcp]
name=signalk_in
direction=in
address=localhost
port=10110

[tcp]
name=opencpn
direction=out
mode=server
port=10109

experimental

    {"pipeElements": [
      {"type": "providers/execute", "options": {"command": "candump can0 | candump2analyzer | analyzer -json -si -nv"}},
      {"type": "providers/liner"},
      {"type": "providers/from_json"},
      {"type": "signalk-socketcan-device", "options": {"n2kAddress": 110, "canDevice": "can0"}},
      {"type": "providers/n2k-signalk"}
      ],"id": "n2k-can0"
    }

blackBox

  • hardware
    • Raspberry Pi 3 Model B+
    • PiCAN 2 incl. SMPS
  • eth0 IP set to static (here 192.168.3.111)

setup Raspbian Stretch Lite

  • download Raspbian Stretch Lite and copy image to SD-card (Etcher or win32diskimager)
  • log in (hdmi) as pi:raspberry (us-keboard-layout!)
  • start sudo raspi-config
    • enable ssh
    • resize SD-card
    • set wifi locale
    • ...
    • reboot
  • connect via ssh or scp
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mc
  • enable root login over SSH
    • add to /etc/ssh/sshd_config
      PermitRootLogin yes
    • restart service
      sudo /etc/init.d/ssh restart
    • set root password
      sudo passwd root
  • set up static IP at /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.1.111/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

setup piCAN2 (as root)

  • install can-utils
apt-get update
apt-get install can-utils
  • add to /boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
  • add to /etc/modules
vcan
  • add to /etc/network/interfaces
source /etc/network/interfaces.d/*
  • add to /etc/network/interfaces/interfaces.d/can0
#physical can interfaces
allow-hotplug can0
iface can0 can static
bitrate 250000
down /sbin/ip link set $IFACE down
up /sbin/ifconfig $IFACE txqueuelen 10000
  • add to /etc/network/interfaces/interfaces.d/vcan0
#virtual can interfaces
auto vcan0
iface vcan0 inet manual
pre-up /sbin/ip link add dev $IFACE type vcan
up /sbin/ifconfig $IFACE up
  • install canboat
apt-get install xsltproc
apt-get install git
mkdir ~/canboat
cd ~/canboat
git clone git://github.com/canboat/canboat
cd canboat
make
make install

install signalK (as root)

apt-get update
apt-get install -y curl git build-essential dialog
curl -sL https://deb.nodesource.com/setup_8.x | bash -
apt-get install nodejs
apt-get install libnss-mdns avahi-utils libavahi-compat-libdnssd-dev
npm install -g --unsafe-perm signalk-server

setup signalK (as pi)

sudo signalk-server-setup
reboot
  • in your browser, start signalk-web-interface (eg. http://192.168.1.111:3000)
  • add admin-user via admin-ui and log-in (here admin:A****M**)
  • add canboat Data-Provider via Admin-UI (stored in home/pi/.signalk/settings.json )
    {
      "id": "canboat",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }
  • alternative add canboatjs Data-Provider via Admin-UI (stored in home/pi/.signalk/settings.json )
    {
      "id": "canboatjs",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus-canboatjs",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }

connect to signalk

signalk sandbox

signalk-server --sample-nmea0183-data

sudo systemctl stop signalk.service
sudo systemctl stop signalk.socket

sudo systemctl start signalk.service
sudo systemctl start signalk.socket

sudo systemctl disable signalk.service
sudo systemctl disable signalk.socket

sudo systemctl status signalk*

export DEBUG=signalk-server:udp-provider
export DEBUG=signalk-parser-nmea0183
./signalk-server

aisdispatcher

    {
      "id": "AIS-udp",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA0183",
            "subOptions": {
              "type": "udp",
              "port": "77777"
            }
          }
        }
      ],
      "enabled": true
    }

raymarine autopilot

samba

wifi AP (bridge)

wifi client and access-point

systemctl is-enabled hostapd
systemctl unmask hostapd
systemctl enable hostapd

wifi client and access-point (experimental)

tile server /w cache+proxy

draft

  • at home:
    • fetch an overview tile set of intended sailing area zoomlevels ~1-14 (/w mobac, preconfigured downloads, etc.) and preload cache
  • on board while connected to internet:
    • grab detailed tiles zoom 15-18 of intended approaches/anchorages via web app through proxy and cache
  • under way /wo internet connection:
    • sail using cached tiles
  • aim:
    • keep stress on tile servers low (do NOT download all possible tiles of zoom levels 15-18 at home)
  • drawback:
    • a 'raw' tile store /w deep /{z}/{x}/{y} directory structure might cause trouble on (sd-card driven) rasPIs ...

tiletief

global install tilethief (as pi)

  • $ sudo npm install -g tilethief
  • cd /usr/lib/node_modules/tilethief
  • edit tilethief.js
    • change line 302 and 319 mime.getType (instead of mime.lookup)
    • you might want to add some helper output:
      • ln 300 if (commander.verbose) logger.info("serving %s from cache", _tile_file);
      • ln 306 if (commander.verbose) logger.info("attempting to fetch %s", _tile_url);
      • ln 312 if (commander.verbose) logger.info("fetched %s", _tile_url);
  • mkdir data and chmod 777 data
  • edit config.js
module.exports = {

	/* express settings */
	"app": {
		"workers": 2,			// number of worker processes
		"proxied": true,		// trust x-forwarded-for header
		"env": "production",
		"socket": false,		// socket overrides hostname and port

		"port": 46000
	},

	/* lru tile cache */
	"cache": {
		"dir": "/home/pi/.tilethief/tiles",
		"files": 200000,
		"size": "2 GB",
		"age": "52 Weeks",
		"check": "1 Hour"
	},
	
	/* send heartbeats with nsa */
	// "heartbeat": "udp4://127.0.0.1:65432",

	/* load backends from url */
	"backend-url": false, // point this to a json with the contents of config.backends

	/* the tile backends */
	"backends": {
		"osm": {
			"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
			"filetypes": ["png"],
			"sub": ["a","b"],
			"zoom": [0,17],
			"boundaries": [-180, -90, 180, 90] // west, south, east, north
		},
		"openSeaMap": {
			"url": "http://t1.openseamap.org/seamark/{z}/{x}/{y}.png",
			"filetypes": ["png"],
			"sub": ["a","b"],
			"zoom": [0,17],
			"boundaries": [-180, -90, 180, 90] // west, south, east, north
		}
	},
	
	/* max number of concurrent connections to backend servers */
	"connections": 23,
	
	/* the default tile */
	"default-image": "assets/default-tile.png",
	
	/* allowed extensions */
	"allowed-extensions": ["png","jpg"],
	
	/* redirect users to this url when they try to access the index page */
	"redirect-url": false
	
};
  • run tilethief -v or DEBUG=tilethief node /usr/lib/node_modules/tilethief/tilethief.js
  • point your web browser to
    • 192.168.2.1:46000/osm/1/1/1.png
    • 192.168.2.1:46000/openSeaMap/14/8448/5366.png
  • systemd Service Unit
    • see /etc/systemd/system/tilethief.service
    • sudo systemctl enable tilethief.service
    • sudo systemctl start tilethief.service
  • conclusion:
    • fetching tiles online is rather slow
    • serving tiles from disk is fast

nginx + tilethief

tilethiev does not serve tiles from cache while offline. ngix speeds up serving and works well offline.

  • sudo apt install nginx
  • cd /etc/nginx/sites-available
  • add to default
server {
	listen 47000;
	server_name tileblaster;

	#gzip off;
	#gzip_static on;
	#gunzip on;

	location / {
		root /home/pi/.tilethief/tiles;
		log_not_found off;
		expires 30d;
		add_header Pragma public;
		add_header Cache-Control "public";
		add_header X-Static super;
		try_files $uri $uri/ @tilethief;
		}

	location @tilethief {
		proxy_pass http://127.0.0.1:46000;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		expires 30d;
		etag on;
		add_header X-Static miss;
	}
}
  • sudo /etc/init.d/nginx restart

alternative: global install tileblaster (experimental)

nginx + tileblaster (experimental)

  • sudo apt install nginx
  • cd /etc/nginx/sites-available
  • add to default
upstream tileblaster {
	server unix:/tmp/tileblaster.sock;
}

server {
	listen 47000;
	server_name tileblaster;

	gzip off;
	gzip_static on;
	gunzip on;

	location / {
		root /tmp/tileblaster;
		if (!-f $request_filename.gz) {
			proxy_pass http://tileblaster;
		}
	}
}
  • sudo /etc/init.d/nginx restart

tileblaster

  • sudo npm i tileblaster -g --no-optional
  • cd /usr/lib/node_modules/tileblaster
  • edit config.js
module.exports = {

	// path to socket file
	"socket": "/tmp/tileblaster.sock",

	// path to tile directory
	"tiles": "/tmp/tileblaster",

	// nsa heartbeat server, if so desired
	// "heartbeat": "udp4://nsa.example.com:30826",

	// clean up every so often m=minute h=hour d=day w=week
	"cleanup": "15m",

	// maps
	"maps": {
		
		// map id, accessible via //server/mapid/z/x/y.ext
		"osm": {
		
			// backend url: 
			// * {s} subdomains specified in sub
			// * {z}, {x}, {y} tile coordinates
			// * {e} extension
			// * {r} resolution marker
			// "url": "https://{s}.tiles.example.com/tiles/{z}/{x}/{y}{r}.{e}",
			"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.{e}",

			// possible extensions
			// "ext": ["mvt","json","topojson","png","jpg"],
			"ext": ["png"],

			// valid zoom levels
			"zoom": [0,16],

			// valid subdomains
			"sub": ["a","b"],

			// bounding box, west, south, east, north
			"bbox": [-180,-90,180,90],

			// valid mimetypes from backend server
			"mime": ["application/vnd.mapbox-vector-tile","application/x-protobuf","application/json","image/png"],

			// valid resolution markers
			"res": ["@2x","@4x"],
			
			// optimize tiles
			// * .png with `optipng`
			// * .jpg with `mozjpeg`
			// "optimize": true,
			"optimize": false,

			// minimum time tiles are kept
			"expires": "52w",
			
		},
		
		// more backends here

	},

};

  • run DEBUG=tileblaster node /usr/lib/node_modules/tileblaster/bin/tileblaster.js or /usr/lib/node_modules/tileblaster/bin/tileblaster.js
  • point your webbrowser to 192.168.2.1:47000/osm/13/4215/2689.png
  • conclusion:
    • fetching tiles online is fast
    • serving tiles from disk is fast
    • tileblaster hangs after short time
    • tileblaster compresses tiles (thus need to compress mobac tile, too)

nginx only

preload cache /w mobac tilestore

setup signalk's charts plugin

toDo: make tilethief a signalK plugin


autologin to public hotspot

3G router

  • 192.168.3.1
  • admin:; A****M**
  • 3GUSB AldiTalk
    • User Name: eplus
    • Password: Internet
    • Dial Number: *99#
    • Authentication Protocol : CHAP only
    • APN: internet.eplus.de
    • Reconnect Mode: manual
    • MTU: 1492

apps

data sources

applications

devices

wind

mechanical

ultrasonic

gyro + accelerometer + compass

autopilot