Ucamserver

From Rsewiki
(Difference between revisions)
Jump to: navigation, search
(Introduction)
 
(19 intermediate revisions by one user not shown)
Line 1: Line 1:
''' Camera server'''
+
===Introduction===
  
 
Intended for image handling functions.
 
Intended for image handling functions.
Line 14: Line 14:
  
 
The following cameras are supported:
 
The following cameras are supported:
* all USB cameras supported by the pwc (Philips Web Cam) driver, e.g.
+
* Kinect
* - Philips 740K, 840K,
+
* Guppy (firewire)
* - Logitech Orbit
+
* Any (USB) camera that supports v4l - using module auv4lgst.so.0
* A few frame-grapper cards (I have not tried for a long time)
+
* IEEE1394 DCI-standard
+
* IEEE1394 DVI - not supported
+
* palantir streaming video - not supported p.t.
+
  
To run the server
+
===Run the server===
  
./ucamserver
+
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 36: Line 34:
 
  >> module list
 
  >> module list
  
For heneral help about the server and a list of all available commandes (from all plug-ins) use:
+
For further help about the server and a list of all available commands (from all plug-ins) use:
  
 
  >> help
 
  >> help
Line 46: Line 44:
 
=== Typical configuration SMR===
 
=== Typical configuration SMR===
  
A camera server configuration for the SMR could be:
+
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 dataPath="/vhome/jca/logfiles"
 
  server imagepath="/vhome/jca/logfiles/imgorg"
 
  server imagepath="/vhome/jca/logfiles/imgorg"
 +
server replayPath="/vhome/jca/replay/ballfinder"              <--- new
 
  module load=var
 
  module load=var
 
  module load=gmk
 
  module load=gmk
 
  module load=odopose
 
  module load=odopose
  odopose log
+
  odopose replay                                                <--- new
 +
# odopose log                                                 <--- changed to comment
 
  # camera parameters for GUPPY camera (device 10)
 
  # camera parameters for GUPPY camera (device 10)
 
  camset device=10 focallength=650
 
  camset device=10 focallength=650
  camset posx=0.4 posy=0.0 posz=0.87 rotphi=0.3
+
  camset device=10 posx=0.4 posy=0.0 posz=0.87 rotphi=0.3
 +
camset device=10 replay                                      <--- new
 
  module load=path
 
  module load=path
 
  # ballfinder and configuration
 
  # ballfinder and configuration
Line 67: Line 168:
 
  var b2.maxsize=65
 
  var b2.maxsize=65
 
  # log images from device 10
 
  # log images from device 10
  camset device=10 log
+
  # camset device=10 log=false                                  <--- changed to comment
 
  # use an image every 1.5 seconds (image is logged and available in image pool)
 
  # use an image every 1.5 seconds (image is logged and available in image pool)
  push t=1.5 cmd="imageget img=10"
+
  # push t=1.5 cmd="imageget img=10"                           <--- changed to comment
 
  # use the image to find balls every time image 10 is updated
 
  # use the image to find balls every time image 10 is updated
 
  poolpush img=10 cmd="ball blue debug='true'"
 
  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

Contents

[edit] Introduction

Intended for image handling functions.

Cam-server2.png

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

[edit] 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

[edit] 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.

[edit] 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.


[edit] 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.

[edit] 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.

[edit] 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

[edit] 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)
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox