akhenakh/mocs
My Own Car System, a Go & Qt application for your car
repo name | akhenakh/mocs |
repo link | https://github.com/akhenakh/mocs |
homepage | |
language | JavaScript |
size (curr.) | 2510 kB |
stars (curr.) | 215 |
created | 2018-07-22 |
license | |
M.O.C.S
My Own Car System see this blogpost
This app is an experiment to replace the non existent management system in my car.
It shows a rear camera and a live 3D map.
It’s a Go application using Qt bindings
Build
export CGO_CXXFLAGS_ALLOW=".*"
export CGO_LDFLAGS_ALLOW=".*"
export CGO_CFLAGS_ALLOW=".*"
export QT_PKG_CONFIG=true
qtdeploy build # if you installed the bindings
qtdeploy -docker build rpi3 # with docker cross compiler image for rpi3
Capture Video
Qt via Gstreamer does not allow non interlaced videos :(
One solution is to force a pipeline with an interlacer.
export QT_GSTREAMER_CAMERABIN_VIDEOSRC="videotestsrc"
Not that easy via Qt I had to patch camerabinsession.cpp to insert a filter on the preview:
at the end of GstElement *CameraBinSession::buildCameraSource()
const QByteArray envInterlace = qgetenv("QT_GSTREAMER_CAMERABIN_VIDEO_INTERLACE");
if (envInterlace.length() > 0) {
GstElement *interlace = gst_element_factory_make ("interlace", NULL);
if (interlace == NULL)
g_error ("Could not create 'interlace' element");
g_object_set(G_OBJECT(m_camerabin), "viewfinder-filter", interlace, NULL);
#if CAMERABIN_DEBUG
qDebug() << "set camera filter" << interlace;
#endif
gst_object_unref (interlace);
}
GPS
It reads GPS data from gpsd
Offline maps
OpenMapTiles project is great to generate vector data in MBTILES format, serve them withmbmatch.
Qt Map QML can display them using the mapboxgl
driver.
Routing
Hopefully the provided Qt osm
plugins knows how to route using the OSRM API.
So you can have a local OSRM for routing and it will work.
osrm-extract -p /usr/share/osrm/profiles/car.lua quebec-latest.osm.pbf
osrm-contract quebec-latest.osrm
osrm-routed quebec-latest.osrm
To set your home base use DEFAULTLAT
& DEFAULTLNG
environment variable.
Raspberry
I’m using an Rpi3 (old model).
With Arch for ARM but any system will do.
Enable mocs at startup.
Edit /lib/systemd/system/mocs.service
[Unit]
Description=Mocs
[Service]
ExecStart=/home/youruser/mocs
Environment=DEFAULTLAT=46.45323
Environment=DEFAULTLNG=-71.93323
Environment=QT_QPA_PLATFORM=eglfs:/dev/fb0
Environment=QT_GSTREAMER_CAMERABIN_VIDEO_INTERLACE=yes
Environment=QT_QPA_EGLFS_HIDECURSOR=yes
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl --user enable mocs.service
Enable osrm
Known bugs
Second route to home won’t work because workaround for routeModel.cancel()
crash.
License
this code is under MIT license
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
But due to Qt and !@# LGPL, licensing of this code is uncertain since Go is compiling static code see therecipe FAQ