JeVois  1.16
JeVois Smart Embedded Machine Vision Toolkit
Share this page:
The jevois-daemon executable
Note
For readability, we just use jevois-daemon below, but you should replace that by jevoispro-daemon when using JeVois-Pro

The main executable that is created when compiling the JeVois framework is jevois-daemon on JeVois-A33 or jevoispro-daemon on JeVois-Pro, which basically implements a jevois::Engine that will orchestrate the flow of data from camera sensor to machine vision processing to video streaming over USB.

Note
jevois-deamon can run on host (when compiling jevois for host), in which case all machine vision algorithms will run on your host computer. In this mode, you would usually use a regular USB camera, or you might want to use the JeVois smart camera configured with only pass-through video mappings (so that the JeVois camera does not do any processing on its own). See User guide to video modes and mappings and the PassThrough module. Running jevois-daemon on the host with the JeVois camera in pass-through mode is often useful to collect training data (for example, pictures of objects to recognize later) as they are seen by the JeVois camera.
jevois-daemon also runs on the JeVois smart camera hardware, immediately as soon as it is plugged in and has booted up. In such case, the smart camera hardware is doing all the machine vision processing. When operating in this mode, normally you would not want to run jevois-daemon again on the host computer, as this would amount to running jevois-daemon twice, back to back. One exception is for the collection of training data as described above. Instead, you would usually want to run a plain video viewer on your host, such as guvcview, or some custom machine vision code which you have developed, which will grab video frames from the JeVois camera and will then process them further on your host computer.

Running jevois-daemon on host

To run it on your host computer, either install jevois and jevoisbase deb packages for host (see JeVois Ubuntu packages and source code repositories). Or get the source code from GitHub and recompile (see Compiling JeVois core software from source and Compiling JeVoisBase software from source) and then just run rebuild-host.sh both in jevois and in jevoisbase.

Then, plug in any USB camera, and type

jevois-daemon

You should see video from your webcam processed on your desktop in a window. Note that the JeVois core software does not provide any module, so make sure you proceed to compiling and installing jevoisbase before you try to use jevois-daemon.

jevois-daemon accepts a number of command-line arguments, try

jevois-daemon --help

to see them. Note that some of these will disappear once jevois-daemon starts, such as cameradev which specifies the camera (or video input file) to use. Once jevois-daemon is running, that parameter cannot be changed anymore.

Once jevois-daemon is running, you can interact with the JeVois system by typing commands in the terminal in which you started jevois-daemon. For example, try:

info
help
listmappings

To start jevois-daemon in a specific mode, find its number in the listmapping list, then type 'quit' to exit jevois-daemon, and finally

jevois-daemon --videomapping=19

to start it again in using that new video mapping (here, mapping 19 was for Demo QR-code according to listmappings). See Command-line interface user guide for more info about commands, and http://jevois.org/start/start.html for a list of video mappings that correspond to the default collection of modules in jevoisbase.

Note
If your USB webcam cannot support the camera resolution required by a given video mapping, then you will get an error and that mapping cannot run on host.

jevois-daemon options

As of this writing, jevois-daemon –help returns (reproduced here mostly to help people searching this doc by keywords):

General Options:  
  --tracelevel (unsigned int) default=[0]
    Set the minimum trace level to display

  --loglevel (jevois::manager::LogLevel) default=[info] List:[fatal|error|info]
    Set the minimum log level to display

  --help (bool) default=[false]
    Print this help message


Engine Options:  
  --usbserialdev (string) default=[]
    Over-the-USB serial device name, or empty

  --cameradev (string) default=[/dev/video0]
    Camera device name (if starting with /dev/v...), or movie file name (e.g., movie.mpg) or image sequence (e.g., im%02d.jpg, to read frames im00.jpg, im01.jpg, etc).

  --cameranbuf (unsigned int) default=[0]
    Number of video input (camera) buffers, or 0 for automatic.

  --serout (jevois::engine::SerPort) default=[None] List:[None|All|Hard|USB]
    Send module serial messages to selected serial port(s)

  --cpumax (unsigned int) default=[1344] List:[120|240|312|408|480|504|600|648|720|816|912|1008|1044|1056|1080|1104|1116|1152|1200|1224|1248|1296|1344]
    CPU maximum frequency in MHz

  --videomapping (int) default=[-1]
    Index of Video Mapping to use, or -1 to use the default mapping

  --camreg (bool) default=[false]
    Enable raw access to camera registers through setcamreg and getcamreg

  --cpumode (jevois::engine::CPUmode) default=[Performance] List:[PowerSave|Conservative|OnDemand|Interactive|Performance]
    CPU frequency modulation mode

  --gadgetdev (string) default=[]
    Gadget device name. This is used on platform hardware only. On host hardware, a display window will be used unless gadgetdev is None (useful for benchmarking) or is a file stem for a movie file that does not start with /dev/ (and which should contain a printf-style directive for a single int argument, the movie number).

  --camturbo (bool) default=[false]
    Enable camera turbo mode by relaxing the need for DMA-coherent video buffer memory. This can accelerate severalfolds access to the captured image data, but it may also yield stripe artifacts with some modules, such as PassThrough. The stripes are pieces of incorrect data in the cache. You should experiment with each particular module. Turbo mode is not recommended for any production-grade application.

  --gadgetnbuf (unsigned int) default=[0]
    Number of video output (USB video) buffers, or 0 for auto

  --serlog (jevois::engine::SerPort) default=[None] List:[None|All|Hard|USB]
    Show log and debug messages on selected serial port(s)

  --serialdev (string) default=[stdio]
    Hardware (4-pin connector) serial device name, or 'stdio' to use the console, or empty for no hardware serial port

jevois-daemon config files

Note
For JeVois-Pro, replace /jevois/ below with /jevoispro/

jevois-daemon uses several config files, source is in jevois/Config/ and they get installed into /jevois/config/ on host and JEVOIS:/jevois/config/ on platform microSD.

  • videomappings.cfg Lits of available videomappings, see User guide to video modes and mappings
  • params.cfg Parameters that get set on startup, this is equivalent to specifying these parameters from the command-line
  • initscript.cfg Script that gets run on startup, you can put in this file any valid commands as you have typed them interactively, see Command-line interface user guide for more info.

Running jevois-daemon on JeVois-A33 platform

jevois-daemon starts automatically on the platform. The script that starts it is installed in LINUX:/usr/bin/jevois.sh on the microSD. Its source is in jevois/bin/jevois.sh and it gets installed to microSD staging as part of the rebuild-platform.sh process.

You can edit this script, for example if you wish to run jevois-daemon in the gdb debugger, just replace the line

/usr/bin/jevois-daemon ${opts}

by

gdb --args /usr/bin/jevois-daemon ${opts}

Note that since the addition of Python support in JeVois v1.1, libcrypto gets pulled in when jevois-daemon starts, and this causes problems with gdb on the platform. Thus, when gdb starts on the platform, issue a

handle SIGILL nostop noprint

before you give gdb the run command. See https://www.raspberrypi.org/forums/viewtopic.php?p=155085 for the same issue reported on the Raspberry Pi.

Instead of running in gdb, which sometimes struggles with many threads, etc you can enable core dumps, run jevois-daemon normally until it crashes, and then use gdb to find the error in the core file:

ulimit -c unlimited # enable core dumps
jevois.sh # get to the part that crashes and it will quit, dumping a file named 'core'
gdb /usr/bin/jevois-daemon core
# press return a few times until you get a prompt
bt # to show the backtrace leading to the crash
quit

Running jevois-daemon on JeVois-Pro platform

jevoispro-daemon starts automatically on the platform. The script that starts it is installed in LINUX:/usr/bin/jevoispro.sh on the microSD. Its source is in jevois/bin/jevoispro.sh and it gets installed to microSD as part of the rebuild-platform-pdeb.sh process of package jevois.

To debug hard crashes, proceed as follows: boot into console, enable core dumps, run jevoispro-daemon normally until it crashes, and then use gdb to find the error in the core file:

First, switch to console boot as described in JeVois-Pro Quickstart user guide

Then reboot and login as root / jevois, and:

ulimit -c unlimited # enable core dumps
jevoispro.sh # get to the part that crashes and it will quit, dumping a file named 'core'
gdb /usr/bin/jevoispro-daemon core
# press return a few times until you get a prompt
bt # to show the backtrace leading to the crash
quit