Compare commits

..

2 Commits
master ... sbc

11 changed files with 46 additions and 119 deletions

View File

@ -1,10 +1,19 @@
#+TITLE: Galerija BOT #+TITLE: Galerija BOT
[[file:observatorij.jpg]] * Je?
ESP32-CAM mikrokrmilnik, ki omogoča premikanje visečega objekta. ESP32-CAM mikrokrmilnik, ki ga je možno upravljati po galeriji.
Pelje ga [[https://tasmota.github.io/docs/][Tasmota firmware]], s pomočjo katerega dobimo sliko kamere in poganjamo motorčke. Pelje ga [[https://tasmota.github.io/docs/][Tasmota firmware]], s pomočjo katerega dobimo sliko kamere in poganjamo motorčke.
Ker se mikrokrmilnik sesuje, če več ljudi spremlja sliko, na bližnjem RockiPI 4 računalniku teče [[https://github.com/OliverF/mjpeg-relay][mjpeg-relay]], ki posreduje sliko obiskovalkam in obiskovalcem spletnega mesta https://observatorij.rhiz0.me/. Z [[https://ffmpeg.org/][FFMPEG]] orodjem sliko kamere pretvorimo MJPEG videopretok v VP8 RTP obliko, ki jo [[https://janus.conf.meetecho.com/][Janus WebRTC strežnik]] z nizko zakasnitvijo pripelje v brskalnike. Sliko kamere spreljajo gumbi za navigacijo in poseben vmesnik za nastavljanje parametrov premikanja.
* Problemi
Aruba ruter si ne zapomni IP naslovov povezujočih naprav. Lahko se zgodi, da se IP naslov mikrokrmilnika zamenja. V tem primeru si pomagamo s skripto cat debug_ruter_tunel.sh.
* MJPEG relay
Tole: https://github.com/OliverF/mjpeg-relay
Teče na rockpi strežniku.

11
check-conn.sh 100755
View File

@ -0,0 +1,11 @@
#!/bin/bash
source .env
# Je treba inicializirat kamero?
curl "galbot:81"
if [[ $? ]]; then
echo "Inicializiram..."
curl "galbot/cm?cmnd=WcInit"
fi

View File

@ -1,4 +0,0 @@
#!/bin/bash
# Tole pozenemo iz rockpi plosce!
ssh -R 3343:192.168.32.1:4343 g1smo@kreten.si

View File

@ -1,11 +0,0 @@
#!/bin/bash
source .env
# Inicializiraj kamero
url="$VIR/cm?cmnd=WcInit"
curl "$url"
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd $SCRIPT_DIR/mjpeg-relay
python2 relay.py http://localhost:8989/stream

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

View File

@ -1,14 +0,0 @@
[Unit]
Description=MJPEG relay
After=network.target
[Service]
# Tuneliraj lokalni port 22 na streznikov port 2222
User=g1smo
ExecStart=/usr/bin/screen -DmS mjpeg-relay /home/g1smo/galerija-bot/mjpeg-relay.sh
RestartSec=5
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target

View File

@ -1,18 +1,13 @@
# Kompenzacija propelerjev # Kompenzacija propelerjev
var kompenzacija = 0.5 kompenzacija = 0.5
# Kako dolgo cakam med ukazi (ms)? # Kako dolgo cakam med ukazi (ms)?
var cakaj = 3000 cakaj = 3000
var dolzina = 6000
# Kako pogosto grem kar ravno (ms)? # Kako pogosto grem kar ravno (ms)?
var kar_naprej_cas = 60 * 1000 kar_naprej_cas = 10000
var zadnji = 0 zadnji = 0
def kar_naprej() end
tasmota.add_cmd('KarNaprej', kar_naprej)
def ugasni_levo() def ugasni_levo()
tasmota.set_power(0, false) tasmota.set_power(0, false)
@ -24,12 +19,12 @@ end
def posodobi_zadnji(cas) def posodobi_zadnji(cas)
zadnji = tasmota.millis() + cas zadnji = tasmota.millis() + cas
#tasmota.cmd('KarNaprej') kar_naprej()
end end
# payload = kako dolgo naj bo vklopljen, v milisekundah # payload = kako dolgo naj bo vklopljen, v milisekundah
def pojdi_levo(cmd, idx, payload, payload_json) def pojdi_levo(cmd, idx, payload, payload_json)
if tasmota.millis() < zadnji + cakaj return nil end if zadnji > tasmota.millis() + cakaj end
tasmota.set_power(0, true) tasmota.set_power(0, true)
@ -37,11 +32,12 @@ def pojdi_levo(cmd, idx, payload, payload_json)
tasmota.set_timer(cas, ugasni_levo) tasmota.set_timer(cas, ugasni_levo)
posodobi_zadnji(cas) posodobi_zadnji(cas)
kar_naprej()
end end
# payload = kako dolgo naj bo vklopljen, v milisekundah # payload = kako dolgo naj bo vklopljen, v milisekundah
def pojdi_desno(cmd, idx, payload, payload_json) def pojdi_desno(cmd, idx, payload, payload_json)
if tasmota.millis() < zadnji + cakaj return nil end if zadnji > tasmota.millis() + cakaj end
tasmota.set_power(1, true) tasmota.set_power(1, true)
@ -58,54 +54,30 @@ end
# payload = kako dolgo naj bo vklopljen, v milisekundah # payload = kako dolgo naj bo vklopljen, v milisekundah
def pojdi_ravno(cmd, idx, payload, payload_json) def pojdi_ravno(cmd, idx, payload, payload_json)
if tasmota.millis() < zadnji + cakaj return nil end if zadnji > tasmota.millis() + cakaj end
tasmota.set_power(0, true) tasmota.set_power(0, true)
tasmota.set_power(1, true) tasmota.set_power(1, true)
#tasmota.set_timer(int(payload), ugasni_vse) #tasmota.set_timer(int(payload), ugasni_vse)
# Kompenziramo razliko v motorjih # Kompenziramo razliko v motorjih
var cas = int(payload) * 2 var cas = int(payload)
tasmota.set_timer(int(cas * kompenzacija), ugasni_levo) tasmota.set_timer(int(cas * kompenzacija), ugasni_levo)
tasmota.set_timer(cas, ugasni_desno) tasmota.set_timer(cas, ugasni_desno)
posodobi_zadnji(cas) posodobi_zadnji(cas)
end end
def odkimaj()
tasmota.set_power(2, false)
end
def pokimaj()
tasmota.set_power(2, true)
tasmota.set_timer(20, odkimaj)
end
def auto_naprej() def auto_naprej()
if tasmota.millis() > zadnji + kar_naprej_cas * 0.9 pojdi_ravno(nil, nil, 1000)
pokimaj() tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
var n = tasmota.millis() % 3 end
if n == 0 def kar_naprej()
pojdi_ravno(nil, nil, dolzina * 2) tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
elif n == 1
pojdi_levo(nil, nil, dolzina * 1.5)
else
pojdi_desno(nil, nil, dolzina)
end
end
tasmota.set_timer(kar_naprej_cas, auto_naprej)
end end
tasmota.add_cmd('PojdiLevo', pojdi_levo) tasmota.add_cmd('PojdiLevo', pojdi_levo)
tasmota.add_cmd('PojdiDesno', pojdi_desno) tasmota.add_cmd('PojdiDesno', pojdi_desno)
tasmota.add_cmd('PojdiRavno', pojdi_ravno) tasmota.add_cmd('PojdiRavno', pojdi_ravno)
tasmota.add_cmd('UgasniVse', ugasni_vse) tasmota.add_cmd('UgasniVse', ugasni_vse)
tasmota.add_cmd('KarNaprej', auto_naprej)
def inicializiraj()
tasmota.cmd('WcInit')
end
tasmota.set_timer(5000, inicializiraj)
tasmota.set_timer(kar_naprej_cas, auto_naprej)

View File

@ -36,13 +36,13 @@
<body> <body>
<section id="glavno"> <section id="glavno">
<h1>OBSERVATORIJ</h1> <h1>OBSERVATORIJ</h1>
<h2>je umetniška instalacija, ki je del razstave Opazovalna postaja K23 v MMC KIBELA v Mariboru. &nbsp;&nbsp;Spodnja konzola vam omogoča upravljanje tamkajšnjega lebdečega objekta.</h2> <h2>je umetniška instalacija, ki je del razstave Nevidni sopotnik v Mestni galeriji Nova Gorica. &nbsp;&nbsp;Spodnja konzola vam omogoča upravljanje tamkajšnjega lebdečega objekta.</h2>
<section class="zaslon"> <section class="zaslon">
<!--video id="videofeed" muted="" autoplay="" playsinline=""></video--> <!--video id="videofeed" muted="" autoplay="" playsinline=""></video-->
<img id="videofeed" src="/stream"></video> <img id="videofeed" src="/stream"></video>
<!--button id="predvajaj">⏵</button--> <button id="predvajaj"></button>
<section class="gumbi"> <section class="gumbi">
<button id="levo"></button> <button id="levo"></button>
@ -55,7 +55,7 @@
<p>Avtor: BOŠTJAN DRINOVEC</p> <p>Avtor: BOŠTJAN DRINOVEC</p>
<p>programiranje: JURIJ PODGORŠEK</p> <p>programiranje: JURIJ PODGORŠEK</p>
<p>elektronika: BORUT SAVSKI</p> <p>elektronika: BORUT SAVSKI</p>
<!--p>produkcija: Mestna galerija Nova Gorica in Boštjan Drinovec, 2023</p--> <p>produkcija: Mestna galerija Nova Gorica in Boštjan Drinovec, 2023</p>
</section> </section>
</section> </section>

View File

@ -6,15 +6,12 @@ window.peljiLevo = function () {
var xh = xhttp(); var xh = xhttp();
//xh.open('GET', "/cm?cmnd=PojdiLevo%20" + DOLZINA); //xh.open('GET', "/cm?cmnd=PojdiLevo%20" + DOLZINA);
xh.open('GET', "/cm/PojdiLevo"); xh.open('GET', "/cm/PojdiLevo");
xh.send(); xh.send();
} }
window.peljiDesno = function () { window.peljiDesno = function () {
var xh = xhttp(); var xh = xhttp();
//xh.open('GET', "/cm?cmnd=PojdiDesno%20" + DOLZINA);
xh.open('GET', "/cm/PojdiDesno"); xh.open('GET', "/cm/PojdiDesno");
xh.send(); xh.send();
} }
@ -22,6 +19,5 @@ window.peljiRavno = function () {
var xh = xhttp(); var xh = xhttp();
//xh.open('GET', "/cm?cmnd=PojdiRavno%20" + DOLZINA); //xh.open('GET', "/cm?cmnd=PojdiRavno%20" + DOLZINA);
xh.open('GET', "/cm/PojdiRavno"); xh.open('GET', "/cm/PojdiRavno");
xh.send(); xh.send();
} }

View File

@ -1,30 +0,0 @@
var server = null;
//if(window.location.protocol === 'http:')
//server = "http://" + window.location.hostname + ":8088/janus";
//else
//server = "https://" + window.location.hostname + ":8089/janus";
//server = window.location.protocol + '//' + window.location.hostname + '/janus';
//server = window.location.protocol + '//' + window.location.hostname + ':8089/janus';
//server = '/janus';
//server = "ws://" + window.location.hostname + ":8188/";
//server = "ws://" + window.location.hostname + ":8188/";
//server = "wss://" + window.location.hostname + ":8989/";
server = "wss://janus.rhiz0.me/";
//server = '/janus';
var turnUrl = 'turn:turn.rhiz0.me:5349';
//var stunUrl = 'stun:turn.rhiz0.me:5349';
var turnUser = 'turnserver';
var turnPass = '85ThXzKLce2oZkXz76tM0tibWL88Ik';
var iceServers = [{
urls: turnUrl,
username: turnUser,
credential: turnPass
}]
var BOT="http://192.168.32.139/";
// Koliko milisekund se naj vrtijo propelerji?
var DOLZINA=1000;
var PAVZA=1000;

View File

@ -38,7 +38,6 @@ h2 {
} }
#videofeed { #videofeed {
display: block;
width: 100%; width: 100%;
height: auto; height: auto;
box-sizing: border-box; box-sizing: border-box;
@ -47,8 +46,7 @@ h2 {
border-top-right-radius: 50% 12%; border-top-right-radius: 50% 12%;
border-bottom-left-radius: 50% 12%; border-bottom-left-radius: 50% 12%;
border-bottom-right-radius: 50% 12%; border-bottom-right-radius: 50% 12%;
/*min-height: 482.5px;*/ min-height: 482.5px;
min-height: 250px;
} }
#predvajaj { #predvajaj {
@ -73,7 +71,7 @@ h2 {
display: none; display: none;
} }
#videofeed:before { .cakam:after {
display: block; display: block;
position: absolute; position: absolute;
content: 'Nalaganje...'; content: 'Nalaganje...';
@ -92,7 +90,7 @@ h2 {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
/*display: none;*/ display: none;
} }
.gumbi button { .gumbi button {
@ -119,12 +117,12 @@ button[disabled] {
} }
#levo { #levo {
left: calc(20% - 2rem); left: 5rem;
bottom: 2rem; bottom: 2rem;
} }
#desno { #desno {
right: calc(20% - 2rem); right: 5rem;
bottom: 2rem; bottom: 2rem;
} }