bluer-sbc 8.130.1__tar.gz → 8.151.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bluer-sbc might be problematic. Click here for more details.
- {bluer_sbc-8.130.1/bluer_sbc.egg-info → bluer_sbc-8.151.1}/PKG-INFO +2 -2
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/README.md +1 -1
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/alias.sh +3 -1
- bluer_sbc-8.130.1/bluer_sbc/.abcli/seed.sh → bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_rpi.sh +6 -39
- bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_rpi_64_bit.sh +38 -0
- bluer_sbc-8.130.1/bluer_sbc/.abcli/ROS/seed.sh → bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_ubuntu_rpi.sh +2 -0
- bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/jetson.sh +31 -0
- bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/rpi.sh +31 -0
- bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/swallow_raspbian.sh +13 -0
- bluer_sbc-8.151.1/bluer_sbc/.abcli/seed.sh +3 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/seed.sh +3 -1
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/__init__.py +1 -1
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/config.env +1 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/env.py +1 -0
- bluer_sbc-8.151.1/bluer_sbc/imager/camera/__init__.py +11 -0
- bluer_sbc-8.151.1/bluer_sbc/imager/camera/generic.py +208 -0
- bluer_sbc-8.151.1/bluer_sbc/imager/camera/rpi.py +112 -0
- bluer_sbc-8.151.1/bluer_sbc/imager/camera/rpi_64_bit.py +49 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/classes.py +12 -1
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1/bluer_sbc.egg-info}/PKG-INFO +2 -2
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/SOURCES.txt +9 -4
- bluer_sbc-8.130.1/bluer_sbc/.abcli/ROS.sh +0 -3
- bluer_sbc-8.130.1/bluer_sbc/.abcli/install/rpi.sh +0 -65
- bluer_sbc-8.130.1/bluer_sbc/imager/camera/__init__.py +0 -3
- bluer_sbc-8.130.1/bluer_sbc/imager/camera/classes.py +0 -259
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/LICENSE +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/MANIFEST.in +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/abcli.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/actions.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/adafruit_rgb_matrix.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/blue_sbc.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/camera.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/grove.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/hat.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/adafruit_rgb_matrix.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/grove.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/lepton.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/scroll_phat_hd.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/sparkfun_top_phat.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/template.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/unicorn_16x16.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/lepton.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/scroll_phat_hd.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/session.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/sparkfun_top_phat.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/README.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/camera.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/help.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/version.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/unicorn_16x16.sh +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/README.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/ROS/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/algo/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/algo/diff.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/blue_bracket.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/bluer_swallow.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/bryce.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/adafruit_rgb_matrix.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/display.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/grove.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hardware.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/abstract.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/prototype.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/screen.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/scroll_phat_hd.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/classes.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/unicorn_16x16.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/adafruit_rgb_matrix.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/camera.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/functions.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/grove.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/hat.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/lepton.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/scroll_phat_hd.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/sparkfun_top_phat.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/unicorn_16x16.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/host.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/camera/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/camera/constants.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/classes.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/classes.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/python2.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/logger.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/sample.env +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/__init__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/__main__.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/functions.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/urls.py +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/dependency_links.txt +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/requires.txt +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/top_level.txt +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/pyproject.toml +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/requirements.txt +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/setup.cfg +0 -0
- {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bluer_sbc
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.151.1
|
|
4
4
|
Summary: 🌀 AI for single board computers.
|
|
5
5
|
Home-page: https://github.com/kamangir/bluer-sbc
|
|
6
6
|
Author: Arash Abadpour (Kamangir)
|
|
@@ -50,7 +50,7 @@ pip install bluer_sbc
|
|
|
50
50
|
|
|
51
51
|
[](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml) [](https://pypi.org/project/bluer-sbc/) [](https://pypistats.org/packages/bluer-sbc)
|
|
52
52
|
|
|
53
|
-
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.
|
|
53
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.151.1`](https://github.com/kamangir/bluer-sbc).
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
|
|
@@ -45,5 +45,5 @@ graph LR
|
|
|
45
45
|
|
|
46
46
|
[](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml) [](https://pypi.org/project/bluer-sbc/) [](https://pypistats.org/packages/bluer-sbc)
|
|
47
47
|
|
|
48
|
-
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.
|
|
48
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.151.1`](https://github.com/kamangir/bluer-sbc).
|
|
49
49
|
|
bluer_sbc-8.130.1/bluer_sbc/.abcli/seed.sh → bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_rpi.sh
RENAMED
|
@@ -3,18 +3,6 @@
|
|
|
3
3
|
# internal function to bluer_ai_seed.
|
|
4
4
|
# seed is NOT local
|
|
5
5
|
function bluer_ai_seed_headless_rpi() {
|
|
6
|
-
bluer_sbc_seed "$@"
|
|
7
|
-
}
|
|
8
|
-
function bluer_ai_seed_jetson() {
|
|
9
|
-
bluer_sbc_seed "$@"
|
|
10
|
-
}
|
|
11
|
-
function bluer_ai_seed_rpi() {
|
|
12
|
-
bluer_sbc_seed "$@"
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function bluer_sbc_seed() {
|
|
16
|
-
local target=$1
|
|
17
|
-
|
|
18
6
|
bluer_ai_seed add_kaggle
|
|
19
7
|
|
|
20
8
|
bluer_ai_seed add_ssh_key sudo
|
|
@@ -30,17 +18,17 @@ function bluer_sbc_seed() {
|
|
|
30
18
|
seed="${seed}sudo apt install -y cmake build-essential$delim"
|
|
31
19
|
seed="${seed}sudo apt install -y libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjpeg-dev libtiff-dev libwebp-dev$delim"
|
|
32
20
|
seed="${seed}sudo apt-get install libopenblas-base$delim"
|
|
21
|
+
|
|
33
22
|
seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
|
|
34
23
|
|
|
35
24
|
bluer_ai_seed add_repo
|
|
36
25
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
|
|
40
|
-
fi
|
|
26
|
+
seed="${seed}mkdir -pv ~/storage/temp/ignore$delim"
|
|
27
|
+
seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
|
|
41
28
|
|
|
42
29
|
bluer_ai_seed add_bluer_ai_env
|
|
43
30
|
|
|
31
|
+
seed="${seed}sudo apt install -y python3-pip$delim"
|
|
44
32
|
seed="${seed}pip3 install --upgrade pip --no-input$delim"
|
|
45
33
|
seed="${seed}pip3 install \"pandas<2.1\"$delim"
|
|
46
34
|
seed="${seed}pip3 install pillow$delim"
|
|
@@ -53,32 +41,11 @@ function bluer_sbc_seed() {
|
|
|
53
41
|
bluer_ai_seed add_repo repo=bluer-sbc
|
|
54
42
|
seed="${seed}pip3 install -e .$delim_section"
|
|
55
43
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
seed="${seed}sudo apt install -y libopenjp2-7 libavcodec58 libavformat58 libswscale5 libblas3 libatlas3-base$delim_section"
|
|
59
|
-
fi
|
|
44
|
+
seed="${seed}pip3 install opencv-python-headless$delim_section"
|
|
45
|
+
seed="${seed}sudo apt install -y libopenjp2-7 libavcodec58 libavformat58 libswscale5 libblas3 libatlas3-base$delim_section"
|
|
60
46
|
|
|
61
47
|
seed="${seed}cd; cd git; cd bluer-ai$delim"
|
|
62
48
|
seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
|
|
63
49
|
|
|
64
50
|
seed="${seed}source ~/.bashrc$delim_section"
|
|
65
|
-
|
|
66
|
-
if [[ ! -z "$env_name" ]]; then
|
|
67
|
-
seed="${seed}bluer_ai_env dot copy $env_name$delim"
|
|
68
|
-
seed="${seed}bluer_ai init$delim_section"
|
|
69
|
-
fi
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function bluer_ai_seed_swallow_raspbian() {
|
|
73
|
-
bluer_ai_seed add_repo repo=bluer-ugv
|
|
74
|
-
seed="${seed}pip3 install -e .$delim_section"
|
|
75
|
-
|
|
76
|
-
seed="${seed}sudo apt install -y libopenblas-dev$delim"
|
|
77
|
-
|
|
78
|
-
seed="${seed}cd$delim"
|
|
79
|
-
seed="${seed}wget https://github.com/nmilosev/pytorch-arm-builds/releases/download/v1.13.0/torch-1.13.0-cp39-cp39-linux_armv7l.whl$delim"
|
|
80
|
-
seed="${seed}pip3 install torch-1.13.0-cp39-cp39-linux_armv7l.whl$delim_section"
|
|
81
|
-
|
|
82
|
-
bluer_ai_seed add_repo repo=bluer-algo
|
|
83
|
-
seed="${seed}pip3 install -e .$delim_section"
|
|
84
51
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# internal function to bluer_ai_seed.
|
|
4
|
+
# seed is NOT local
|
|
5
|
+
function bluer_ai_seed_headless_rpi_64_bit() {
|
|
6
|
+
bluer_ai_seed add_kaggle
|
|
7
|
+
|
|
8
|
+
bluer_ai_seed add_ssh_key sudo
|
|
9
|
+
|
|
10
|
+
seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
|
|
11
|
+
|
|
12
|
+
bluer_ai_seed add_repo
|
|
13
|
+
|
|
14
|
+
seed="${seed}mkdir -pv ~/storage/temp/ignore$delim"
|
|
15
|
+
seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
|
|
16
|
+
|
|
17
|
+
bluer_ai_seed add_bluer_ai_env_ssp
|
|
18
|
+
|
|
19
|
+
local ssp="--break-system-packages"
|
|
20
|
+
|
|
21
|
+
seed="${seed}sudo apt update$delim"
|
|
22
|
+
seed="${seed}sudo apt install -y python3-pip$delim"
|
|
23
|
+
seed="${seed}pip3 install $ssp -e .$delim_section"
|
|
24
|
+
|
|
25
|
+
bluer_ai_seed add_repo repo=bluer-objects
|
|
26
|
+
seed="${seed}pip3 install $ssp -e .$delim_section"
|
|
27
|
+
seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
|
|
28
|
+
|
|
29
|
+
bluer_ai_seed add_repo repo=bluer-sbc
|
|
30
|
+
seed="${seed}pip3 install $ssp -e .$delim_section"
|
|
31
|
+
|
|
32
|
+
seed="${seed}pip3 install $ssp opencv-python-headless$delim"
|
|
33
|
+
seed="${seed}sudo apt install -y python3-picamera2$delim"
|
|
34
|
+
seed="${seed}pip3 install --force-reinstall --no-cache-dir simplejpeg$delim_section"
|
|
35
|
+
|
|
36
|
+
seed="${seed}cd; cd git; cd bluer-ai$delim"
|
|
37
|
+
seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
|
|
38
|
+
}
|
|
@@ -16,6 +16,8 @@ function bluer_ai_seed_headless_ubuntu_rpi() {
|
|
|
16
16
|
seed="${seed}sudo apt install -y wireless-tools$delim"
|
|
17
17
|
seed="${seed}sudo apt install -y gcc python3-dev$delim"
|
|
18
18
|
seed="${seed}sudo apt install -y gcc-aarch64-linux-gnu$delim"
|
|
19
|
+
seed="${seed}sudo apt install -y v4l-utils$delim"
|
|
20
|
+
seed="${seed}sudo apt install -y ffmpeg$delim"
|
|
19
21
|
seed="${seed}sudo apt install -y python3-venv$delim_section"
|
|
20
22
|
|
|
21
23
|
seed="${seed}sudo mkdir -p /etc/systemd/system/getty@tty1.service.d$delim"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# internal function to bluer_ai_seed.
|
|
4
|
+
# seed is NOT local
|
|
5
|
+
function bluer_ai_seed_jetson() {
|
|
6
|
+
bluer_ai_seed add_kaggle
|
|
7
|
+
|
|
8
|
+
bluer_ai_seed add_ssh_key sudo
|
|
9
|
+
|
|
10
|
+
seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
|
|
11
|
+
|
|
12
|
+
bluer_ai_seed add_repo
|
|
13
|
+
|
|
14
|
+
bluer_ai_seed add_bluer_ai_env
|
|
15
|
+
|
|
16
|
+
seed="${seed}sudo apt install -y python3-pip$delim"
|
|
17
|
+
seed="${seed}pip3 install --upgrade pip --no-input$delim"
|
|
18
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
19
|
+
|
|
20
|
+
bluer_ai_seed add_repo repo=bluer-objects
|
|
21
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
22
|
+
seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
|
|
23
|
+
|
|
24
|
+
bluer_ai_seed add_repo repo=bluer-sbc
|
|
25
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
26
|
+
|
|
27
|
+
seed="${seed}cd; cd git; cd bluer-ai$delim"
|
|
28
|
+
seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
|
|
29
|
+
|
|
30
|
+
seed="${seed}source ~/.bashrc$delim_section"
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# internal function to bluer_ai_seed.
|
|
4
|
+
# seed is NOT local
|
|
5
|
+
function bluer_ai_seed_rpi() {
|
|
6
|
+
bluer_ai_seed add_kaggle
|
|
7
|
+
|
|
8
|
+
bluer_ai_seed add_ssh_key sudo
|
|
9
|
+
|
|
10
|
+
seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
|
|
11
|
+
|
|
12
|
+
bluer_ai_seed add_repo
|
|
13
|
+
|
|
14
|
+
bluer_ai_seed add_bluer_ai_env
|
|
15
|
+
|
|
16
|
+
seed="${seed}sudo apt install -y python3-pip$delim"
|
|
17
|
+
seed="${seed}pip3 install --upgrade pip --no-input$delim"
|
|
18
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
19
|
+
|
|
20
|
+
bluer_ai_seed add_repo repo=bluer-objects
|
|
21
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
22
|
+
seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
|
|
23
|
+
|
|
24
|
+
bluer_ai_seed add_repo repo=bluer-sbc
|
|
25
|
+
seed="${seed}pip3 install -e .$delim_section"
|
|
26
|
+
|
|
27
|
+
seed="${seed}cd; cd git; cd bluer-ai$delim"
|
|
28
|
+
seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
|
|
29
|
+
|
|
30
|
+
seed="${seed}source ~/.bashrc$delim_section"
|
|
31
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# internal function to bluer_ai_seed.
|
|
4
|
+
# seed is NOT local
|
|
5
|
+
function bluer_ai_seed_swallow_raspbian() {
|
|
6
|
+
local ssp="--break-system-packages"
|
|
7
|
+
|
|
8
|
+
bluer_ai_seed add_repo repo=bluer-ugv
|
|
9
|
+
seed="${seed}pip3 install $ssp -e .$delim_section"
|
|
10
|
+
|
|
11
|
+
bluer_ai_seed add_repo repo=bluer-algo
|
|
12
|
+
seed="${seed}pip3 install $ssp -e .$delim_section"
|
|
13
|
+
}
|
|
@@ -6,9 +6,11 @@ function test_bluer_sbc_seed() {
|
|
|
6
6
|
local target
|
|
7
7
|
for target in \
|
|
8
8
|
headless_rpi \
|
|
9
|
+
headless_rpi_64_bit \
|
|
9
10
|
headless_ubuntu_rpi \
|
|
10
11
|
jetson \
|
|
11
|
-
rpi
|
|
12
|
+
rpi \
|
|
13
|
+
swallow_raspbian; do
|
|
12
14
|
bluer_ai_eval ,$options \
|
|
13
15
|
bluer_ai_seed $target screen
|
|
14
16
|
[[ $? -ne 0 ]] && return 1
|
|
@@ -7,6 +7,7 @@ BLUER_SBC_CAMERA_HI_RES = get_env("BLUER_SBC_CAMERA_HI_RES", True)
|
|
|
7
7
|
BLUER_SBC_CAMERA_WIDTH = get_env("BLUER_SBC_CAMERA_WIDTH", 728)
|
|
8
8
|
BLUER_SBC_CAMERA_HEIGHT = get_env("BLUER_SBC_CAMERA_HEIGHT", 600)
|
|
9
9
|
BLUER_SBC_CAMERA_ROTATION = get_env("BLUER_SBC_CAMERA_ROTATION", 0)
|
|
10
|
+
BLUER_SBC_CAMERA_KEEP_OPEN = get_env("BLUER_SBC_CAMERA_KEEP_OPEN", 0)
|
|
10
11
|
|
|
11
12
|
BLUER_SBC_DISPLAY_FULLSCREEN = get_env("BLUER_SBC_DISPLAY_FULLSCREEN", True)
|
|
12
13
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from bluer_options import host
|
|
2
|
+
|
|
3
|
+
if host.is_rpi():
|
|
4
|
+
if host.is_64bit():
|
|
5
|
+
from bluer_sbc.imager.camera.rpi_64_bit import RPI_64_bit_Camera as Camera
|
|
6
|
+
else:
|
|
7
|
+
from bluer_sbc.imager.camera.rpi import RPI_Camera as Camera
|
|
8
|
+
else:
|
|
9
|
+
from bluer_sbc.imager.camera.generic import Camera
|
|
10
|
+
|
|
11
|
+
instance = Camera()
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import cv2
|
|
2
|
+
from typing import Tuple, List, Union
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from blueness import module
|
|
6
|
+
from bluer_options import string
|
|
7
|
+
from bluer_options import host
|
|
8
|
+
from bluer_options.timer import Timer
|
|
9
|
+
from bluer_options.logger import crash_report
|
|
10
|
+
from bluer_objects import file, objects
|
|
11
|
+
|
|
12
|
+
from bluer_sbc import env
|
|
13
|
+
from bluer_sbc.hardware import hardware
|
|
14
|
+
from bluer_sbc.imager.classes import Imager
|
|
15
|
+
from bluer_sbc.logger import logger
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Camera(Imager):
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.device = None
|
|
21
|
+
self.resolution = []
|
|
22
|
+
|
|
23
|
+
def capture(
|
|
24
|
+
self,
|
|
25
|
+
close_after: bool = True,
|
|
26
|
+
log: bool = True,
|
|
27
|
+
open_before: bool = True,
|
|
28
|
+
filename: str = "",
|
|
29
|
+
object_name: str = "",
|
|
30
|
+
) -> Tuple[bool, np.ndarray]:
|
|
31
|
+
success = False
|
|
32
|
+
image = np.ones((1, 1, 3), dtype=np.uint8) * 127
|
|
33
|
+
|
|
34
|
+
if open_before:
|
|
35
|
+
if not self.open():
|
|
36
|
+
return success, image
|
|
37
|
+
|
|
38
|
+
if self.device is None:
|
|
39
|
+
return success, image
|
|
40
|
+
|
|
41
|
+
success, image = self.capture_function()
|
|
42
|
+
if not success:
|
|
43
|
+
logger.warning("capture failed.")
|
|
44
|
+
elif log:
|
|
45
|
+
logger.info(
|
|
46
|
+
"{}.capture(): {}".format(
|
|
47
|
+
self.__class__.__name__,
|
|
48
|
+
string.pretty_shape_of_matrix(image),
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
if close_after:
|
|
53
|
+
self.close()
|
|
54
|
+
|
|
55
|
+
if success and filename:
|
|
56
|
+
success = file.save_image(
|
|
57
|
+
filename=objects.path_of(
|
|
58
|
+
object_name=object_name,
|
|
59
|
+
filename=filename,
|
|
60
|
+
),
|
|
61
|
+
image=image,
|
|
62
|
+
log=log,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return success, image
|
|
66
|
+
|
|
67
|
+
def capture_function(self) -> Tuple[bool, np.ndarray]:
|
|
68
|
+
success = False
|
|
69
|
+
image = np.ones((1, 1, 3), dtype=np.uint8) * 127
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
success, image = self.device.read()
|
|
73
|
+
|
|
74
|
+
if success:
|
|
75
|
+
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
76
|
+
|
|
77
|
+
except Exception as e:
|
|
78
|
+
crash_report(e)
|
|
79
|
+
|
|
80
|
+
return success, image
|
|
81
|
+
|
|
82
|
+
# https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/6
|
|
83
|
+
def capture_video(
|
|
84
|
+
self,
|
|
85
|
+
filename: str,
|
|
86
|
+
object_name: str,
|
|
87
|
+
length: int = 10, # in seconds
|
|
88
|
+
preview: bool = True,
|
|
89
|
+
pulse: bool = True,
|
|
90
|
+
resolution=None,
|
|
91
|
+
) -> bool:
|
|
92
|
+
logger.error(f"{self.__class__.__name__}.capture_video(): not implemented.")
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
def close(self, log: bool = True) -> bool:
|
|
96
|
+
if self.device is None:
|
|
97
|
+
logger.warning(
|
|
98
|
+
"{}.close(): device is {}, failed.".format(
|
|
99
|
+
self.__class__.__name__,
|
|
100
|
+
self.device,
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
return False
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
self.close_function()
|
|
107
|
+
except Exception as e:
|
|
108
|
+
crash_report(e)
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
self.device = None
|
|
112
|
+
|
|
113
|
+
if log:
|
|
114
|
+
logger.info(f"{self.__class__.__name__}.close().")
|
|
115
|
+
|
|
116
|
+
return True
|
|
117
|
+
|
|
118
|
+
def close_function(self):
|
|
119
|
+
self.device.release()
|
|
120
|
+
|
|
121
|
+
def get_resolution(self) -> List[int]:
|
|
122
|
+
try:
|
|
123
|
+
resolution = self.get_resolution_function()
|
|
124
|
+
except Exception as e:
|
|
125
|
+
crash_report(e)
|
|
126
|
+
return []
|
|
127
|
+
|
|
128
|
+
return resolution
|
|
129
|
+
|
|
130
|
+
def get_resolution_function(self) -> Tuple[int, int]:
|
|
131
|
+
return [
|
|
132
|
+
int(self.device.get(const))
|
|
133
|
+
for const in [cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FRAME_WIDTH]
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
def open(
|
|
137
|
+
self,
|
|
138
|
+
log: bool = True,
|
|
139
|
+
resolution: Union[List[int], None] = None,
|
|
140
|
+
) -> bool:
|
|
141
|
+
try:
|
|
142
|
+
self.open_function(resolution=resolution)
|
|
143
|
+
|
|
144
|
+
self.resolution = self.get_resolution()
|
|
145
|
+
|
|
146
|
+
if log:
|
|
147
|
+
logger.info(
|
|
148
|
+
"{}.open({})".format(
|
|
149
|
+
self.__class__.__name__,
|
|
150
|
+
string.pretty_shape(self.resolution),
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return True
|
|
155
|
+
except Exception as e:
|
|
156
|
+
crash_report(e)
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
def open_function(
|
|
160
|
+
self,
|
|
161
|
+
resolution=Union[List[int], None],
|
|
162
|
+
):
|
|
163
|
+
self.device = cv2.VideoCapture(0)
|
|
164
|
+
|
|
165
|
+
# https://stackoverflow.com/a/31464688
|
|
166
|
+
self.device.set(cv2.CAP_PROP_FRAME_WIDTH, env.BLUER_SBC_CAMERA_WIDTH)
|
|
167
|
+
self.device.set(cv2.CAP_PROP_FRAME_HEIGHT, env.BLUER_SBC_CAMERA_HEIGHT)
|
|
168
|
+
|
|
169
|
+
def preview(
|
|
170
|
+
self,
|
|
171
|
+
length: float = -1,
|
|
172
|
+
) -> bool:
|
|
173
|
+
logger.info(
|
|
174
|
+
"{}.preview{} ... | press q or e to quit ...".format(
|
|
175
|
+
self.__class__.__name__,
|
|
176
|
+
"[{}]".format("" if length == -1 else string.pretty_duration(length)),
|
|
177
|
+
)
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
hardware.sign_images = False
|
|
181
|
+
timer = Timer(length, "preview")
|
|
182
|
+
try:
|
|
183
|
+
self.open(
|
|
184
|
+
log=True,
|
|
185
|
+
resolution=(320, 240),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
while not hardware.pressed("qe"):
|
|
189
|
+
_, image = self.capture(
|
|
190
|
+
close_after=False,
|
|
191
|
+
log=False,
|
|
192
|
+
open_before=False,
|
|
193
|
+
)
|
|
194
|
+
hardware.update_screen(image, None, [])
|
|
195
|
+
|
|
196
|
+
if timer.tick(wait=True):
|
|
197
|
+
logger.info(
|
|
198
|
+
"{} is up, quitting.".format(string.pretty_duration(length))
|
|
199
|
+
)
|
|
200
|
+
break
|
|
201
|
+
|
|
202
|
+
except KeyboardInterrupt:
|
|
203
|
+
logger.info("Ctrl+C, stopping.")
|
|
204
|
+
|
|
205
|
+
finally:
|
|
206
|
+
self.close(log=True)
|
|
207
|
+
|
|
208
|
+
return True
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from typing import Tuple, Union, List
|
|
2
|
+
import numpy as np
|
|
3
|
+
from time import sleep
|
|
4
|
+
|
|
5
|
+
from bluer_options.logger import crash_report
|
|
6
|
+
from bluer_options import string
|
|
7
|
+
from bluer_objects import file, objects
|
|
8
|
+
|
|
9
|
+
from bluer_sbc.imager.camera.generic import Camera
|
|
10
|
+
from bluer_sbc.hardware import hardware
|
|
11
|
+
from bluer_sbc import env
|
|
12
|
+
from bluer_sbc.logger import logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RPI_Camera(Camera):
|
|
16
|
+
def capture_function(self) -> Tuple[bool, np.ndarray]:
|
|
17
|
+
success = False
|
|
18
|
+
image = np.ones((1, 1, 3), dtype=np.uint8) * 127
|
|
19
|
+
|
|
20
|
+
temp = file.auxiliary("camera", "png")
|
|
21
|
+
try:
|
|
22
|
+
self.device.capture(temp)
|
|
23
|
+
success = True
|
|
24
|
+
except Exception as e:
|
|
25
|
+
crash_report(e)
|
|
26
|
+
|
|
27
|
+
if success:
|
|
28
|
+
success, image = file.load_image(temp)
|
|
29
|
+
|
|
30
|
+
return success, image
|
|
31
|
+
|
|
32
|
+
# https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/6
|
|
33
|
+
def capture_video(
|
|
34
|
+
self,
|
|
35
|
+
filename: str,
|
|
36
|
+
object_name: str,
|
|
37
|
+
length: int = 10, # in seconds
|
|
38
|
+
preview: bool = True,
|
|
39
|
+
pulse: bool = True,
|
|
40
|
+
resolution=None,
|
|
41
|
+
) -> bool:
|
|
42
|
+
if not self.open(resolution=resolution):
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
full_filename = objects.path_of(
|
|
46
|
+
object_name=object_name,
|
|
47
|
+
filename=filename,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
success = True
|
|
51
|
+
try:
|
|
52
|
+
if preview:
|
|
53
|
+
self.device.start_preview()
|
|
54
|
+
|
|
55
|
+
self.device.start_recording(full_filename)
|
|
56
|
+
if pulse:
|
|
57
|
+
for _ in range(int(10 * length)):
|
|
58
|
+
hardware.pulse("outputs")
|
|
59
|
+
sleep(0.1)
|
|
60
|
+
else:
|
|
61
|
+
sleep(length)
|
|
62
|
+
self.device.stop_recording()
|
|
63
|
+
|
|
64
|
+
if preview:
|
|
65
|
+
self.device.stop_preview()
|
|
66
|
+
except Exception as e:
|
|
67
|
+
crash_report(e)
|
|
68
|
+
success = False
|
|
69
|
+
|
|
70
|
+
if not self.close():
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
if success:
|
|
74
|
+
logger.info(
|
|
75
|
+
"{}.capture_video(): {} -{}-> {}".format(
|
|
76
|
+
self.__class__.__name__,
|
|
77
|
+
string.pretty_duration(length),
|
|
78
|
+
string.pretty_bytes(file.size(full_filename)),
|
|
79
|
+
filename,
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
return success
|
|
84
|
+
|
|
85
|
+
def close_function(self):
|
|
86
|
+
self.device.close()
|
|
87
|
+
|
|
88
|
+
def get_resolution_function(self) -> Tuple[int, int]:
|
|
89
|
+
return [value for value in self.device.resolution]
|
|
90
|
+
|
|
91
|
+
def open_function(
|
|
92
|
+
self,
|
|
93
|
+
resolution=Union[List[int], None],
|
|
94
|
+
):
|
|
95
|
+
from picamera import PiCamera
|
|
96
|
+
|
|
97
|
+
self.device = PiCamera()
|
|
98
|
+
self.device.rotation = env.BLUER_SBC_CAMERA_ROTATION
|
|
99
|
+
|
|
100
|
+
# https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/7
|
|
101
|
+
self.device.resolution = (
|
|
102
|
+
(
|
|
103
|
+
(2592, 1944)
|
|
104
|
+
if env.BLUER_SBC_CAMERA_HI_RES
|
|
105
|
+
else (
|
|
106
|
+
env.BLUER_SBC_CAMERA_WIDTH,
|
|
107
|
+
env.BLUER_SBC_CAMERA_HEIGHT,
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
if resolution is None
|
|
111
|
+
else resolution
|
|
112
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from typing import Tuple, Union, List
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from bluer_options.logger import crash_report
|
|
5
|
+
|
|
6
|
+
from bluer_sbc.imager.camera.generic import Camera
|
|
7
|
+
from bluer_sbc import env
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RPI_64_bit_Camera(Camera):
|
|
11
|
+
def capture_function(self) -> Tuple[bool, np.ndarray]:
|
|
12
|
+
success = False
|
|
13
|
+
image = np.ones((1, 1, 3), dtype=np.uint8) * 127
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
image = self.device.capture_array()
|
|
17
|
+
success = True
|
|
18
|
+
except Exception as e:
|
|
19
|
+
crash_report(e)
|
|
20
|
+
|
|
21
|
+
return success, image
|
|
22
|
+
|
|
23
|
+
def close_function(self):
|
|
24
|
+
self.device.stop()
|
|
25
|
+
del self.device
|
|
26
|
+
|
|
27
|
+
def get_resolution_function(self) -> Tuple[int, int]:
|
|
28
|
+
width, height = self.device.stream_configuration("main")["size"]
|
|
29
|
+
return [height, width]
|
|
30
|
+
|
|
31
|
+
def open_function(
|
|
32
|
+
self,
|
|
33
|
+
resolution=Union[List[int], None],
|
|
34
|
+
):
|
|
35
|
+
from picamera2 import Picamera2
|
|
36
|
+
|
|
37
|
+
self.device = Picamera2()
|
|
38
|
+
|
|
39
|
+
config = self.device.create_still_configuration(
|
|
40
|
+
main={
|
|
41
|
+
"size": (
|
|
42
|
+
env.BLUER_SBC_CAMERA_WIDTH,
|
|
43
|
+
env.BLUER_SBC_CAMERA_HEIGHT,
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
self.device.configure(config)
|
|
48
|
+
|
|
49
|
+
self.device.start()
|