Ucamserver: Difference between revisions
No edit summary |
|||
(23 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
===Introduction=== | |||
Intended for image handling functions. | Intended for image handling functions. | ||
[[Image:cam-server2.png]] | [[Image:cam-server2.png]] | ||
Line 15: | Line 14: | ||
The following cameras are supported: | 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: | It then shows a command prompt: | ||
Line 37: | Line 34: | ||
>> module list | >> module list | ||
For further | 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 | >> 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) |
Latest revision as of 09:51, 20 May 2019
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)