mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-01 15:39:32 +00:00
Compare commits
3 Commits
bookworm
...
backup-deb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93b146986a | ||
|
|
96c67db541 | ||
|
|
fdc650ec2a |
15
.github/workflows/build-image.yaml
vendored
15
.github/workflows/build-image.yaml
vendored
@@ -17,24 +17,21 @@ jobs:
|
|||||||
- name: Build image
|
- name: Build image
|
||||||
run: |
|
run: |
|
||||||
docker run --privileged --rm -v /dev:/dev -v $(pwd):/builder/repo -e TRAVIS_TAG="${{ github.event.release.tag_name }}" sfalexrog/img-tool:qemu-update
|
docker run --privileged --rm -v /dev:/dev -v $(pwd):/builder/repo -e TRAVIS_TAG="${{ github.event.release.tag_name }}" sfalexrog/img-tool:qemu-update
|
||||||
# - name: Compress image
|
- name: Compress image
|
||||||
# run: |
|
|
||||||
# cd images && sudo chmod -R 777 . && zip -9 $(echo clover_*).zip clover_* && ls -lh . && unzip -l clover_*.zip
|
|
||||||
- name: Compress image using 7-Zip
|
|
||||||
run: |
|
run: |
|
||||||
cd images && sudo chmod -R 777 . && 7z a -mx=9 $(echo *_*).7z *_* && ls -lh . && 7z l *_*.7z
|
cd images && sudo chmod -R 777 . && zip -9 $(echo clover_*).zip clover_* && ls -l . && unzip -l clover_*.zip
|
||||||
- name: Upload image
|
- name: Upload image
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
if: ${{ github.event_name == 'release' }}
|
if: ${{ github.event_name == 'release' }}
|
||||||
with:
|
with:
|
||||||
files: images/*_*.zip
|
files: images/clover_*.zip
|
||||||
prerelease: true
|
prerelease: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Upload image to artifacts
|
- name: Upload image to artifacts
|
||||||
if: ${{ github.event_name == 'workflow_dispatch' || github.ref != 'refs/heads/master' }}
|
if: ${{ github.event_name == 'workflow_dispatch' }}
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: image
|
name: image
|
||||||
path: images/*_*.7z
|
path: images/clover_*.zip
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|||||||
@@ -113,9 +113,7 @@
|
|||||||
"VMware",
|
"VMware",
|
||||||
"DuoCam"
|
"DuoCam"
|
||||||
],
|
],
|
||||||
"code_blocks": false,
|
"code_blocks": false
|
||||||
"html_elements": false
|
|
||||||
},
|
},
|
||||||
"MD045": false,
|
"MD045": false
|
||||||
"MD051": false
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
<depend>sensor_msgs</depend>
|
<depend>sensor_msgs</depend>
|
||||||
<depend>rostest</depend>
|
<depend>rostest</depend>
|
||||||
<depend>dynamic_reconfigure</depend>
|
<depend>dynamic_reconfigure</depend>
|
||||||
<depend>pluginlib</depend>
|
|
||||||
<depend condition="$ROS_PYTHON_VERSION == 2">python-docopt</depend>
|
<depend condition="$ROS_PYTHON_VERSION == 2">python-docopt</depend>
|
||||||
<depend condition="$ROS_PYTHON_VERSION == 3">python3-docopt</depend>
|
<depend condition="$ROS_PYTHON_VERSION == 3">python3-docopt</depend>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Requires=roscore.service
|
|||||||
[Service]
|
[Service]
|
||||||
User=pi
|
User=pi
|
||||||
ExecStart=/bin/bash -c ". /home/pi/catkin_ws/devel/setup.sh; \
|
ExecStart=/bin/bash -c ". /home/pi/catkin_ws/devel/setup.sh; \
|
||||||
ROS_HOSTNAME=`hostname`.local ROS_OS_OVERRIDE=debian:bookworm exec stdbuf -o L roslaunch clover clover.launch --wait --screen --skip-log-check \
|
ROS_HOSTNAME=`hostname`.local exec stdbuf -o L roslaunch clover clover.launch --wait --screen --skip-log-check \
|
||||||
2> >(tee /tmp/clover.err)"
|
2> >(tee /tmp/clover.err)"
|
||||||
|
|
||||||
ExecStartPre=+rm /var/log/clover.log
|
ExecStartPre=+rm /var/log/clover.log
|
||||||
|
|||||||
@@ -13,38 +13,70 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
# https://www.raspberrypi.com/documentation/computers/configuration.html
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Configure hardware interfaces
|
# Configure hardware interfaces
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
echo "--- Enable sshd"
|
# 1. Enable sshd
|
||||||
/usr/bin/raspi-config nonint do_ssh 0
|
echo_stamp "#1 Turn on sshd"
|
||||||
|
touch /boot/ssh
|
||||||
|
# /usr/bin/raspi-config nonint do_ssh 0
|
||||||
|
|
||||||
echo "--- GPIO enabled by default"
|
# 2. Enable GPIO
|
||||||
|
echo_stamp "#2 GPIO enabled by default"
|
||||||
|
|
||||||
echo "--- Enable I2C"
|
# 3. Enable I2C
|
||||||
|
echo_stamp "#3 Turn on I2C"
|
||||||
/usr/bin/raspi-config nonint do_i2c 0
|
/usr/bin/raspi-config nonint do_i2c 0
|
||||||
|
|
||||||
echo "--- Enable SPI"
|
# 4. Enable SPI
|
||||||
|
echo_stamp "#4 Turn on SPI"
|
||||||
/usr/bin/raspi-config nonint do_spi 0
|
/usr/bin/raspi-config nonint do_spi 0
|
||||||
|
|
||||||
echo "--- Enable raspicam"
|
# 5. Enable raspicam
|
||||||
|
echo_stamp "#5 Turn on raspicam"
|
||||||
/usr/bin/raspi-config nonint do_camera 0
|
/usr/bin/raspi-config nonint do_camera 0
|
||||||
|
|
||||||
echo "--- Setup UART"
|
# 6. Enable hardware UART
|
||||||
|
echo_stamp "#6 Turn on UART"
|
||||||
# Temporary solution
|
# Temporary solution
|
||||||
# https://github.com/RPi-Distro/raspi-config/pull/75
|
# https://github.com/RPi-Distro/raspi-config/pull/75
|
||||||
/usr/bin/raspi-config nonint do_serial_hw 0
|
/usr/bin/raspi-config nonint do_serial 1
|
||||||
/usr/bin/raspi-config nonint do_serial_cons 1
|
/usr/bin/raspi-config nonint set_config_var enable_uart 1 /boot/config.txt
|
||||||
|
echo dtoverlay=pi3-disable-bt >> /boot/config.txt
|
||||||
echo dtoverlay=pi3-disable-bt >> /boot/firmware/config.txt
|
|
||||||
systemctl disable hciuart.service
|
systemctl disable hciuart.service
|
||||||
|
|
||||||
echo "--- Enable v4l2 driver"
|
# After adding to Raspbian OS
|
||||||
# http://robocraft.ru/blog/electronics/3158.html
|
# https://github.com/RPi-Distro/raspi-config/commit/d6d9ecc0d9cbe4aaa9744ae733b9cb239e79c116
|
||||||
|
#/usr/bin/raspi-config nonint do_serial 2
|
||||||
|
|
||||||
|
# 7. Enable V4L driver http://robocraft.ru/blog/electronics/3158.html
|
||||||
#echo "bcm2835-v4l2" >> /etc/modules
|
#echo "bcm2835-v4l2" >> /etc/modules
|
||||||
|
echo_stamp "#7 Turn on v4l2 driver"
|
||||||
if ! grep -q "^bcm2835-v4l2" /etc/modules;
|
if ! grep -q "^bcm2835-v4l2" /etc/modules;
|
||||||
then printf "bcm2835-v4l2\n" >> /etc/modules
|
then printf "bcm2835-v4l2\n" >> /etc/modules
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo_stamp "#8 End of configure hardware interfaces"
|
||||||
|
|||||||
@@ -13,31 +13,63 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
echo "--- Fix home directory permissions"
|
set -e # Exit immidiately on non-zero result
|
||||||
chmod +rx /home/pi
|
|
||||||
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
NEW_SSID='clover-'$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e "s/[^0-9]//g" | cut -c 1-4)
|
NEW_SSID='clover-'$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e "s/[^0-9]//g" | cut -c 1-4)
|
||||||
echo "--- Creating Wi-Fi AP with SSID=${NEW_SSID}"
|
echo_stamp "Setting SSID to ${NEW_SSID}"
|
||||||
nmcli con add type wifi ifname wlan0 mode ap con-name clover ssid $NEW_SSID autoconnect true \
|
# TODO: Use wpa_cli insted direct file edit
|
||||||
&& nmcli con modify clover 802-11-wireless.band bg \
|
# FIXME: We rely on raspberrypi-net-mods to copy our file to /etc/wpa_supplicant.
|
||||||
&& nmcli con modify clover ipv4.method shared ipv4.address 192.168.11.1/24 \
|
# This is not very reliable, but seems to fix our rfkill problem.
|
||||||
&& nmcli con modify clover ipv6.method disabled \
|
cat << EOF >> /boot/wpa_supplicant.conf
|
||||||
&& nmcli con modify clover wifi-sec.key-mgmt wpa-psk \
|
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||||
&& nmcli con modify clover wifi-sec.psk "cloverwifi" \
|
update_config=1
|
||||||
&& systemctl disable dnsmasq # disable dnsmasq to avoid conflicts with NetworkManager's dnsmasq
|
country=GB
|
||||||
|
network={
|
||||||
|
ssid="${NEW_SSID}"
|
||||||
|
psk="cloverwifi"
|
||||||
|
mode=2
|
||||||
|
proto=WPA RSN
|
||||||
|
key_mgmt=WPA-PSK
|
||||||
|
pairwise=CCMP
|
||||||
|
group=CCMP
|
||||||
|
auth_alg=OPEN
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
NEW_HOSTNAME=$(echo ${NEW_SSID} | tr '[:upper:]' '[:lower:]')
|
NEW_HOSTNAME=$(echo ${NEW_SSID} | tr '[:upper:]' '[:lower:]')
|
||||||
echo "--- Setting hostname to $NEW_HOSTNAME"
|
echo_stamp "Setting hostname to $NEW_HOSTNAME"
|
||||||
hostnamectl set-hostname $NEW_HOSTNAME \
|
hostnamectl set-hostname $NEW_HOSTNAME
|
||||||
&& sed -i 's/127\.0\.1\.1.*/127.0.1.1\t'${NEW_HOSTNAME}' '${NEW_HOSTNAME}'.local/g' /etc/hosts
|
sed -i 's/127\.0\.1\.1.*/127.0.1.1\t'${NEW_HOSTNAME}' '${NEW_HOSTNAME}'.local/g' /etc/hosts
|
||||||
# .local (mdns) hostname added to make it accesable when wlan and ethernet interfaces are down
|
# .local (mdns) hostname added to make it accesable when wlan and ethernet interfaces are down
|
||||||
|
|
||||||
echo "--- Enable ROS services"
|
echo_stamp "Enable ROS services"
|
||||||
systemctl enable roscore
|
systemctl enable roscore
|
||||||
systemctl enable clover
|
systemctl enable clover
|
||||||
|
|
||||||
echo "--- Harware setup"
|
echo_stamp "Harware setup"
|
||||||
/root/hardware_setup.sh
|
/root/hardware_setup.sh
|
||||||
|
|
||||||
echo "--- Remove init scripts"
|
echo_stamp "Remove init scripts"
|
||||||
rm /root/init_rpi.sh /root/hardware_setup.sh
|
rm /root/init_rpi.sh /root/hardware_setup.sh
|
||||||
|
|
||||||
|
echo_stamp "End of initialization of the image"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,122 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
|
|
||||||
#
|
|
||||||
# Script for building ROS packages from scratch
|
|
||||||
#
|
|
||||||
# Copyright (C) 2022 Copter Express Technologies
|
|
||||||
#
|
|
||||||
# Author: Oleg Kalachev <okalachev@gmail.com>
|
|
||||||
#
|
|
||||||
# Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
|
||||||
# The above copyright notice and this permission notice shall be included in all
|
|
||||||
# copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
|
||||||
|
|
||||||
# http://wiki.ros.org/Installation/Source
|
|
||||||
|
|
||||||
export ROS_DISTRO=noetic
|
|
||||||
. /etc/os-release # set $VERSION_CODENAME to Debian release code name
|
|
||||||
export ROS_OS_OVERRIDE=debian:$VERSION_CODENAME
|
|
||||||
export ROS_PYTHON_VERSION=3
|
|
||||||
export CLOVER_DEPS="tf tf2 tf2_ros tf2_geometry_msgs geometry_msgs sensor_msgs visualization_msgs libgeographiclib-dev mavros mavros_extras cv_camera cv_bridge rosbridge_server web_video_server tf2_web_republisher libxml2 libxslt python3-lxml dynamic_reconfigure image_transport image_proc image_geometry python-pymavlink ros_pytest"
|
|
||||||
export CLOVER_DEPS="$CLOVER_DEPS rostest python3-docopt image_publisher"
|
|
||||||
|
|
||||||
echo "=== Building ROS from scratch"
|
|
||||||
|
|
||||||
#echo "--- Adding sources"
|
|
||||||
# echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list
|
|
||||||
# curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
|
|
||||||
|
|
||||||
#cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d # https://askubuntu.com/a/1408456
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y python3-distutils build-essential cmake git python3-pip python3-rosinstall-generator python3-vcstools python3-empy libpoco-dev
|
|
||||||
|
|
||||||
# install vcstool using pip
|
|
||||||
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py && rm get-pip.py
|
|
||||||
pip3 install -U --break-system-packages vcstool rosdep rosinstall-generator catkin-pkg future
|
|
||||||
|
|
||||||
# sudo rosdep init
|
|
||||||
# rm /etc/ros/rosdep/sources.list.d/20-default.list
|
|
||||||
rosdep init
|
|
||||||
rosdep update --os=debian:bullseye
|
|
||||||
|
|
||||||
# rm /etc/ros/rosdep/sources.list.d/20-default.list && rosdep init
|
|
||||||
# rosdep --os=debian:$VERSION_CODENAME update
|
|
||||||
|
|
||||||
echo "--- Create Catkin workspace to build ROS package"
|
|
||||||
mkdir ~/ros_catkin_ws
|
|
||||||
cd ~/ros_catkin_ws
|
|
||||||
|
|
||||||
echo "--- Download ROS sources"
|
|
||||||
rosinstall_generator ros_base $CLOVER_DEPS --rosdistro $ROS_DISTRO --deps --tar > noetic.rosinstall
|
|
||||||
mkdir ./src
|
|
||||||
vcs import --input noetic.rosinstall ./src
|
|
||||||
|
|
||||||
# https://answers.ros.org/question/343367/catkin-package-dependencies-issue-when-installing-ros-melodic-on-raspberry-pi-4/
|
|
||||||
#sudo apt remove python-rospkg
|
|
||||||
#sudo apt remove python-catkin-pkg
|
|
||||||
##sudo apt --fix-broken install
|
|
||||||
#sudo apt-get autoremove
|
|
||||||
|
|
||||||
#echo "--- Install catkin_pkg"
|
|
||||||
#cd
|
|
||||||
#git clone https://github.com/ros-infrastructure/catkin_pkg.git
|
|
||||||
#cd catkin_pkg
|
|
||||||
#python3 setup.py install
|
|
||||||
#cd ~/ros_catkin_ws
|
|
||||||
|
|
||||||
echo "--- Resolve dependencies"
|
|
||||||
rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro $ROS_DISTRO -y --os=debian:bullseye --skip-keys="python3-catkin-pkg-modules libboost-thread python3-rosdep-modules" || true
|
|
||||||
|
|
||||||
echo "--- Install missing dependencies"
|
|
||||||
apt-get install -y liborocos-kdl1.5 geographiclib-tools libgeographiclib-dev
|
|
||||||
|
|
||||||
echo "-- Install geographiclib datasets"
|
|
||||||
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
|
|
||||||
chmod +x install_geographiclib_datasets.sh
|
|
||||||
./install_geographiclib_datasets.sh
|
|
||||||
|
|
||||||
echo "--- Apply patches"
|
|
||||||
wget https://github.com/ros/rosconsole/pull/58.patch
|
|
||||||
patch -p1 -d src/rosconsole < 58.patch
|
|
||||||
|
|
||||||
wget https://github.com/ros/ros_comm/pull/2353.patch
|
|
||||||
patch -p2 -d src/ros_comm < 2353.patch
|
|
||||||
|
|
||||||
wget https://github.com/AJahueyM/web_video_server/commit/5b722eb0822bcc3fe45fefe7b393b87bfe004417.patch
|
|
||||||
patch -p1 -d src/web_video_server < 5b722eb0822bcc3fe45fefe7b393b87bfe004417.patch
|
|
||||||
|
|
||||||
echo "--- Build ROS"
|
|
||||||
# https://github.com/ros/catkin/issues/863#issuecomment-290392074
|
|
||||||
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
|
|
||||||
# -DSETUPTOOLS_DEB_LAYOUT=OFF \
|
|
||||||
# --install-space=/opt/ros/$ROS_DISTRO
|
|
||||||
|
|
||||||
# source ~/ros_catkin_ws/install_isolated/setup.bash
|
|
||||||
#source /opt/ros/$ROS_DISTRO/setup.bash
|
|
||||||
#
|
|
||||||
#echo "--- List built ROS packages"
|
|
||||||
#set +x
|
|
||||||
#rospack list-names | while read line; do echo $line `rosversion $line`; done
|
|
||||||
#set -x
|
|
||||||
#
|
|
||||||
#echo "--- Build Debian packages"
|
|
||||||
#apt-get install -y python3-bloom debhelper dpkg-dev libtinyxml-dev
|
|
||||||
#
|
|
||||||
## add rosdep file to help bloom-generate resolve missing bookworm dependencies
|
|
||||||
#echo "yaml file:///etc/ros/rosdep/noetic-rosdep-clover.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list
|
|
||||||
#rosdep update
|
|
||||||
#
|
|
||||||
#pip3 install setuptools==45.2.0 # https://github.com/ros/catkin/issues/863#issuecomment-1000446018
|
|
||||||
#
|
|
||||||
#for file in `find . -name "package.xml" -not -path "*/debian/*"`; do
|
|
||||||
# cd $(dirname ${file})
|
|
||||||
# rm -rf debian
|
|
||||||
# bloom-generate rosdebian --os-name debian --os-version $VERSION_CODENAME --ros-distro $ROS_DISTRO --debug
|
|
||||||
# debian/rules binary # fakeroot is not needed as we are root
|
|
||||||
# cd -
|
|
||||||
#done
|
|
||||||
|
|
||||||
ls
|
|
||||||
@@ -13,22 +13,42 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
# https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit
|
# https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit
|
||||||
SOURCE_IMAGE="https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-03-15/2024-03-15-raspios-bookworm-armhf-lite.img.xz"
|
SOURCE_IMAGE="https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip"
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:='noninteractive'}
|
export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:='noninteractive'}
|
||||||
export LANG=${LANG:='C.UTF-8'}
|
export LANG=${LANG:='C.UTF-8'}
|
||||||
export LC_ALL=${LC_ALL:='C.UTF-8'}
|
export LC_ALL=${LC_ALL:='C.UTF-8'}
|
||||||
|
|
||||||
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
BUILDER_DIR="/builder"
|
BUILDER_DIR="/builder"
|
||||||
REPO_DIR="${BUILDER_DIR}/repo"
|
REPO_DIR="${BUILDER_DIR}/repo"
|
||||||
SCRIPTS_DIR="${REPO_DIR}/builder"
|
SCRIPTS_DIR="${REPO_DIR}/builder"
|
||||||
IMAGES_DIR="${REPO_DIR}/images"
|
IMAGES_DIR="${REPO_DIR}/images"
|
||||||
|
|
||||||
[[ ! -d ${SCRIPTS_DIR} ]] && (echo "Error: directory ${SCRIPTS_DIR} doesn't exist"; exit 1)
|
[[ ! -d ${SCRIPTS_DIR} ]] && (echo_stamp "Directory ${SCRIPTS_DIR} doesn't exist" "ERROR"; exit 1)
|
||||||
[[ ! -d ${IMAGES_DIR} ]] && mkdir ${IMAGES_DIR} && echo "Directory ${IMAGES_DIR} was created successful"
|
[[ ! -d ${IMAGES_DIR} ]] && mkdir ${IMAGES_DIR} && echo_stamp "Directory ${IMAGES_DIR} was created successful" "SUCCESS"
|
||||||
|
|
||||||
if [[ -z ${TRAVIS_TAG} ]]; then IMAGE_VERSION="$(cd ${REPO_DIR}; git log --format=%h -1)"; else IMAGE_VERSION="${TRAVIS_TAG}"; fi
|
if [[ -z ${TRAVIS_TAG} ]]; then IMAGE_VERSION="$(cd ${REPO_DIR}; git log --format=%h -1)"; else IMAGE_VERSION="${TRAVIS_TAG}"; fi
|
||||||
# IMAGE_VERSION="${TRAVIS_TAG:=$(cd ${REPO_DIR}; git log --format=%h -1)}"
|
# IMAGE_VERSION="${TRAVIS_TAG:=$(cd ${REPO_DIR}; git log --format=%h -1)}"
|
||||||
@@ -44,17 +64,15 @@ get_image() {
|
|||||||
local RPI_IMAGE_NAME=$(echo ${RPI_ZIP_NAME} | sed 's/zip/img/')
|
local RPI_IMAGE_NAME=$(echo ${RPI_ZIP_NAME} | sed 's/zip/img/')
|
||||||
|
|
||||||
if [ ! -e "${BUILD_DIR}/${RPI_ZIP_NAME}" ]; then
|
if [ ! -e "${BUILD_DIR}/${RPI_ZIP_NAME}" ]; then
|
||||||
echo "--- Downloading original Linux distribution"
|
echo_stamp "Downloading original Linux distribution"
|
||||||
wget --progress=dot:giga -O ${BUILD_DIR}/${RPI_ZIP_NAME} $2
|
wget --progress=dot:giga -O ${BUILD_DIR}/${RPI_ZIP_NAME} $2
|
||||||
echo "--- Downloading complete" "SUCCESS"
|
echo_stamp "Downloading complete" "SUCCESS" \
|
||||||
else
|
else echo_stamp "Linux distribution already donwloaded"; fi
|
||||||
echo "Linux distribution already downloaded"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "--- Unzipping Linux distribution image"
|
echo_stamp "Unzipping Linux distribution image" \
|
||||||
apt-get update --allow-releaseinfo-change
|
&& unzip -p ${BUILD_DIR}/${RPI_ZIP_NAME} ${RPI_IMAGE_NAME} > $1 \
|
||||||
apt-get install -y xz-utils
|
&& echo_stamp "Unzipping complete" "SUCCESS" \
|
||||||
unxz --stdout ${BUILD_DIR}/${RPI_ZIP_NAME} > $1
|
|| (echo_stamp "Unzipping was failed!" "ERROR"; exit 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
get_image ${IMAGE_PATH} ${SOURCE_IMAGE}
|
get_image ${IMAGE_PATH} ${SOURCE_IMAGE}
|
||||||
@@ -102,7 +120,6 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/launch.
|
|||||||
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clover.rosinstall' '/home/pi/ros_catkin_ws/'
|
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clover.rosinstall' '/home/pi/ros_catkin_ws/'
|
||||||
# Add rename script
|
# Add rename script
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS}
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS}
|
||||||
#${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-build-ros.sh'
|
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh'
|
||||||
|
|
||||||
${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH}
|
${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH}
|
||||||
|
|||||||
@@ -12,33 +12,53 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
echo "--- Move /etc/ld.so.preload out of the way"
|
echo_stamp() {
|
||||||
mv /etc/ld.so.preload /etc/ld.so.preload.disabled-for-build
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
echo "--- Create pi user"
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
echo 'pi:$6$c70VpvPsVNCG0YR5$l5vWWLsLko9Kj65gcQ8qvMkuOoRkEagI90qi3F/Y7rm8eNYZHW8CY6BOIKwMH7a3YYzZYL90zf304cAHLFaZE0' > /boot/userconf.txt
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_stamp "Write Clover information"
|
||||||
|
|
||||||
echo "--- Write Clover information"
|
|
||||||
# Clover image version
|
# Clover image version
|
||||||
echo "$1" >> /etc/clover_version
|
echo "$1" >> /etc/clover_version
|
||||||
# Origin image file name
|
# Origin image file name
|
||||||
echo "${2%.*}" >> /etc/clover_origin
|
echo "${2%.*}" >> /etc/clover_origin
|
||||||
|
|
||||||
echo "--- Write magic script to /etc/rc.local"
|
echo_stamp "Write magic script to /etc/rc.local"
|
||||||
MAGIC_SCRIPT="sudo /root/init_rpi.sh; sudo sed -i '/sudo \\\/root\\\/init_rpi.sh/d' /etc/rc.local && sudo reboot"
|
MAGIC_SCRIPT="sudo /root/init_rpi.sh; sudo sed -i '/sudo \\\/root\\\/init_rpi.sh/d' /etc/rc.local && sudo reboot"
|
||||||
sed -i "19a${MAGIC_SCRIPT}" /etc/rc.local
|
sed -i "19a${MAGIC_SCRIPT}" /etc/rc.local
|
||||||
# TODO: remake to oneshot systemd service
|
|
||||||
|
|
||||||
# It needs for autosizer.sh & maybe that is correct
|
# It needs for autosizer.sh & maybe that is correct
|
||||||
echo "--- Change boot partition"
|
echo_stamp "Change boot partition"
|
||||||
sed -i 's/root=[^ ]*/root=\/dev\/mmcblk0p2/' /boot/cmdline.txt
|
sed -i 's/root=[^ ]*/root=\/dev\/mmcblk0p2/' /boot/cmdline.txt
|
||||||
sed -i 's/.* \/boot\/firmware vfat defaults 0 2$/\/dev\/mmcblk0p1 \/boot\/firmware vfat defaults 0 2/' /etc/fstab
|
sed -i 's/.* \/boot vfat defaults 0 2$/\/dev\/mmcblk0p1 \/boot vfat defaults 0 2/' /etc/fstab
|
||||||
sed -i 's/.* \/ ext4 defaults,noatime 0 1$/\/dev\/mmcblk0p2 \/ ext4 defaults,noatime 0 1/' /etc/fstab
|
sed -i 's/.* \/ ext4 defaults,noatime 0 1$/\/dev\/mmcblk0p2 \/ ext4 defaults,noatime 0 1/' /etc/fstab
|
||||||
cat /boot/cmdline.txt
|
|
||||||
cat /etc/fstab
|
|
||||||
|
|
||||||
echo "--- Set max space for syslogs"
|
echo_stamp "Set max space for syslogs"
|
||||||
# https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl
|
# https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl
|
||||||
sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/' /etc/systemd/journald.conf
|
sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/' /etc/systemd/journald.conf
|
||||||
|
|
||||||
|
echo_stamp "Move /etc/ld.so.preload out of the way"
|
||||||
|
mv /etc/ld.so.preload /etc/ld.so.preload.disabled-for-build
|
||||||
|
|
||||||
|
echo_stamp "Setup apt so it store all the downloaded packages"
|
||||||
|
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/02keep-debs
|
||||||
|
|
||||||
|
echo_stamp "End of init image"
|
||||||
|
|||||||
@@ -12,20 +12,43 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_stamp "#1 Write STATIC to /etc/dhcpcd.conf"
|
||||||
|
|
||||||
echo "--- Write static to /etc/dhcpcd.conf"
|
|
||||||
cat << EOF >> /etc/dhcpcd.conf
|
cat << EOF >> /etc/dhcpcd.conf
|
||||||
interface wlan0
|
interface wlan0
|
||||||
static ip_address=192.168.11.1/24
|
static ip_address=192.168.11.1/24
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "--- Set wpa_supplicant country"
|
echo_stamp "#2 Set wpa_supplicant country"
|
||||||
|
|
||||||
cat << EOF >> /etc/wpa_supplicant/wpa_supplicant.conf
|
cat << EOF >> /etc/wpa_supplicant/wpa_supplicant.conf
|
||||||
country=GB
|
country=GB
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "--- Write dhcp-config to /etc/dnsmasq.conf"
|
echo_stamp "#3 Write dhcp-config to /etc/dnsmasq.conf"
|
||||||
|
|
||||||
cat << EOF >> /etc/dnsmasq.conf
|
cat << EOF >> /etc/dnsmasq.conf
|
||||||
interface=wlan0
|
interface=wlan0
|
||||||
address=/clover/coex/192.168.11.1
|
address=/clover/coex/192.168.11.1
|
||||||
@@ -36,3 +59,5 @@ bogus-priv
|
|||||||
domain-needed
|
domain-needed
|
||||||
quiet-dhcp6
|
quiet-dhcp6
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
echo_stamp "#4 End of network installation"
|
||||||
|
|||||||
@@ -15,10 +15,34 @@
|
|||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -ex # exit on error, echo commands
|
||||||
|
|
||||||
|
REPO=$1
|
||||||
|
REF=$2
|
||||||
|
INSTALL_ROS_PACK_SOURCES=$3
|
||||||
|
DISCOVER_ROS_PACK=$4
|
||||||
|
NUMBER_THREADS=$5
|
||||||
|
|
||||||
# Current ROS distribution
|
# Current ROS distribution
|
||||||
ROS_DISTRO=noetic
|
ROS_DISTRO=noetic
|
||||||
. /etc/os-release # set $VERSION_CODENAME to Debian release code name
|
|
||||||
export ROS_OS_OVERRIDE=debian:$VERSION_CODENAME
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m$TEXT\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
# https://gist.github.com/letmaik/caa0f6cc4375cbfcc1ff26bd4530c2a3
|
# https://gist.github.com/letmaik/caa0f6cc4375cbfcc1ff26bd4530c2a3
|
||||||
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
||||||
@@ -28,7 +52,7 @@ my_travis_retry() {
|
|||||||
local max_count=5
|
local max_count=5
|
||||||
while [ $count -le $max_count ]; do
|
while [ $count -le $max_count ]; do
|
||||||
[ $result -ne 0 ] && {
|
[ $result -ne 0 ] && {
|
||||||
echo -e "\nThe command \"$*\" failed. Retrying, $count of $max_count.\n" >&2
|
echo -e "\nThe command \"$@\" failed. Retrying, $count of $max_count.\n" >&2
|
||||||
}
|
}
|
||||||
# ! { } ignores set -e, see https://stackoverflow.com/a/4073372
|
# ! { } ignores set -e, see https://stackoverflow.com/a/4073372
|
||||||
! { "$@"; result=$?; }
|
! { "$@"; result=$?; }
|
||||||
@@ -38,66 +62,65 @@ my_travis_retry() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
[ $count -gt $max_count ] && {
|
[ $count -gt $max_count ] && {
|
||||||
echo -e "\nThe command \"$*\" failed $max_count times.\n" >&2
|
echo -e "\nThe command \"$@\" failed $max_count times.\n" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "--- Install rosdep"
|
|
||||||
my_travis_retry pip3 install -U rosdep
|
|
||||||
|
|
||||||
# TODO: 'kinetic-rosdep-clover.yaml' should add only if we use our repo?
|
# TODO: 'kinetic-rosdep-clover.yaml' should add only if we use our repo?
|
||||||
echo "--- Init rosdep"
|
echo_stamp "Init rosdep"
|
||||||
my_travis_retry rosdep init
|
my_travis_retry rosdep init
|
||||||
|
# FIXME: Re-add this after missing packages are built
|
||||||
echo "--- Update rosdep"
|
|
||||||
echo "yaml file:///etc/ros/rosdep/${ROS_DISTRO}-rosdep-clover.yaml" >> /etc/ros/rosdep/sources.list.d/10-clover.list
|
echo "yaml file:///etc/ros/rosdep/${ROS_DISTRO}-rosdep-clover.yaml" >> /etc/ros/rosdep/sources.list.d/10-clover.list
|
||||||
my_travis_retry rosdep update
|
my_travis_retry rosdep update
|
||||||
|
|
||||||
echo "--- Populate rosdep for ROS user"
|
echo_stamp "Populate rosdep for ROS user"
|
||||||
my_travis_retry sudo -u pi ROS_OS_OVERRIDE=debian:$VERSION_CODENAME rosdep update
|
my_travis_retry sudo -u pi rosdep update
|
||||||
|
|
||||||
# echo "Reconfiguring Clover repository for simplier unshallowing"
|
export ROS_IP='127.0.0.1' # needed for running tests
|
||||||
|
|
||||||
|
# echo_stamp "Reconfiguring Clover repository for simplier unshallowing"
|
||||||
cd /home/pi/catkin_ws/src/clover
|
cd /home/pi/catkin_ws/src/clover
|
||||||
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
|
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
|
||||||
|
|
||||||
# This is sort of a hack to force "custom" packages to be installed - the ones built by COEX, linked against OpenCV 4.2
|
# This is sort of a hack to force "custom" packages to be installed - the ones built by COEX, linked against OpenCV 4.2
|
||||||
# I **wish** OpenCV would not be such a mess, but, well, here we are.
|
# I **wish** OpenCV would not be such a mess, but, well, here we are.
|
||||||
# echo "--- Installing OpenCV 4.2-compatible ROS packages"
|
echo_stamp "Installing OpenCV 4.2-compatible ROS packages"
|
||||||
# apt install -y --no-install-recommends \
|
apt install -y --no-install-recommends \
|
||||||
# ros-${ROS_DISTRO}-compressed-image-transport=1.14.0-0buster \
|
ros-${ROS_DISTRO}-compressed-image-transport=1.14.0-0buster \
|
||||||
# ros-${ROS_DISTRO}-cv-bridge=1.15.0-0buster \
|
ros-${ROS_DISTRO}-cv-bridge=1.15.0-0buster \
|
||||||
# ros-${ROS_DISTRO}-cv-camera=0.5.1-0buster \
|
ros-${ROS_DISTRO}-cv-camera=0.5.1-0buster \
|
||||||
# ros-${ROS_DISTRO}-image-publisher=1.15.3-0buster \
|
ros-${ROS_DISTRO}-image-publisher=1.15.3-0buster \
|
||||||
# ros-${ROS_DISTRO}-web-video-server=0.2.1-0buster
|
ros-${ROS_DISTRO}-web-video-server=0.2.1-0buster
|
||||||
# apt-mark hold \
|
apt-mark hold \
|
||||||
# ros-${ROS_DISTRO}-compressed-image-transport \
|
ros-${ROS_DISTRO}-compressed-image-transport \
|
||||||
# ros-${ROS_DISTRO}-cv-bridge \
|
ros-${ROS_DISTRO}-cv-bridge \
|
||||||
# ros-${ROS_DISTRO}-cv-camera \
|
ros-${ROS_DISTRO}-cv-camera \
|
||||||
# ros-${ROS_DISTRO}-image-publisher \
|
ros-${ROS_DISTRO}-image-publisher \
|
||||||
# ros-${ROS_DISTRO}-web-video-server
|
ros-${ROS_DISTRO}-web-video-server
|
||||||
|
|
||||||
#echo "--- Installing libboost-dev" # https://travis-ci.org/github/CopterExpress/clover/jobs/766318908#L6536
|
echo_stamp "Installing libboost-dev" # https://travis-ci.org/github/CopterExpress/clover/jobs/766318908#L6536
|
||||||
#my_travis_retry apt-get install -y --no-install-recommends libboost-dev libboost-all-dev
|
my_travis_retry apt-get install -y --no-install-recommends libboost-dev libboost-all-dev
|
||||||
|
|
||||||
echo "--- Build and install Clover"
|
echo_stamp "Build and install Clover"
|
||||||
cd /home/pi/catkin_ws
|
cd /home/pi/catkin_ws
|
||||||
# Don't try to install gazebo_ros
|
# Don't try to install gazebo_ros
|
||||||
my_travis_retry rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --os=debian:$VERSION_CODENAME \
|
my_travis_retry rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --os=debian:buster \
|
||||||
--skip-keys="gazebo_ros gazebo_plugins"
|
--skip-keys=gazebo_ros --skip-keys=gazebo_plugins
|
||||||
my_travis_retry pip3 install wheel
|
my_travis_retry pip3 install wheel
|
||||||
my_travis_retry pip3 install -r /home/pi/catkin_ws/src/clover/clover/requirements.txt
|
my_travis_retry pip3 install -r /home/pi/catkin_ws/src/clover/clover/requirements.txt
|
||||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||||
|
# Don't build simulation plugins for actual drone
|
||||||
catkin_make -j2 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
catkin_make -j2 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||||
source devel/setup.bash
|
source devel/setup.bash
|
||||||
|
|
||||||
echo "--- Install clever package (for backwards compatibility)"
|
echo_stamp "Install clever package (for backwards compatibility)"
|
||||||
cd /home/pi/catkin_ws/src/clover/builder/assets/clever
|
cd /home/pi/catkin_ws/src/clover/builder/assets/clever
|
||||||
./setup.py install
|
./setup.py install
|
||||||
rm -rf build # remove build artifacts
|
rm -rf build # remove build artifacts
|
||||||
|
|
||||||
echo "--- Build Clover documentation"
|
echo_stamp "Build Clover documentation"
|
||||||
cd /home/pi/catkin_ws/src/clover
|
cd /home/pi/catkin_ws/src/clover
|
||||||
builder/assets/install_gitbook.sh
|
builder/assets/install_gitbook.sh
|
||||||
gitbook install
|
gitbook install
|
||||||
@@ -105,69 +128,64 @@ gitbook build
|
|||||||
# replace assets copy to assets symlink to save space
|
# replace assets copy to assets symlink to save space
|
||||||
rm -rf _book/assets && ln -s ../docs/assets _book/assets
|
rm -rf _book/assets && ln -s ../docs/assets _book/assets
|
||||||
touch node_modules/CATKIN_IGNORE docs/CATKIN_IGNORE _book/CATKIN_IGNORE clover/www/CATKIN_IGNORE apps/CATKIN_IGNORE # ignore documentation files by catkin
|
touch node_modules/CATKIN_IGNORE docs/CATKIN_IGNORE _book/CATKIN_IGNORE clover/www/CATKIN_IGNORE apps/CATKIN_IGNORE # ignore documentation files by catkin
|
||||||
npm cache clean --force
|
|
||||||
|
|
||||||
echo "--- Installing additional ROS packages"
|
echo_stamp "Installing additional ROS packages"
|
||||||
my_travis_retry apt-get install -y --no-install-recommends \
|
my_travis_retry apt-get install -y --no-install-recommends \
|
||||||
ros-${ROS_DISTRO}-rosbridge-suite \
|
ros-${ROS_DISTRO}-rosbridge-suite \
|
||||||
ros-${ROS_DISTRO}-rosserial \
|
ros-${ROS_DISTRO}-rosserial \
|
||||||
ros-${ROS_DISTRO}-usb-cam \
|
ros-${ROS_DISTRO}-usb-cam \
|
||||||
ros-${ROS_DISTRO}-vl53l1x \
|
ros-${ROS_DISTRO}-vl53l1x \
|
||||||
ros-${ROS_DISTRO}-ws281x \
|
ros-${ROS_DISTRO}-ws281x \
|
||||||
ros-${ROS_DISTRO}-libcamera-ros \
|
|
||||||
ros-${ROS_DISTRO}-rosshow \
|
ros-${ROS_DISTRO}-rosshow \
|
||||||
ros-${ROS_DISTRO}-cmake-modules \
|
ros-${ROS_DISTRO}-cmake-modules \
|
||||||
ros-${ROS_DISTRO}-image-view \
|
ros-${ROS_DISTRO}-image-view \
|
||||||
ros-${ROS_DISTRO}-nodelet-topic-tools \
|
ros-${ROS_DISTRO}-nodelet-topic-tools \
|
||||||
ros-${ROS_DISTRO}-stereo-msgs \
|
ros-${ROS_DISTRO}-stereo-msgs
|
||||||
ros-${ROS_DISTRO}-vision-msgs
|
|
||||||
|
|
||||||
# TODO move GeographicLib datasets to Mavros debian package
|
# TODO move GeographicLib datasets to Mavros debian package
|
||||||
echo "--- Install GeographicLib datasets (needed for mavros)" \
|
echo_stamp "Install GeographicLib datasets (needed for mavros)" \
|
||||||
&& wget -qO- https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | bash
|
&& wget -qO- https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | bash
|
||||||
|
|
||||||
echo "--- Running tests"
|
echo_stamp "Running tests"
|
||||||
export ROS_IP='127.0.0.1' # needed for running tests
|
|
||||||
cd /home/pi/catkin_ws
|
cd /home/pi/catkin_ws
|
||||||
# FIXME: Investigate failing tests
|
# FIXME: Investigate failing tests
|
||||||
catkin_make run_tests #&& catkin_test_results
|
catkin_make run_tests #&& catkin_test_results
|
||||||
|
|
||||||
echo "--- Change permissions for catkin_ws"
|
echo_stamp "Change permissions for catkin_ws"
|
||||||
chown -Rf pi:pi /home/pi/catkin_ws
|
chown -Rf pi:pi /home/pi/catkin_ws
|
||||||
|
|
||||||
echo "--- Update www"
|
echo_stamp "Update www"
|
||||||
sudo -u pi sh -c ". devel/setup.sh && rosrun clover www"
|
sudo -u pi sh -c ". devel/setup.sh && rosrun clover www"
|
||||||
|
|
||||||
echo "--- Make \$HOME/examples symlink"
|
echo_stamp "Make \$HOME/examples symlink"
|
||||||
ln -s "$(catkin_find clover examples --first-only)" /home/pi
|
ln -s "$(catkin_find clover examples --first-only)" /home/pi
|
||||||
chown -Rf pi:pi /home/pi/examples
|
chown -Rf pi:pi /home/pi/examples
|
||||||
|
|
||||||
echo "--- Make systemd services symlinks"
|
echo_stamp "Make systemd services symlinks"
|
||||||
ln -s /home/pi/catkin_ws/src/clover/builder/assets/clover.service /lib/systemd/system/
|
ln -s /home/pi/catkin_ws/src/clover/builder/assets/clover.service /lib/systemd/system/
|
||||||
ln -s /home/pi/catkin_ws/src/clover/builder/assets/roscore.service /lib/systemd/system/
|
ln -s /home/pi/catkin_ws/src/clover/builder/assets/roscore.service /lib/systemd/system/
|
||||||
# validate
|
# validate
|
||||||
[ -f /lib/systemd/system/clover.service ]
|
[ -f /lib/systemd/system/clover.service ]
|
||||||
[ -f /lib/systemd/system/roscore.service ]
|
[ -f /lib/systemd/system/roscore.service ]
|
||||||
|
|
||||||
echo "--- Make udev rules symlink"
|
echo_stamp "Make udev rules symlink"
|
||||||
ln -s "$(catkin_find clover udev --first-only)"/* /lib/udev/rules.d/
|
ln -s "$(catkin_find clover udev --first-only)"/* /lib/udev/rules.d/
|
||||||
|
|
||||||
echo "--- Setup ROS environment"
|
echo_stamp "Setup ROS environment"
|
||||||
cat << EOF >> /home/pi/.bashrc
|
cat << EOF >> /home/pi/.bashrc
|
||||||
LANG='C.UTF-8'
|
LANG='C.UTF-8'
|
||||||
LC_ALL='C.UTF-8'
|
LC_ALL='C.UTF-8'
|
||||||
export ROS_HOSTNAME=\`hostname\`.local
|
export ROS_HOSTNAME=\`hostname\`.local
|
||||||
export ROS_OS_OVERRIDE=debian:bookworm
|
|
||||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||||
source /home/pi/catkin_ws/devel/setup.bash
|
source /home/pi/catkin_ws/devel/setup.bash
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "--- Cleanup apt"
|
#echo_stamp "Removing local apt mirror"
|
||||||
apt-get autoremove --purge -y
|
# Restore original sources.list
|
||||||
apt-get clean
|
#mv /var/sources.list.bak /etc/apt/sources.list
|
||||||
|
# Clean apt cache
|
||||||
|
# apt-get clean -qq > /dev/null
|
||||||
|
# Remove local mirror repository key
|
||||||
|
#apt-key del COEX-MIRROR
|
||||||
|
|
||||||
echo "--- Cleanup pip"
|
echo_stamp "END of ROS INSTALLATION"
|
||||||
pip3 cache purge
|
|
||||||
|
|
||||||
echo "--- Cleanup /tmp"
|
|
||||||
rm -rf /tmp/*
|
|
||||||
|
|||||||
@@ -12,9 +12,27 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
. /etc/os-release # set $VERSION_CODENAME to Debian release code name
|
echo_stamp() {
|
||||||
|
# TEMPLATE: echo_stamp <TEXT> <TYPE>
|
||||||
|
# TYPE: SUCCESS, ERROR, INFO
|
||||||
|
|
||||||
|
# More info there https://www.shellhacks.com/ru/bash-colors/
|
||||||
|
|
||||||
|
TEXT="$(date '+[%Y-%m-%d %H:%M:%S]') $1"
|
||||||
|
TEXT="\e[1m${TEXT}\e[0m" # BOLD
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
SUCCESS)
|
||||||
|
TEXT="\e[32m${TEXT}\e[0m";; # GREEN
|
||||||
|
ERROR)
|
||||||
|
TEXT="\e[31m${TEXT}\e[0m";; # RED
|
||||||
|
*)
|
||||||
|
TEXT="\e[34m${TEXT}\e[0m";; # BLUE
|
||||||
|
esac
|
||||||
|
echo -e ${TEXT}
|
||||||
|
}
|
||||||
|
|
||||||
# https://gist.github.com/letmaik/caa0f6cc4375cbfcc1ff26bd4530c2a3
|
# https://gist.github.com/letmaik/caa0f6cc4375cbfcc1ff26bd4530c2a3
|
||||||
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
||||||
@@ -23,7 +41,7 @@ my_travis_retry() {
|
|||||||
local count=1
|
local count=1
|
||||||
while [ $count -le 3 ]; do
|
while [ $count -le 3 ]; do
|
||||||
[ $result -ne 0 ] && {
|
[ $result -ne 0 ] && {
|
||||||
echo -e "\n${ANSI_RED}The command \"$*\" failed. Retrying, $count of 3.${ANSI_RESET}\n" >&2
|
echo -e "\n${ANSI_RED}The command \"$@\" failed. Retrying, $count of 3.${ANSI_RESET}\n" >&2
|
||||||
}
|
}
|
||||||
# ! { } ignores set -e, see https://stackoverflow.com/a/4073372
|
# ! { } ignores set -e, see https://stackoverflow.com/a/4073372
|
||||||
! { "$@"; result=$?; }
|
! { "$@"; result=$?; }
|
||||||
@@ -33,39 +51,41 @@ my_travis_retry() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
[ $count -gt 3 ] && {
|
[ $count -gt 3 ] && {
|
||||||
echo -e "\n${ANSI_RED}The command \"$*\" failed 3 times.${ANSI_RESET}\n" >&2
|
echo -e "\n${ANSI_RED}The command \"$@\" failed 3 times.${ANSI_RESET}\n" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "--- Increase apt retries"
|
echo_stamp "Increase apt retries"
|
||||||
|
|
||||||
echo "APT::Acquire::Retries \"3\";" > /etc/apt/apt.conf.d/80-retries
|
echo "APT::Acquire::Retries \"3\";" > /etc/apt/apt.conf.d/80-retries
|
||||||
|
|
||||||
echo "--- Install apt keys & repos"
|
echo_stamp "Install apt keys & repos"
|
||||||
|
|
||||||
# TODO: This STDOUT consist 'OK'
|
# TODO: This STDOUT consist 'OK'
|
||||||
apt-get update \
|
apt-get update \
|
||||||
&& apt-get install --no-install-recommends -y dirmngr > /dev/null \
|
&& apt-get install --no-install-recommends -y dirmngr > /dev/null \
|
||||||
&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
|
&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
|
||||||
|
|
||||||
# echo "deb http://packages.ros.org/ros/ubuntu buster main" > /etc/apt/sources.list.d/ros-latest.list
|
echo "deb http://packages.ros.org/ros/ubuntu buster main" > /etc/apt/sources.list.d/ros-latest.list
|
||||||
|
|
||||||
wget -O - 'http://packages.coex.tech/key.asc' | apt-key add -
|
wget -O - 'http://packages.coex.tech/key.asc' | apt-key add -
|
||||||
echo "deb http://packages.coex.tech $VERSION_CODENAME main" >> /etc/apt/sources.list
|
echo 'deb http://packages.coex.tech buster main' >> /etc/apt/sources.list
|
||||||
|
|
||||||
echo "--- Update apt cache"
|
echo_stamp "Update apt cache"
|
||||||
|
|
||||||
# TODO: FIX ERROR: /usr/bin/apt-key: 596: /usr/bin/apt-key: cannot create /dev/null: Permission denied
|
# TODO: FIX ERROR: /usr/bin/apt-key: 596: /usr/bin/apt-key: cannot create /dev/null: Permission denied
|
||||||
apt-get update
|
apt-get update
|
||||||
# && apt upgrade -y
|
# && apt upgrade -y
|
||||||
|
|
||||||
# Let's retry fetching those packages several times, just in case
|
# Let's retry fetching those packages several times, just in case
|
||||||
echo "--- Install software"
|
echo_stamp "Software installing"
|
||||||
my_travis_retry apt-get install --no-install-recommends -y cmake-data cmake
|
my_travis_retry apt-get install --no-install-recommends -y cmake-data=3.13.4-1 cmake=3.13.4-1 # FIXME: using older CMake due to https://travis-ci.org/github/CopterExpress/clover/jobs/764367665#L6984
|
||||||
my_travis_retry apt-get install --no-install-recommends -y \
|
my_travis_retry apt-get install --no-install-recommends -y \
|
||||||
unzip \
|
unzip \
|
||||||
zip \
|
zip \
|
||||||
|
ipython \
|
||||||
ipython3 \
|
ipython3 \
|
||||||
screen \
|
screen \
|
||||||
byobu \
|
byobu \
|
||||||
@@ -76,57 +96,64 @@ dnsmasq \
|
|||||||
tmux \
|
tmux \
|
||||||
tree \
|
tree \
|
||||||
vim \
|
vim \
|
||||||
|
libjpeg8 \
|
||||||
tcpdump \
|
tcpdump \
|
||||||
libpoco-dev \
|
libpoco-dev \
|
||||||
libzbar0 \
|
libzbar0 \
|
||||||
|
python3-rosdep \
|
||||||
python3-rosinstall-generator \
|
python3-rosinstall-generator \
|
||||||
python3-wstool \
|
python3-wstool \
|
||||||
python3-rosinstall \
|
python3-rosinstall \
|
||||||
build-essential \
|
build-essential \
|
||||||
libffi-dev \
|
libffi-dev \
|
||||||
monkey \
|
monkey \
|
||||||
pigpio python3-pigpio \
|
pigpio python-pigpio python3-pigpio \
|
||||||
i2c-tools \
|
i2c-tools \
|
||||||
espeak espeak-data python3-espeak \
|
espeak espeak-data python-espeak python3-espeak \
|
||||||
ntpdate \
|
ntpdate \
|
||||||
mjpg-streamer \
|
python-dev \
|
||||||
xxd \
|
|
||||||
python3-dev \
|
python3-dev \
|
||||||
python3-systemd \
|
python-systemd \
|
||||||
python3-opencv \
|
mjpg-streamer \
|
||||||
python3-pip
|
python3-opencv
|
||||||
#libjpeg8 \
|
|
||||||
|
|
||||||
# Deny byobu to check available updates
|
# Deny byobu to check available updates
|
||||||
sed -i "s/updates_available//" /usr/share/byobu/status/status
|
sed -i "s/updates_available//" /usr/share/byobu/status/status
|
||||||
# sed -i "s/updates_available//" /home/pi/.byobu/status
|
# sed -i "s/updates_available//" /home/pi/.byobu/status
|
||||||
|
|
||||||
echo "--- Make sure pip is installed"
|
echo_stamp "Installing pip"
|
||||||
|
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||||
|
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip2.py
|
||||||
|
python3 get-pip.py
|
||||||
|
python get-pip2.py
|
||||||
|
rm get-pip.py get-pip2.py
|
||||||
|
#my_travis_retry pip install --upgrade pip
|
||||||
|
#my_travis_retry pip3 install --upgrade pip
|
||||||
|
|
||||||
|
echo_stamp "Make sure both pip and pip3 are installed"
|
||||||
pip --version
|
pip --version
|
||||||
pip3 --version
|
pip3 --version
|
||||||
|
|
||||||
echo "--- Enable installing packages with pip"
|
echo_stamp "Install and enable Butterfly (web terminal)"
|
||||||
mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.old
|
echo_stamp "Workaround for tornado >= 6.0 breaking butterfly"
|
||||||
|
|
||||||
echo "--- Install and enable Butterfly (web terminal)"
|
|
||||||
export CRYPTOGRAPHY_DONT_BUILD_RUST=1
|
export CRYPTOGRAPHY_DONT_BUILD_RUST=1
|
||||||
my_travis_retry pip3 install cryptography==3.4.6 # https://stackoverflow.com/a/68472128/6850197
|
my_travis_retry pip3 install cryptography==3.4.6 # https://stackoverflow.com/a/68472128/6850197
|
||||||
#my_travis_retry pip3 install pyOpenSSL==20.0.1
|
my_travis_retry pip3 install pyOpenSSL==20.0.1
|
||||||
#my_travis_retry pip3 install tornado==5.1.1
|
my_travis_retry pip3 install tornado==5.1.1
|
||||||
my_travis_retry pip3 install butterfly
|
my_travis_retry pip3 install butterfly
|
||||||
my_travis_retry pip3 install butterfly[systemd]
|
my_travis_retry pip3 install butterfly[systemd]
|
||||||
systemctl enable butterfly.socket
|
systemctl enable butterfly.socket
|
||||||
|
|
||||||
echo "--- Install ws281x library"
|
echo_stamp "Install ws281x library"
|
||||||
my_travis_retry pip3 install --prefer-binary rpi_ws281x
|
my_travis_retry pip3 install --prefer-binary rpi_ws281x
|
||||||
|
|
||||||
echo "--- Setup Monkey"
|
echo_stamp "Setup Monkey"
|
||||||
mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
|
mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
|
||||||
mv /root/monkey /etc/monkey/sites/default
|
mv /root/monkey /etc/monkey/sites/default
|
||||||
sed -i 's/SymLink Off/SymLink On/' /etc/monkey/monkey.conf
|
sed -i 's/SymLink Off/SymLink On/' /etc/monkey/monkey.conf
|
||||||
systemctl enable monkey.service
|
systemctl enable monkey.service
|
||||||
|
|
||||||
echo "--- Install Node.js"
|
echo_stamp "Install Node.js"
|
||||||
cd /home/pi
|
cd /home/pi
|
||||||
wget --no-verbose https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz
|
wget --no-verbose https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz
|
||||||
tar -xzf node-v10.15.0-linux-armv6l.tar.gz
|
tar -xzf node-v10.15.0-linux-armv6l.tar.gz
|
||||||
@@ -134,24 +161,28 @@ cp -R node-v10.15.0-linux-armv6l/* /usr/local/
|
|||||||
rm -rf node-v10.15.0-linux-armv6l/
|
rm -rf node-v10.15.0-linux-armv6l/
|
||||||
rm node-v10.15.0-linux-armv6l.tar.gz
|
rm node-v10.15.0-linux-armv6l.tar.gz
|
||||||
|
|
||||||
echo "--- Installing debugpy"
|
echo_stamp "Installing ptvsd"
|
||||||
my_travis_retry pip3 install debugpy
|
my_travis_retry pip install ptvsd
|
||||||
|
my_travis_retry pip3 install ptvsd
|
||||||
|
|
||||||
echo "--- Installing pyzbar"
|
echo_stamp "Installing pyzbar"
|
||||||
|
my_travis_retry pip install pyzbar
|
||||||
my_travis_retry pip3 install pyzbar
|
my_travis_retry pip3 install pyzbar
|
||||||
|
|
||||||
echo "--- Add .vimrc"
|
echo_stamp "Add .vimrc"
|
||||||
cat << EOF > /home/pi/.vimrc
|
cat << EOF > /home/pi/.vimrc
|
||||||
set mouse-=a
|
set mouse-=a
|
||||||
syntax on
|
syntax on
|
||||||
autocmd BufNewFile,BufRead *.launch set syntax=xml
|
autocmd BufNewFile,BufRead *.launch set syntax=xml
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "--- Change default keyboard layout to US"
|
echo_stamp "Change default keyboard layout to US"
|
||||||
sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/g' /etc/default/keyboard
|
sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/g' /etc/default/keyboard
|
||||||
|
|
||||||
echo "--- Attempting to kill dirmngr"
|
echo_stamp "Attempting to kill dirmngr"
|
||||||
gpgconf --kill dirmngr
|
gpgconf --kill dirmngr
|
||||||
# dirmngr is only used by apt-key, so we can safely kill it.
|
# dirmngr is only used by apt-key, so we can safely kill it.
|
||||||
# We ignore pkill's exit value as well.
|
# We ignore pkill's exit value as well.
|
||||||
pkill -9 -f dirmngr || true
|
pkill -9 -f dirmngr || true
|
||||||
|
|
||||||
|
echo_stamp "End of software installation"
|
||||||
|
|||||||
@@ -12,33 +12,32 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -ex
|
||||||
|
|
||||||
|
echo "Run image tests"
|
||||||
echo "--- Run image tests"
|
|
||||||
|
|
||||||
export ROS_DISTRO='noetic'
|
export ROS_DISTRO='noetic'
|
||||||
export ROS_IP='127.0.0.1'
|
export ROS_IP='127.0.0.1'
|
||||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||||
source /home/pi/catkin_ws/devel/setup.bash
|
source /home/pi/catkin_ws/devel/setup.bash
|
||||||
|
systemctl start roscore
|
||||||
|
|
||||||
cd /home/pi/catkin_ws/src/clover/builder/test/
|
cd /home/pi/catkin_ws/src/clover/builder/test/
|
||||||
./tests.sh
|
./tests.sh
|
||||||
./tests.py
|
./tests.py
|
||||||
|
./tests_py3.py
|
||||||
[[ $(./test_qr.py) == "Found QRCODE with data Проверка Unicode with center at x=66.0, y=66.0" ]]
|
[[ $(./test_qr.py) == "Found QRCODE with data Проверка Unicode with center at x=66.0, y=66.0" ]]
|
||||||
[[ $(./tests_clever.py) == "Warning: clever package is renamed to clover" ]] # test backwards compatibility
|
[[ $(./tests_clever.py) == "Warning: clever package is renamed to clover" ]] # test backwards compatibility
|
||||||
|
|
||||||
|
systemctl stop roscore
|
||||||
|
|
||||||
# check documented packages available
|
# check documented packages available
|
||||||
apt-cache show gst-rtsp-launch
|
apt-cache show gst-rtsp-launch
|
||||||
apt-cache show openvpn
|
apt-cache show openvpn
|
||||||
|
|
||||||
|
echo "Move /etc/ld.so.preload back to its original position"
|
||||||
|
mv /etc/ld.so.preload.disabled-for-build /etc/ld.so.preload
|
||||||
|
|
||||||
echo "Largest packages installed"
|
echo "Largest packages installed"
|
||||||
sudo -E sh -c 'apt-get install -y debian-goodies'
|
sudo -E sh -c 'apt-get install -y debian-goodies'
|
||||||
dpigs -H -n 100
|
dpigs -H -n 100
|
||||||
|
|
||||||
echo "Cleanup apt"
|
|
||||||
apt-get autoremove --purge -y
|
|
||||||
apt-get clean
|
|
||||||
|
|
||||||
echo "Move /etc/ld.so.preload back to its original position"
|
|
||||||
mv /etc/ld.so.preload.disabled-for-build /etc/ld.so.preload
|
|
||||||
|
|||||||
@@ -23,10 +23,6 @@ from clover.srv import GetTelemetry, Navigate, NavigateGlobal, SetPosition, SetV
|
|||||||
from led_msgs.srv import SetLEDs
|
from led_msgs.srv import SetLEDs
|
||||||
from led_msgs.msg import LEDStateArray, LEDState
|
from led_msgs.msg import LEDStateArray, LEDState
|
||||||
from aruco_pose.msg import Marker, MarkerArray, Point2D
|
from aruco_pose.msg import Marker, MarkerArray, Point2D
|
||||||
from vision_msgs.msg import BoundingBox2D, BoundingBox2DArray, BoundingBox3D, BoundingBox3DArray, \
|
|
||||||
Classification2D, Classification3D, Detection2D, Detection2DArray, Detection3D, Detection3DArray, \
|
|
||||||
ObjectHypothesis, ObjectHypothesisWithPose, VisionInfo
|
|
||||||
|
|
||||||
from clover import long_callback
|
from clover import long_callback
|
||||||
|
|
||||||
import dynamic_reconfigure.client
|
import dynamic_reconfigure.client
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set -ex # exit on error, echo commands
|
set -ex
|
||||||
|
|
||||||
# TODO: validate versions
|
# TODO: validate versions
|
||||||
|
|
||||||
# validate required software is installed
|
# validate required software is installed
|
||||||
|
|
||||||
|
python2 --version
|
||||||
python3 --version
|
python3 --version
|
||||||
ipython3 --version
|
ipython3 --version
|
||||||
|
|
||||||
@@ -21,28 +22,30 @@ pip --version
|
|||||||
pip3 --version
|
pip3 --version
|
||||||
tcpdump --version
|
tcpdump --version
|
||||||
monkey --version
|
monkey --version
|
||||||
espeak --version
|
# espeak --version
|
||||||
xxd --version
|
|
||||||
systemctl --version
|
systemctl --version
|
||||||
|
|
||||||
if [ -z $VM ]; then
|
if [ -z $VM ]; then
|
||||||
# rpi only software
|
# rpi only software
|
||||||
python --version
|
python --version
|
||||||
[[ $(python -c 'import sys;print(sys.version_info.major)') == "3" ]]
|
ipython --version
|
||||||
|
pip2 --version
|
||||||
|
# `python` is python2 for now
|
||||||
|
[[ $(python -c 'import sys;print(sys.version_info.major)') == "2" ]]
|
||||||
|
|
||||||
python -m debugpy --version
|
# ptvsd does not have a stand-alone binary
|
||||||
python3 -m debugpy --version
|
python -m ptvsd --version
|
||||||
|
python3 -m ptvsd --version
|
||||||
|
|
||||||
pigpiod -v
|
pigpiod -v
|
||||||
i2cdetect -V
|
i2cdetect -V
|
||||||
/usr/local/bin/butterfly.server.py --help
|
butterfly -h
|
||||||
mjpg_streamer --version
|
mjpg_streamer --version
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ros stuff
|
# ros stuff
|
||||||
|
|
||||||
roscore -h
|
roscore -h
|
||||||
catkin_find
|
|
||||||
rosversion clover
|
rosversion clover
|
||||||
rosversion aruco_pose
|
rosversion aruco_pose
|
||||||
rosversion mavros
|
rosversion mavros
|
||||||
@@ -58,14 +61,14 @@ rosversion web_video_server
|
|||||||
rosversion nodelet
|
rosversion nodelet
|
||||||
rosversion image_view
|
rosversion image_view
|
||||||
|
|
||||||
[[ $(rosversion ws281x) == "0.0.15" ]]
|
[[ $(rosversion ws281x) == "0.0.13" ]]
|
||||||
|
|
||||||
if [ -z $VM ]; then
|
if [ -z $VM ]; then
|
||||||
# rosversion compressed_image_transport
|
rosversion compressed_image_transport
|
||||||
rosversion rosshow
|
rosversion rosshow
|
||||||
rosversion vl53l1x
|
rosversion vl53l1x
|
||||||
rosversion rosserial
|
rosversion rosserial
|
||||||
[[ $(rosversion cv_camera) == "0.6.1" ]] # patched version with init fix
|
[[ $(rosversion cv_camera) == "0.5.1" ]] # patched version with init fix
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# determine user home directory
|
# determine user home directory
|
||||||
|
|||||||
8
builder/test/tests_py3.py
Executable file
8
builder/test/tests_py3.py
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Make sure our Python 3 software is installed
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
from pyzbar import pyzbar
|
||||||
|
|
||||||
|
print(cv2.getBuildInformation())
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 415.5985593268293
|
|
||||||
- 0.0
|
|
||||||
- 400.0
|
|
||||||
- 0.0
|
|
||||||
- 312.35267324512984
|
|
||||||
- 225.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 720
|
|
||||||
image_width: 1280
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 415.5985593268293
|
|
||||||
- 0.0
|
|
||||||
- 405.4752811707317
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 312.35267324512984
|
|
||||||
- 205.91677004464282
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1246.7956779804879
|
|
||||||
- 0.0
|
|
||||||
- 1200.0
|
|
||||||
- 0.0
|
|
||||||
- 702.7935148015422
|
|
||||||
- 506.25
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 1080
|
|
||||||
image_width: 1920
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 1246.7956779804879
|
|
||||||
- 0.0
|
|
||||||
- 1216.4258435121951
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 702.7935148015422
|
|
||||||
- 463.31273260044634
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 5049.522495820976
|
|
||||||
- 0.0
|
|
||||||
- 4860.0
|
|
||||||
- 0.0
|
|
||||||
- 2846.313734946246
|
|
||||||
- 2050.3125
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 1944
|
|
||||||
image_width: 2592
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 5049.522495820976
|
|
||||||
- 0.0
|
|
||||||
- 4926.52466622439
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 2846.313734946246
|
|
||||||
- 1876.4165670318075
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 166.23942373073172
|
|
||||||
- 0.0
|
|
||||||
- 160.0
|
|
||||||
- 0.0
|
|
||||||
- 166.5880923974026
|
|
||||||
- 120.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 240
|
|
||||||
image_width: 320
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 166.23942373073172
|
|
||||||
- 0.0
|
|
||||||
- 162.19011246829268
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 166.5880923974026
|
|
||||||
- 109.82227735714285
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 30297.13497492585
|
|
||||||
- 0.0
|
|
||||||
- 29160.0
|
|
||||||
- 0.0
|
|
||||||
- 12808.411807258106
|
|
||||||
- 9226.40625
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 2160
|
|
||||||
image_width: 3840
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 30297.13497492585
|
|
||||||
- 0.0
|
|
||||||
- 29559.14799734634
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 12808.411807258106
|
|
||||||
- 8443.874551643134
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 192008.0929035926
|
|
||||||
- 0.0
|
|
||||||
- 184801.5
|
|
||||||
- 0.0
|
|
||||||
- 81119.941445968
|
|
||||||
- 58433.90625
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 3040
|
|
||||||
image_width: 4056
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 192008.0929035926
|
|
||||||
- 0.0
|
|
||||||
- 187331.10043318244
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 81119.941445968
|
|
||||||
- 53477.87216040651
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 166.23942373073172
|
|
||||||
- 0.0
|
|
||||||
- 160.0
|
|
||||||
- 0.0
|
|
||||||
- 166.5880923974026
|
|
||||||
- 120.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 480
|
|
||||||
image_width: 640
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 166.23942373073172
|
|
||||||
- 0.0
|
|
||||||
- 162.19011246829268
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 166.5880923974026
|
|
||||||
- 109.82227735714285
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Generated from fisheye_cam.yaml by rescale_camera_info.py
|
|
||||||
camera_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 207.79927966341464
|
|
||||||
- 0.0
|
|
||||||
- 200.0
|
|
||||||
- 0.0
|
|
||||||
- 208.23511549675322
|
|
||||||
- 150.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
rows: 3
|
|
||||||
camera_name: main_camera_optical
|
|
||||||
distortion_coefficients:
|
|
||||||
cols: 8
|
|
||||||
data:
|
|
||||||
- 0.215356885
|
|
||||||
- -0.117472846
|
|
||||||
- -0.000306197672
|
|
||||||
- -0.000109444025
|
|
||||||
- -0.00453657258
|
|
||||||
- 0.573090623
|
|
||||||
- -0.127574577
|
|
||||||
- -0.0286125589
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
rows: 1
|
|
||||||
distortion_model: plumb_bob
|
|
||||||
image_height: 600
|
|
||||||
image_width: 800
|
|
||||||
projection_matrix:
|
|
||||||
cols: 4
|
|
||||||
data:
|
|
||||||
- 207.79927966341464
|
|
||||||
- 0.0
|
|
||||||
- 202.73764058536585
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 208.23511549675322
|
|
||||||
- 137.27784669642855
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 0.0
|
|
||||||
- 1.0
|
|
||||||
- 0.0
|
|
||||||
rows: 3
|
|
||||||
rectification_matrix:
|
|
||||||
cols: 3
|
|
||||||
data:
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 1
|
|
||||||
rows: 3
|
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<param name="dictionary" value="2"/> <!-- DICT_4X4_250 -->
|
<param name="dictionary" value="2"/> <!-- DICT_4X4_250 -->
|
||||||
<param name="estimate_poses" value="true"/>
|
<param name="estimate_poses" value="true"/>
|
||||||
<param name="send_tf" value="true"/>
|
<param name="send_tf" value="true"/>
|
||||||
<param name="use_map_markers" value="$(arg aruco_map)"/>
|
<param name="use_map_markers" value="true"/>
|
||||||
<param name="known_vertical" value="map" if="$(eval placement == 'floor' or placement == 'ceiling')"/>
|
<param name="known_vertical" value="map" if="$(eval placement == 'floor' or placement == 'ceiling')"/>
|
||||||
<param name="flip_vertical" value="true" if="$(eval placement == 'ceiling')"/>
|
<param name="flip_vertical" value="true" if="$(eval placement == 'ceiling')"/>
|
||||||
<param name="length" value="$(arg length)"/>
|
<param name="length" value="$(arg length)"/>
|
||||||
|
|||||||
@@ -3,12 +3,7 @@
|
|||||||
|
|
||||||
<arg name="direction_z" default="down"/> <!-- direction the camera points: down, up -->
|
<arg name="direction_z" default="down"/> <!-- direction the camera points: down, up -->
|
||||||
<arg name="direction_y" default="backward"/> <!-- direction the camera cable points: backward, forward -->
|
<arg name="direction_y" default="backward"/> <!-- direction the camera cable points: backward, forward -->
|
||||||
<arg name="type" default="libcamera"/> <!-- camera interface: libcamera, v4l2 -->
|
<arg name="device" default="/dev/video0"/> <!-- v4l2 device -->
|
||||||
<arg name="camera_id" default="0"/> <!-- libcamera camera id -->
|
|
||||||
<arg name="device" default="/dev/video0"/> <!-- v4l2 device path -->
|
|
||||||
<arg name="width" default="320"/>
|
|
||||||
<arg name="height" default="240"/>
|
|
||||||
<arg name="fps" default="40"/>
|
|
||||||
<arg name="throttled_topic" default="true"/> <!-- enable throttled image topic -->
|
<arg name="throttled_topic" default="true"/> <!-- enable throttled image topic -->
|
||||||
<arg name="throttled_topic_rate" default="5.0"/> <!-- throttled image topic rate -->
|
<arg name="throttled_topic_rate" default="5.0"/> <!-- throttled image topic rate -->
|
||||||
<arg name="rectify" default="false"/> <!-- enable rectification -->
|
<arg name="rectify" default="false"/> <!-- enable rectification -->
|
||||||
@@ -31,34 +26,20 @@
|
|||||||
<param name="num_worker_threads" value="2"/>
|
<param name="num_worker_threads" value="2"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<!-- camera node using libcamera -->
|
<!-- camera node -->
|
||||||
<node pkg="nodelet" type="nodelet" name="main_camera" args="load libcamera_ros/LibcameraRos main_camera_nodelet_manager" output="screen" clear_params="true" if="$(eval not simulator and type == 'libcamera')" respawn="true">
|
<node pkg="nodelet" type="nodelet" name="main_camera" args="load cv_camera/CvCameraNodelet main_camera_nodelet_manager" launch-prefix="rosrun clover waitfile $(arg device)" clear_params="true" unless="$(arg simulator)" respawn="true">
|
||||||
<param name="camera_name" value=""/>
|
|
||||||
<param name="camera_id" value="$(arg camera_id)"/>
|
|
||||||
<param name="frame_id" value="main_camera_optical"/>
|
|
||||||
<param name="calib_url" type="string" value="file://$(find clover)/camera_info/fisheye_cam_$(arg width)x$(arg height).yaml"/>
|
|
||||||
<param name="stream_role" value="still"/>
|
|
||||||
<param name="pixel_format" value="RGB888"/>
|
|
||||||
<param name="use_ros_time" value="true"/>
|
|
||||||
<param name="resolution/width" value="$(arg width)"/>
|
|
||||||
<param name="resolution/height" value="$(arg height)"/>
|
|
||||||
|
|
||||||
<!-- see: https://github.com/ctu-mrs/libcamera_ros/blob/b3645/config/param.yaml#L19 -->
|
|
||||||
<param name="control/fps" value="$(arg fps)"/>
|
|
||||||
</node>
|
|
||||||
|
|
||||||
<!-- old camera node for v4l2 (cv_camera) -->
|
|
||||||
<node pkg="nodelet" type="nodelet" name="main_camera" args="load cv_camera/CvCameraNodelet main_camera_nodelet_manager" launch-prefix="rosrun clover waitfile $(arg device)" clear_params="true" if="$(eval not simulator and type == 'v4l2')" respawn="true">
|
|
||||||
<param name="device_path" value="$(arg device)"/>
|
<param name="device_path" value="$(arg device)"/>
|
||||||
<param name="frame_id" value="main_camera_optical"/>
|
<param name="frame_id" value="main_camera_optical"/>
|
||||||
<param name="camera_info_url" value="file://$(find clover)/camera_info/fisheye_cam.yaml"/>
|
<param name="camera_info_url" value="file://$(find clover)/camera_info/fisheye_cam.yaml"/>
|
||||||
|
|
||||||
<param name="rate" value="100"/> <!-- poll rate -->
|
<param name="rate" value="100"/> <!-- poll rate -->
|
||||||
<param name="cv_cap_prop_fps" value="$(arg fps)"/> <!-- camera FPS -->
|
<param name="cv_cap_prop_fps" value="40"/> <!-- camera FPS -->
|
||||||
<param name="capture_delay" value="0.02"/> <!-- approximate delay on frame retrieving -->
|
<param name="capture_delay" value="0.02"/> <!-- approximate delay on frame retrieving -->
|
||||||
<param name="rescale_camera_info" value="true"/> <!-- automatically rescale camera calibration info -->
|
<param name="rescale_camera_info" value="true"/> <!-- automatically rescale camera calibration info -->
|
||||||
<param name="image_width" value="$(arg width)"/>
|
|
||||||
<param name="image_height" value="$(arg height)"/>
|
<!-- camera resolution -->
|
||||||
|
<param name="image_width" value="320"/>
|
||||||
|
<param name="image_height" value="240"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<!-- camera visualization markers -->
|
<!-- camera visualization markers -->
|
||||||
|
|||||||
@@ -303,14 +303,6 @@ def check_fcu():
|
|||||||
failure('cell voltage is not available, https://clover.coex.tech/power')
|
failure('cell voltage is not available, https://clover.coex.tech/power')
|
||||||
else:
|
else:
|
||||||
cell = battery.cell_voltage[0]
|
cell = battery.cell_voltage[0]
|
||||||
# number of cells 1 means this is overall voltage
|
|
||||||
if len(battery.cell_voltage) == 1:
|
|
||||||
n_cells = get_param('BAT1_N_CELLS', strict=False)
|
|
||||||
if n_cells is None:
|
|
||||||
# older PX4
|
|
||||||
n_cells = get_param('BAT_N_CELLS', strict=True)
|
|
||||||
cell /= n_cells
|
|
||||||
|
|
||||||
if cell > 4.3 or cell < 3.0:
|
if cell > 4.3 or cell < 3.0:
|
||||||
failure('incorrect cell voltage: %.2f V, https://clover.coex.tech/power', cell)
|
failure('incorrect cell voltage: %.2f V, https://clover.coex.tech/power', cell)
|
||||||
elif cell < 3.7:
|
elif cell < 3.7:
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# Copyright (C) 2024 Copter Express Technologies
|
|
||||||
#
|
|
||||||
# Author: Oleg Kalachev <okalachev@gmail.com>
|
|
||||||
#
|
|
||||||
# Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
|
||||||
# The above copyright notice and this permission notice shall be included in all
|
|
||||||
# copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
"""Rescale camera info
|
|
||||||
|
|
||||||
Rescale camera info files for different resolutions.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
rescale_camera_info.py <camera_info_file>
|
|
||||||
rescale_camera_info.py (-h | --help)
|
|
||||||
|
|
||||||
Options:
|
|
||||||
<camera_info_file> Path to the source camera info file
|
|
||||||
|
|
||||||
Example:
|
|
||||||
rescale_camera_info.py camera_info.yaml
|
|
||||||
"""
|
|
||||||
|
|
||||||
from docopt import docopt
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
arguments = docopt(__doc__)
|
|
||||||
|
|
||||||
camera_info = yaml.safe_load(open(arguments['<camera_info_file>']))
|
|
||||||
RESOLUTIONS = (
|
|
||||||
(320, 240), # QVGA
|
|
||||||
(640, 480), # VGA
|
|
||||||
(800, 600), # SVGA
|
|
||||||
(1280, 720), # HD
|
|
||||||
(1920, 1080), # FullHD
|
|
||||||
(2592, 1944), # 5MP
|
|
||||||
(3840, 2160), # 4K
|
|
||||||
(4056, 3040),
|
|
||||||
)
|
|
||||||
# TODO: retrieve resolutions list (v4l2-ctl --list-formats-ext)
|
|
||||||
|
|
||||||
for resolution in RESOLUTIONS:
|
|
||||||
width_k = resolution[0] / camera_info['image_width']
|
|
||||||
height_k = resolution[1] / camera_info['image_height']
|
|
||||||
|
|
||||||
camera_info_rescaled = camera_info.copy()
|
|
||||||
camera_info_rescaled['image_width'] = resolution[0]
|
|
||||||
camera_info_rescaled['image_height'] = resolution[1]
|
|
||||||
|
|
||||||
# See http://docs.ros.org/api/sensor_msgs/html/msg/CameraInfo.html for clarification
|
|
||||||
camera_info_rescaled['camera_matrix']['data'][0] *= width_k
|
|
||||||
camera_info_rescaled['camera_matrix']['data'][2] *= width_k
|
|
||||||
camera_info_rescaled['camera_matrix']['data'][4] *= height_k
|
|
||||||
camera_info_rescaled['camera_matrix']['data'][5] *= height_k
|
|
||||||
|
|
||||||
camera_info_rescaled['projection_matrix']['data'][0] *= width_k
|
|
||||||
camera_info_rescaled['projection_matrix']['data'][2] *= width_k
|
|
||||||
camera_info_rescaled['projection_matrix']['data'][5] *= height_k
|
|
||||||
camera_info_rescaled['projection_matrix']['data'][6] *= height_k
|
|
||||||
|
|
||||||
output_file = arguments['<camera_info_file>'].replace('.yaml', '_{}x{}.yaml'.format(resolution[0], resolution[1]))
|
|
||||||
with open(output_file, 'w') as f:
|
|
||||||
f.write('# Generated from {} by rescale_camera_info.py\n'.format(arguments['<camera_info_file>']))
|
|
||||||
yaml.dump(camera_info_rescaled, f)
|
|
||||||
|
|
||||||
print('Saved {}'.format(output_file))
|
|
||||||
@@ -136,7 +136,7 @@ navigate(x=2, y=2, z=2, speed=1, frame_id='aruco_map')
|
|||||||
|
|
||||||
### Using a specific marker frame
|
### Using a specific marker frame
|
||||||
|
|
||||||
Starting with the [image](image.md) version 0.18, the drone also can fly relative to a marker in the map, even if it is not currently visible. Like with [single-marker navigation](aruco_marker.md#working-with-detected-markers), this works by setting the frame_id parameter to `aruco_ID`, where ID is the desired marker number.
|
Starting with the [image](image.md) version 0.18, the drone also can fly relative to a marker in the map, even if it is not currently visible. Like with [single-marker navigation](aruco_marker.md#working-with-detected-markers), this works by setting the frame_id parameter to aruco_ID, where ID is the desired marker number.
|
||||||
|
|
||||||
The following code will move the drone to the point 1 meter above the center of marker 5:
|
The following code will move the drone to the point 1 meter above the center of marker 5:
|
||||||
|
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ Most of the parameters for autonomous flight are located in the following direct
|
|||||||
<arg name="aruco_vpe" default="true"/>`
|
<arg name="aruco_vpe" default="true"/>`
|
||||||
```
|
```
|
||||||
|
|
||||||
- Generate the ArUco markers field. See the article [Map-based navigation with ArUco markers](aruco_map.md#marker-map-definition) for details. To generate markers, you need to enter a command with specific values.
|
- Generate the ArUco markers field. See the article [Map-based navigation with ArUco markers] (aruco_map.md # marker map settings) for details. To generate markers, you need to enter a command with specific values.
|
||||||
|
|
||||||
Here is the example generating command where:
|
Here is the example generating command where:
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ navigate(x=2, y=2, z=2, speed=1, frame_id='aruco_map') # полет в коор
|
|||||||
|
|
||||||
### Полет в координаты по ID маркера
|
### Полет в координаты по ID маркера
|
||||||
|
|
||||||
Начиная с версии [образа](image.md) 0.18, доступны также полёты относительно отдельного маркера в карте, даже если дрон его не видит. По аналогии с [навигацией по отдельным маркерам](aruco_marker.md#навигация-по-маркерам) при настройке карты маркеров дрон сможет лететь в координаты относительно отдельного маркера, используя фрейм `aruco_ID` с соответствующим ID маркера.
|
Начиная с версии [образа](image.md) 0.18, доступны также полёты относительно отдельного маркера в карте, даже если дрон его не видит. По аналогии с [навигацией по отдельным маркерам](aruco_marker.md#навигация-по-маркерам) при настройке карты маркеров дрон сможет лететь в координаты относительно отдельного маркера, используя фрейм aruco_ID с соответствующим ID маркера.
|
||||||
|
|
||||||
Полет в точку над маркером 5 на высоту 1 метр:
|
Полет в точку над маркером 5 на высоту 1 метр:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user