Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Jurij Podgoršek | 46b518dfa6 | |
Jurij Podgoršek | b4d7aa0c90 |
15
README.org
15
README.org
|
@ -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.
|
||||||
|
|
|
@ -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
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Tole pozenemo iz rockpi plosce!
|
|
||||||
ssh -R 3343:192.168.32.1:4343 g1smo@kreten.si
|
|
|
@ -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
|
|
BIN
observatorij.jpg
BIN
observatorij.jpg
Binary file not shown.
Before Width: | Height: | Size: 140 KiB |
|
@ -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
|
|
|
@ -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)
|
|
|
@ -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. 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. 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>
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
12
www/stil.css
12
www/stil.css
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue