mercoledì 23 agosto 2023

Installare R packages in docker

A causa di una applicazione legacy dovevo dovevo usare R ver 3 che non eà compatibile con R ver 4 (era esclusa la riscittura del codice) 




Dopo un po' di tentativi la strada piu' lineare e' stata quella di creare un container con il seguente Dockerfile che installa anche tutti i packages delle dipendenze

FROM rstudio/r-base:3.6-bookworm
RUN apt-get -y update
RUN apt-get -y install gdal-bin libgdal-dev libpng-dev libudunits2-dev libfontconfig1-dev libmagick++-dev
RUN curl -O "https://cran.r-project.org/src/contrib/Archive/randomForest/randomForest_4.6-10.tar.gz"

#setup R configs
RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile
RUN Rscript -e "install.packages('zoo')"
RUN Rscript -e "install.packages('leaflet')"
RUN Rscript -e "install.packages('sf')"
RUN Rscript -e "install.packages('leafpop')"
RUN Rscript -e "install.packages('forecast')"
RUN Rscript -e "install.packages('stringr')"
RUN Rscript -e "install.packages('lubridate')"
RUN Rscript -e "install.packages('randomForest_4.6-10.tar.gz', repos = NULL, type='source')"
RUN Rscript -e "install.packages('rpart')"
RUN Rscript -e "install.packages('e1071')"
RUN Rscript -e "install.packages('kknn')"
RUN Rscript -e "install.packages('jpeg')"
RUN Rscript -e "install.packages('data.table')"
RUN Rscript -e "install.packages('tidyr')"
RUN Rscript -e "install.packages('magick')"
RUN Rscript -e "install.packages('leaflet.extras')"
RUN Rscript -e "install.packages('leafem')"
RUN Rscript -e "install.packages('raster')"

docker build -t nome_docker .


Per usare il container

docker run --rm -it -v /home/luca:/mnt nome_docker bash

(se si omette bash entra direttamente nel prompt di R)



sabato 19 agosto 2023

Fractional scaling su Gnome Debian

 Al momento e' possibile comprare dei portatili a basso costo che sono ancora del tutto validi per l'utilizzo se non per le dimensioni dello schermo (spesso 1366x768) 

Esiste la possibilita' di andare oltre le dimensioni fisiche dello schermo utilizzando il fractional scaling con il seguente comando (valori maggiori di 1 le dimensioni virtuali sono superiori a quellli reali)

xrandr --output eDP-1  --scale 1.7x1.7

In Gnome su Debian si possono impostare fattori di scala di ingrandimento di ingrandimento, su XFCE si puo' sia ingrandire che ridurre lo schermo

venerdì 18 agosto 2023

Saturno

Va abbastanza schifo ma non riesco a capire come si usa la SVBony 305 (oltre al fatto che ho litigato con il puntamento Goto tramite CPWI)




giovedì 17 agosto 2023

Subpixel corner detection con Opencv

Ho provato a vedere se la funzione di  corner detection poteva essere utile con gli aruco tags per vedere se vi erano spostamenti


Non sembra ma quella sopra e' una gif animata (187 frames)

Ho preso l'esempio della libreria OpenCV applicato ad una serie di immagini di un Aruco tag statico ripreso con differenti condizioni di illuminazione

from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
import random as rng

source_window = 'Image'
maxTrackbar = 25
rng.seed(12345)

def goodFeaturesToTrack_Demo(val):
maxCorners = max(val, 1)
# Parameters for Shi-Tomasi algorithm
qualityLevel = 0.01
minDistance = 10
blockSize = 3
gradientSize = 3
useHarrisDetector = False
k = 0.04
# Copy the source image
copy = np.copy(src)
# Apply corner detection
corners = cv.goodFeaturesToTrack(src_gray, maxCorners, qualityLevel, minDistance, None, blockSize=blockSize, gradientSize=gradientSize, useHarrisDetector=useHarrisDetector, k=k)
# Draw corners detected
radius = 4
winSize = (5, 5)
zeroZone = (-1, -1)
criteria = (cv.TERM_CRITERIA_EPS + cv.TermCriteria_COUNT, 40, 0.001)
# Calculate the refined corner locations
corners = cv.cornerSubPix(src_gray, corners, winSize, zeroZone, criteria)
# Write them down
for i in range(corners.shape[0]):
print(corners[i,0,0],";",corners[i,0,1],";",end='')
parser = argparse.ArgumentParser(description='Code for Shi-Tomasi corner detector tutorial.')
parser.add_argument('--input', help='Path to input image.', default='pic3.png')
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
print('Could not open or find the image:', args.input)
exit(0)
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
maxCorners = 10 # initial threshold
goodFeaturesToTrack_Demo(maxCorners)
print()


il risultato dell'algotitmo e' di questo tipo




Alla fine e' emerso l'algoritmo seleziona in modo automatico gli angoli con un ordine diverso  e c'e' una forte influenza dell'illuminazione sulla definizione delle coordinate dell'angolo 

In casi ottimali (ma non e' questo il caso) ho visto che la standard deviation e' di circa 0.2 pixels

Non e' quindi un metodo affidabile per il change detection








domenica 13 agosto 2023

ESP PROG

 

========================================

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
board_build.mcu: esp32
board_build.f_cpu: 240000000L
framework = arduino
monitor_speed = 115200
upload_speed = 115200
upload_port = /dev/ttyUSB2

[env:debugdelivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
board_build.mcu: esp32
board_build.f_cpu: 240000000L
framework = arduino
debug_speed = 12000
debug_port = /dev/ttyUSB0
debug_tool = esp-prog
debug_init_break = tbreak setup

========================================


CTRL+SHIFT+P

Platformio Upload and Monitor (non c'e' uno shortcut)






Attenziona che la numerazione dei pin sulla fila sinistra iniziano dal 2 pin dal basso 

TMS = grigio pin 14

TCK = nero pin 13

TD0 = giallo pin 15 

TDI = bianco pin 12

GND = pin GND

Il VDD deve essere collegato al pin 3.3 V dell'ESP32 SOLO se non viene inserita l'USB 



/home/luca/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/xtensa-esp32-elf-gdb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

apt-get install libpython2.7-dev


apt install python3-venv

add user xxxx dialout

curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules



Esperimento (fallito) ESP32 solare

Ho provato a vedere se era possibile alimentare con continuita' un Esp32 (un TTGO-Display) tramite un pannello solare ed una batteria 18650  tramite un modulo TP4055

Sull'ESP32 era montato uno sketch che mostrava un cronometro per verificare il tempo di funzionamento


Alla fine dei conti, nonostanti il periodo estivo e con la limitazione che il pannello era direttamente irraggiato solo meta' giornata, il pannello riusciva a caricare la batteria ma non abbastanza per avere un bilancio positivo a fine giornata e cosi' dopo 5 giorni (partendo da batteria completamente carica) il sistema si e' spento







lunedì 7 agosto 2023

TpLink WN722N v2v3 monitor ESP-NOW con Debian 11

 Volevo usare la scheda WN722N per monitorare il traffico Esp-Now usando WireShark...il fatto e' che la scheda e' riconosciuta da Debian 11 ma non entrava in monitor mode mentre usando ParrotOs funzionava perfettamente.




La soluzione e' ricompilare il modulo  usando questo link

git clone https://github.com/gglluukk/rtl8188eus

make &make install

e eliminando il modulo di defualt

sudo echo 'blacklist r8188eu'|sudo tee -a '/etc/modprobe.d/realtek.conf'

al riavvio si puo' monitorare il traffico mediante questi comandi


sudo ip link set wlx9c532268fdca down
sudo iw wlx9c532268fdca set monitor control
sudo ip link set wlx9c532268fdca up
sudo wireshark


per selezionare il traffico proveniente da un determinato MAC si puo'usare
wlan.sa==xx:xx:xx:xx:xx:xx



Il seguente codice invia un messaggio broadcast su ESP-NOW con abilitato il Long Range (evidenziato in giallo)
========================================================

/*
  ESP-NOW Demo - Transmit
  esp-now-demo-xmit.ino
  Sends data to Responder
  
  DroneBot Workshop 2022
  https://dronebotworkshop.com
  https://dronebotworkshop.com/esp-now/
*/

// Include Libraries
#include <esp_wifi.h>

#include <esp_now.h>
#include <WiFi.h>

// Variables for test data
int int_value;

// MAC Address of responder - edit as required
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

esp_interface_t current_esp_interface;
wifi_interface_t current_wifi_interface;



// Define a data structure
typedef struct struct_message {
  char a[32];
  int b;
} struct_message;

// Create a structured object
struct_message myData;

// Peer info
esp_now_peer_info_t peerInfo;

// Callback function called when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

void setup() {
  int_value = 0;
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  esp_wifi_set_protocol(current_wifi_interface, WIFI_PROTOCOL_LR);
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_send_cb(OnDataSent);
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
  
}

void loop() {
 strcpy(myData.a, "Luca");
  int_value++;
  myData.b = int_value;
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
  if (result == ESP_OK) {
    Serial.println("Sending confirmed");
  }
  else {
    Serial.println("Sending error");
  }
  delay(1000);
}
========================================================

Per leggere i pacchetti ESP-NOW a linea di comando si puo' usare tcpdump oppure un progetto Go che utilizza le libreria Pcap https://pkg.go.dev/github.com/google/gopacket/pcap

Eth0 su LuckFox Pico Mini A

 Le schede Luckfox Pico Mini A (a differenza delle sorelle maggiori) non hanno un connettore RJ45 e nonostante i pin da saldare non sembrano...