JeVois
1.22
JeVois Smart Embedded Machine Vision Toolkit
|
|
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.
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.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.
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 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.
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
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