Ucamserver
Introduction
Intended for image handling functions.
The following camera-related plug-ins are available:
- Camera control (camget, camset etc)
- Image access (imageget, imageset) access to fresh images.
- Image pool handling (poolget poollist etc.) pool of imege buffers with image handling functionality.
- Guidemark detection (gmkget) giudemark 3D pose and code
- Road outline plugin (pathget) polygon with road outline matching a seed area.
- Sample plugin (center of gravity)
The following cameras are supported:
- Kinect
- Guppy (firewire)
- Any (USB) camera that supports v4l - using module auv4lgst.so.0
Run the server
Run the server in a directory with a configuration file (ucamserver.ini)
ucamserver
It then shows a command prompt:
>>
To monitor images and results use the monitoring client UCLIENT or AUCLIENT (or the server console directly - or as a last resort TELNET)
See:
>> module list
For further help about the server and a list of all available commands (from all plug-ins) use:
>> help
Each of the listed commands should have an on-line help function, e.g:
>> camset help
Typical configuration SMR
A camera server configuration (ucamserver.ini) for the SMR could be:
do cmd="mkdir -p log_ucamserver" server imagepath="log_ucamserver" server datapath="log_ucamserver" server replayPath="log" server port=24920 # module load=var module load=gmk module load=odopose module load=aupoly.so.0 # log odometry (as seen by ucamserver) odopose log module load="aukinect.so.0" var kinect.desiredframerate=3 kinect open # convert to BGR (default is Bayer GRBG) poolpush img=18 cmd="poolget toimg=22 fmt=BGR silent" # log kinect (RGB) images (every other image (i=2)) poolset img=22 log i=2 # ballfinder - see 'ball help' and 'var ball' for info module load="auball.so.0" # use the image to find balls every 3 images. poolpush img=22 i=3 cmd="ball blue debug='true'"
Logfile for odometry and used images will then be produced in datapath, and the images saved in the imagepata.
Move them (including imgpool.log) into a subdirectory, e.g. log_ucamserver/log/ for replay.
Unpack of packed imagelog
If 'move-to-usb' were used to save to disk, then the bash script 'unpack-tars' may be used (in the directory with the tar-files):
#!/bin/bash files="$(ls *.bmp.tar 2>/dev/null)" # declare integer variables declare -i cnt=0 for X in $files do tar -xf $X cnt=$cnt+1 done
The images are then available for replay.
Images to mpeg video
The images can be packed into a video sequence using a script. If images from more than one camera is used, then it may be a good idea to make an empty directory and link all the images from one of the cameras to this directory first, e.g.:
mkdir left cd left ln -s ../*__10* .
A script like this may then be used to pack them into a video sequence:
#! /bin/bash let COUNTER=1000000 for f in $( ls imgC/*.bmp ); do echo convert $f imgCpng/hako-20080821-left-$COUNTER.png convert $f imgCpng/hako-20080821-left-$COUNTER.png let PREV=$COUNTER let COUNTER+=1 done # convert to mpeg format # -r 10 frames per second # -b 5000000 bitrate på 5Mbit/sec # -y betyder overskriv destination ffmpeg -y -r 25 -b 5000000 -i imgCpng/hako-20080821-left-1%06d.png path.mpeg ls -l *.mpeg
The script list all files files - in this case all *.bmp files - then converts them to *.png format, and - most important - adds a number to the filename, that will be the image sequence in the video.
The ffmpeg will do the rest, with the parameters as shown.
Replay configuration
Make a directory for the replay configuration, e.g. replay/ballfinder:
mkdir ~/replay/ballfinder cd ~/replay/ballfinder
place a copy of the cameraserver configuration file ucamserver.ini in this directory.
Make a subdirectory in this directory, e.g. called log
mkdir log cd log
Place the logfiles (odoPose.log and image.log) in this directory
cp <sourcedir>/*.log .
Make a further subdirectory for the images, this directory MUST be called imgorg
mkdir imgorg cp <imagepath>/*.png imgorg/
The ucamserver.ini need to be modified slightly to enable the replay:
server dataPath="/vhome/jca/logfiles" server imagepath="/vhome/jca/logfiles/imgorg" server replayPath="/vhome/jca/replay/ballfinder" <--- new module load=var module load=gmk module load=odopose odopose replay <--- new # odopose log <--- changed to comment # camera parameters for GUPPY camera (device 10) camset device=10 focallength=650 camset device=10 posx=0.4 posy=0.0 posz=0.87 rotphi=0.3 camset device=10 replay <--- new module load=path # ballfinder and configuration module load="./aub2.so.0" var b2.redlim="105 127 129 180" var b2.bluelim="115 200 95 132" var b2.ballsize=0.12 var b2.topline=75 var b2.minsize=20 var b2.maxsize=65 # log images from device 10 # camset device=10 log=false <--- changed to comment # use an image every 1.5 seconds (image is logged and available in image pool) # push t=1.5 cmd="imageget img=10" <--- changed to comment # use the image to find balls every time image 10 is updated poolpush img=10 cmd="ball blue debug='true'"
Then the replay can commence, first start the camera server in the configuration directory
cd ~/replay/ballfinder ucamserver
When the cameraserver is started, then the stepping can start
>> camset step <camset info="Stepped to 1266588079.109762 line 2 in image.log"/> Ball position x: 4.1385 y: 0.5525 z: 0.2767 >>
This will advance to the next image in the logfile, and some messages may be printed on the console. The image will be loaded into the image-pool with the same image number as the original device number (here 10).
The odometry pose may be stepped too:
>> odopose step <odopose tod="1266588094.529696" time="15:01:34.529" logLine="2"/> >>
This may advance the image.log file too (to the same log-time), and thus trigger another image and any command related to that image.
Image.log file format
The image log file has one line per image, like:
1287579606.142885 159 120 160 1050.00 2 0.000 0.000 0.000 0.0000 0.0000 0.0000 img00000159-cam02-20101020_150006.142.png 1287579608.842862 186 120 160 1050.00 2 0.000 0.000 0.000 0.0000 0.0000 0.0000 img00000186-cam02-20101020_150008.842.png 1287579609.642899 194 120 160 1050.00 2 0.000 0.000 0.000 0.0000 0.0000 0.0000 img00000194-cam02-20101020_150009.642.png 1287579610.242894 200 120 160 1050.00 2 0.000 0.000 0.000 0.0000 0.0000 0.0000 img00000200-cam02-20101020_150010.242.png
and the following format on each line:
- timestamp (seconds since 1 jan 1970)
- image serial number
- image height
- image width
- camera focal length in pixels (as set in camera configuration file ucamserver.ini)
- camera device number (here device 2)
- camera x pose relative to robot (forward)
- camera y pose relative to robot (left)
- camera z pose relative to robot (up)
- camera Omega Rotation (in radians) around x-axis
- camera Phi Rotation (in radians) around y-axis
- camera Kappa Rotation (in radians) around z-axis
- image filename
Odometry logfile format
The odopmetry - as well as the map and utm logfiles has the following format:
1266588182.049364 0.593 0.114 0.46900 0.000 -1 1266588182.049630 1266588182.119369 0.604 0.119 0.48700 0.000 -1 1266588182.119790 1266588182.189390 0.614 0.125 0.50450 0.000 -1 1266588182.189852 1266588182.269268 0.625 0.131 0.52320 0.000 -1 1266588182.269529 1266588182.457870 0.647 0.144 0.56050 0.000 -1 1266588182.458362
With the following meaning
- timestamp in seconds (when the data is assumed to be valid)
- x-position in meters
- y-position in meters
- heading in radians
- velocity in m/s
- data quality (if any)
- data source (update source, -1 is from MRC using the MRC connection to the server)
- additional timestamp (when the data was put into the logfile)