Introdução
Este script serve para executar a maioria dos passos para execução de teste real usando o grupo de e-pucks do Verlab. Considera-se que está sendo utilizado o silvver
para localização usando câmeras e o player
para controlar os robôs. Também é considerado que existem 3 bluetooths para comunicar os robôs com o player via o programa rfcommm
.
Script
testeReal.sh
#Parâmetros iniciais: ROBOTS=2; #número de robôs usados BLUETOOTH1="00:50:B6:80:14:83"; #Endereços MAC para os três BT usados BLUETOOTH2="00:15:83:45:2F:AF"; BLUETOOTH3="00:15:83:44:37:E7"; #Número da câmera utilizada. Exemplo: 1 se a camera estiver em /dev/video1 CAMERA=1 #extrair o extrinseco if [ ! -e scene.lua ] ; then echo "************************************************************" echo "* Coloque o e-puck com marco 1 no centro do eixo XY *" echo "* e aperte ENTER. *" echo "************************************************************" read #Rodar em um terminal xterm -e "silvver_server -l &> silvver_cfg/log_camera" & #Roda em outro xterm -e "silvver_cameras -c silvver_cfg/scene_noExt.$CAMERA.lua" & sleep 6 killall silvver_server silvver_cameras xterm tail -n+15 silvver_cfg/log_camera | head -n-2 | sed 's/^([0-9]\+, [0-9]\+)//g' > silvver_cfg/P1_camera silvverExtCalib -o silvver_cfg/P1_camera > silvver_cfg/scene_middle head -n 15 silvver_cfg/scene_noExt.$CAMERA.lua > silvver_cfg/scene_head cat silvver_cfg/scene_head silvver_cfg/scene_middle silvver_cfg/scene_end > scene.lua fi ##Chamar o server e a camera com args default xterm -e silvver_server -l & xterm -e silvver_cameras & #Chamar os rfcomms for ((num=0;num<$ROBOTS;num++)); do if [ ! -e /dev/rfcomm$num ]; then if [ $num -lt 5 ]; then xterm -e "rfcomm -f rfcomm.conf -i $BLUETOOTH1 connect $num" & elif [ $num -lt 9 ]; then xterm -e "rfcomm -f rfcomm.conf -i $BLUETOOTH2 connect $num" & else xterm -e "rfcomm -f rfcomm.conf -i $BLUETOOTH3 connect $num" & fi echo "OK for rfcomm$num" read fi done # OK é 1 se todos os arquivos rfcomm foram criados OK=0; for ((num=0;num<$ROBOTS;num++)); do if [ -e /dev/rfcomm$num ]; then OK=1; else OK=0; break; fi done #Chama o player se todos rfcomms foram abertos if [ $OK -eq 1 ]; then testar-player.sh $ROBOTS else end.sh fi
scene_noExt.1.lua
require("silvver") prefix_dir = '/usr/local/share/doc/silvver/' scene = { cameras = { V4l2{ silvver_uid = 1, uid = 1, focal_length = {675.131408691, 675.236083984}, principal_point = {411.823852539, 277.326599121}, radial_coef = {0.0514593161643, -0.162268817425, 0.0}, tangential_coef = {0.00103016220964, 0.00366096501239}, color_mode = 'yuyv', resolution = {800,600}, }, }, targets = { ARTKP{ pattern_width = 50, silvver_uid = 1, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_1.patt', uid = 1, }, }, }, }
scene_end
color_mode = 'yuyv', resolution = {800,600}, }, }, targets = { ARTKP{ pattern_width = 50, silvver_uid = 1, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_1.patt', uid = 1, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_2.patt', uid = 2, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_3.patt', uid = 3, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_4.patt', uid = 4, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_5.patt', uid = 5, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_6.patt', uid = 6, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_7.patt', uid = 7, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_8.patt', uid = 8, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_9.patt', uid = 9, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_10.patt', uid = 10, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_11.patt', uid = 11, }, { pattern_file = prefix_dir .. 'scenes/artkpImgs/4x4patt/4x4_12.patt', uid = 12, }, }, }, }
rfcomm.conf
# # RFCOMM configuration file. # rfcomm0 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D8:27; # Description of the connection comment "epuck_1585"; } rfcomm1 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D8:20; # Description of the connection comment "epuck_1573"; } rfcomm2 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D8:5F; # Description of the connection comment "epuck_1543"; } rfcomm3 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:EC:A7; # Description of the connection comment "epuck_1553"; } rfcomm4 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:EC:71; # Description of the connection comment "epuck_1555"; } rfcomm5 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D8:1E; # Description of the connection comment "epuck_1570"; } rfcomm6 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:52:D1:0B; # Description of the connection comment "epuck_1106"; } rfcomm7 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D7:E8; # Description of the connection comment "epuck_1571"; } rfcomm8 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:52:A9:69; # Description of the connection comment "epuck_1107"; } rfcomm9 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D7:BD; # Description of the connection comment "epuck_1554"; } rfcomm10 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D7:E6; # Description of the connection comment "epuck_1589"; } rfcomm11 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 10:00:E8:6C:D7:C8; # Description of the connection comment "epuck_1593"; }
Funcionamento
Primeiro o script verifica se no diretório atual não existe um arquivo com nome scene.lua
. Este arquivo é usado pelo silvver e contém todas as informações sobre parâmetros intrínsecos e extrínsecos da câmera e marcos usados pelo ARToolKit. Caso não existe, ele cria um executando o silvver_cameras usando um
arquivo de configuração padrão que deve se encontrar na pasta silvver_cfg
no mesmo diretório onde está o script. O arquivo de configuração padrão tem nome scene_noExt.1.lua
caso a camera esteja em /dev/video1
. Copie este arquivo ou mude o nome para scene_noExt.0.lua
caso este usando uma camera em /dev/video0
. O arquivo scene_end contém as definições dos marcos para o ARToolKit.
Para os três bluetooths indicados pelo endereço MAC (BLUETOOTH1, BLUETOOTH2 e BLUETOOTH3) são conectados alguns robôs. O arquivo rfcomm.conf
mapeia o endereço MAC dos e-pucks com os marcos que já foram colocados acima deles. Se todos os robôs foram corretamente conectados, é disparado o player
com suas configurações desejadas.
Observação
Os arquivos para o silvver mostrados correspondem a versão 0.6. Caso utilize outra versão, a sintaxe deve ser modificada.
O rfcomm
, em alguns sistemas operacionais, necessita ser usado em conjunto com sudo
. Use sudo -S
para pegar a senha automaticamente de um arquivo, via pipeline. Ex: cat arquivoComSenha | sudo -S rfcomm …
.