diff --git a/.gitignore b/.gitignore
index 960e17c6..2d9f8e04 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
-/deploy/ros_lib/
*.pyc
+*.DS_Store
+/images
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..ab5164e8
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,35 @@
+sudo: required
+language: generic
+services:
+ - docker
+env:
+ global:
+ - DOCKER="smirart/img-tool:v0.1"
+ - TARGET_REPO="https://github.com/${TRAVIS_REPO_SLUG}.git"
+ - if [[ -z ${TRAVIS_TAG} ]]; then IMAGE_VERSION="${TRAVIS_COMMIT}}"; else IMAGE_VERSION="${TRAVIS_TAG}"; fi
+ - IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
+git:
+ depth: 1
+before_script:
+ - docker pull ${DOCKER}
+script:
+ - docker run --privileged --rm -v /dev:/dev -v $(pwd):/builder/repo -e TRAVIS_TAG="${TRAVIS_TAG}" ${DOCKER}
+before_deploy:
+ # Set up git user name and tag this commit
+ - git config --local user.name "urpylka"
+ - git config --local user.email "urpylka@gmail.com"
+ - sudo chmod -R 777 *
+ - cd images && zip ${IMAGE_NAME}.zip ${IMAGE_NAME}
+deploy:
+ provider: releases
+ api_key: ${GITHUB_OAUTH_TOKEN}
+ file: ${IMAGE_NAME}.zip
+ skip_cleanup: true
+ on:
+ tags: true
+
+# More info there
+# https://github.com/travis-ci/travis-ci/issues/6893
+# https://docs.travis-ci.com/user/customizing-the-build/
+# https://docs.travis-ci.com/user/deployment/releases
+# https://docs.travis-ci.com/user/environment-variables/
diff --git a/README.md b/README.md
index 1731917a..d896ac8f 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ Use it to learn how to assemble, configure, pilot and program autonomous CLEVER
**Preconfigured image for Raspberry Pi 3 with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clever/releases).**
-[](http://builder.coex.space/job/CopterExpress---clever/)
+[](https://travis-ci.org/urpylka/clever)
Image includes:
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 742dfa97..00000000
--- a/_config.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-theme: jekyll-theme-cayman
-tagline: Конструктор программируемого квадрокоптера
diff --git a/aruco_pose/package.xml b/aruco_pose/package.xml
index b4da81c3..f3dece62 100644
--- a/aruco_pose/package.xml
+++ b/aruco_pose/package.xml
@@ -4,59 +4,32 @@
0.0.0
ArUco maps precise pose estimation nodelet
-
-
-
Oleg Kalachev
+ MIT
+
+ Oleg Kalachev
+ Artem Smirnov
-
-
-
- TODO
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- catkin
-
nodelet
roscpp
image_transport
cv_bridge
tf
-
+
+ catkin
+
nodelet
roscpp
image_transport
cv_bridge
- tf
+
+
-
+
-
diff --git a/deploy/butterfly.service b/builder/assets/butterfly.service
similarity index 100%
rename from deploy/butterfly.service
rename to builder/assets/butterfly.service
diff --git a/deploy/butterfly.socket b/builder/assets/butterfly.socket
similarity index 100%
rename from deploy/butterfly.socket
rename to builder/assets/butterfly.socket
diff --git a/deploy/clever.service b/builder/assets/clever.service
similarity index 77%
rename from deploy/clever.service
rename to builder/assets/clever.service
index 282ab0af..ed6374fe 100644
--- a/deploy/clever.service
+++ b/builder/assets/clever.service
@@ -4,7 +4,7 @@ Requires=roscore.service
After=roscore.service
[Service]
-EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env
+EnvironmentFile=/root/roscore.env
ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch --wait
Restart=on-abort
diff --git a/image_builder/scripts/hardware_setup.sh b/builder/assets/hardware_setup.sh
similarity index 51%
rename from image_builder/scripts/hardware_setup.sh
rename to builder/assets/hardware_setup.sh
index be2abc88..901f4dea 100755
--- a/image_builder/scripts/hardware_setup.sh
+++ b/builder/assets/hardware_setup.sh
@@ -1,39 +1,62 @@
-#!/bin/bash
-
-# Exit immidiately on non-zero result
-set -e
+#! /usr/bin/env bash
#
-# Script for image configure
-# @urpylka Artem Smirnov
+# Script for build the image. Used builder script of the target repo
+# For build: docker run --privileged -it --rm -v /dev:/dev -v $(pwd):/builder/repo smirart/builder
#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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
##################################################
# 1. Enable sshd
-echo -e "\033[0;31m\033[1m$(date) | #1 Turn on sshd\033[0m\033[0m"
+echo_stamp "#1 Turn on sshd"
touch /boot/ssh
# /usr/bin/raspi-config nonint do_ssh 0
# 2. Enable GPIO
-echo -e "\033[0;31m\033[1m$(date) | #2 GPIO enabled by default\033[0m\033[0m"
+echo_stamp "#2 GPIO enabled by default"
# 3. Enable I2C
-echo -e "\033[0;31m\033[1m$(date) | #3 Turn on I2C\033[0m\033[0m"
+echo_stamp "#3 Turn on I2C"
/usr/bin/raspi-config nonint do_i2c 0
# 4. Enable SPI
-echo -e "\033[0;31m\033[1m$(date) | #4 Turn on SPI\033[0m\033[0m"
+echo_stamp "#4 Turn on SPI"
/usr/bin/raspi-config nonint do_spi 0
# 5. Enable raspicam
-echo -e "\033[0;31m\033[1m$(date) | #5 Turn on raspicam\033[0m\033[0m"
+echo_stamp "#5 Turn on raspicam"
/usr/bin/raspi-config nonint do_camera 0
# 6. Enable hardware UART
-echo -e "\033[0;31m\033[1m$(date) | #6 Turn on UART\033[0m\033[0m"
+echo_stamp "#6 Turn on UART"
# Temporary solution
# https://github.com/RPi-Distro/raspi-config/pull/75
/usr/bin/raspi-config nonint do_serial 1
@@ -47,9 +70,9 @@ systemctl disable hciuart.service
# 7. Enable V4L driver http://robocraft.ru/blog/electronics/3158.html
#echo "bcm2835-v4l2" >> /etc/modules
-echo -e "\033[0;31m\033[1m$(date) | #7 Turn on v4l2 driver\033[0m\033[0m"
+echo_stamp "#7 Turn on v4l2 driver"
if ! grep -q "^bcm2835-v4l2" /etc/modules;
then printf "bcm2835-v4l2\n" >> /etc/modules
fi
-echo -e "\033[0;31m\033[1m$(date) | End of configure hardware interfaces\033[0m\033[0m"
+echo_stamp "#8 End of configure hardware interfaces"
diff --git a/clever/static/index.html b/builder/assets/index.html
similarity index 100%
rename from clever/static/index.html
rename to builder/assets/index.html
diff --git a/builder/assets/init_rpi.sh b/builder/assets/init_rpi.sh
new file mode 100755
index 00000000..94873288
--- /dev/null
+++ b/builder/assets/init_rpi.sh
@@ -0,0 +1,43 @@
+#! /usr/bin/env bash
+
+#
+# Script for build the image. Used builder script of the target repo
+# For build: docker run --privileged -it --rm -v /dev:/dev -v $(pwd):/builder/repo smirart/builder
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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 "Rename SSID"
+sudo sed -i.OLD "s/CLEVER/CLEVER-$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)/g" /etc/wpa_supplicant/wpa_supplicant.conf
+
+echo_stamp "Harware setup"
+/root/hardware_setup.sh
+
+echo_stamp "Remove init scripts"
+rm /root/init_rpi.sh /root/hardware_setup.sh
+
+echo_stamp "End of initialization of the image"
diff --git a/image_builder/kinetic-ros-coex.rosinstall b/builder/assets/kinetic-ros-clever.rosinstall
similarity index 99%
rename from image_builder/kinetic-ros-coex.rosinstall
rename to builder/assets/kinetic-ros-clever.rosinstall
index 06a4d9e3..eda4a821 100644
--- a/image_builder/kinetic-ros-coex.rosinstall
+++ b/builder/assets/kinetic-ros-clever.rosinstall
@@ -418,10 +418,6 @@
local-name: nodelet_core/nodelet
uri: https://github.com/ros-gbp/nodelet_core-release/archive/release/kinetic/nodelet/1.9.14-0.tar.gz
version: nodelet_core-release-release-kinetic-nodelet-1.9.14-0
-- tar:
- local-name: opencv3
- uri: https://github.com/ros-gbp/opencv3-release/archive/release/kinetic/opencv3/3.3.1-5.tar.gz
- version: opencv3-release-release-kinetic-opencv3-3.3.1-5
- tar:
local-name: orocos_kinematics_dynamics/orocos_kdl
uri: https://github.com/smits/orocos-kdl-release/archive/release/kinetic/orocos_kdl/1.3.1-0.tar.gz
diff --git a/builder/assets/kinetic-rosdep-clever.yaml b/builder/assets/kinetic-rosdep-clever.yaml
new file mode 100644
index 00000000..dcb28c28
--- /dev/null
+++ b/builder/assets/kinetic-rosdep-clever.yaml
@@ -0,0 +1,513 @@
+actionlib:
+ debian:
+ stretch: [ros-kinetic-actionlib]
+actionlib_msgs:
+ debian:
+ stretch: [ros-kinetic-actionlib-msgs]
+angles:
+ debian:
+ stretch: [ros-kinetic-angles]
+async_web_server_cpp:
+ debian:
+ stretch: [ros-kinetic-async-web-server-cpp]
+bond:
+ debian:
+ stretch: [ros-kinetic-bond]
+bondcpp:
+ debian:
+ stretch: [ros-kinetic-bondcpp]
+bondpy:
+ debian:
+ stretch: [ros-kinetic-bondpy]
+camera_calibration_parsers:
+ debian:
+ stretch: [ros-kinetic-camera-calibration-parsers]
+camera_info_manager:
+ debian:
+ stretch: [ros-kinetic-camera-info-manager]
+catkin:
+ debian:
+ stretch: [ros-kinetic-catkin]
+class_loader:
+ debian:
+ stretch: [ros-kinetic-class-loader]
+cmake_modules:
+ debian:
+ stretch: [ros-kinetic-cmake-modules]
+cpp_common:
+ debian:
+ stretch: [ros-kinetic-cpp-common]
+cv_bridge:
+ debian:
+ stretch: [ros-kinetic-cv-bridge]
+cv_camera:
+ debian:
+ stretch: [ros-kinetic-cv-camera]
+diagnostic_msgs:
+ debian:
+ stretch: [ros-kinetic-diagnostic-msgs]
+diagnostic_updater:
+ debian:
+ stretch: [ros-kinetic-diagnostic-updater]
+eigen_conversions:
+ debian:
+ stretch: [ros-kinetic-eigen-conversions]
+gencpp:
+ debian:
+ stretch: [ros-kinetic-gencpp]
+geneus:
+ debian:
+ stretch: [ros-kinetic-geneus]
+genlisp:
+ debian:
+ stretch: [ros-kinetic-genlisp]
+genmsg:
+ debian:
+ stretch: [ros-kinetic-genmsg]
+gennodejs:
+ debian:
+ stretch: [ros-kinetic-gennodejs]
+genpy:
+ debian:
+ stretch: [ros-kinetic-genpy]
+geographic_msgs:
+ debian:
+ stretch: [ros-kinetic-geographic-msgs]
+geometry_msgs:
+ debian:
+ stretch: [ros-kinetic-geometry-msgs]
+image_transport:
+ debian:
+ stretch: [ros-kinetic-image-transport]
+libmavconn:
+ debian:
+ stretch: [ros-kinetic-libmavconn]
+lxml:
+ debian:
+ stretch: [python-lxml=3.7.1-1]
+mavlink:
+ debian:
+ stretch: [ros-kinetic-mavlink]
+mavros:
+ debian:
+ stretch: [ros-kinetic-mavros]
+mavros_msgs:
+ debian:
+ stretch: [ros-kinetic-mavros-msgs]
+mavros_extras:
+ debian:
+ stretch: [ros-kinetic-mavros-extras]
+message_filters:
+ debian:
+ stretch: [ros-kinetic-message-filters]
+message_generation:
+ debian:
+ stretch: [ros-kinetic-message-generation]
+message_runtime:
+ debian:
+ stretch: [ros-kinetic-message-runtime]
+mjpg-streamer:
+ debian:
+ stretch: [mjpg-streamer=2.0]
+mk:
+ debian:
+ stretch: [ros-kinetic-mk]
+nav_msgs:
+ debian:
+ stretch: [ros-kinetic-nav-msgs]
+nodelet:
+ debian:
+ stretch: [ros-kinetic-nodelet]
+opencv3:
+ debian:
+ stretch: [ros-kinetic-opencv3]
+orocos_kdl:
+ debian:
+ stretch: [ros-kinetic-orocos-kdl]
+pluginlib:
+ debian:
+ stretch: [ros-kinetic-pluginlib]
+python_orocos_kdl:
+ debian:
+ stretch: [ros-kinetic-python-orocos-kdl]
+ros:
+ debian:
+ stretch: [ros-kinetic-ros]
+ros_comm:
+ debian:
+ stretch: [ros-kinetic-ros-comm]
+ros_environment:
+ debian:
+ stretch: [ros-kinetic-ros-environment]
+rosapi:
+ debian:
+ stretch: [ros-kinetic-rosapi]
+rosauth:
+ debian:
+ stretch: [ros-kinetic-rosauth]
+rosbag:
+ debian:
+ stretch: [ros-kinetic-rosbag]
+rosbag_migration_rule:
+ debian:
+ stretch: [ros-kinetic-rosbag-migration-rule]
+rosbag_storage:
+ debian:
+ stretch: [ros-kinetic-rosbag-storage]
+rosbash:
+ debian:
+ stretch: [ros-kinetic-rosbash]
+rosboost_cfg:
+ debian:
+ stretch: [ros-kinetic-rosboost-cfg]
+rosbridge_library:
+ debian:
+ stretch: [ros-kinetic-rosbridge-library]
+rosbridge_server:
+ debian:
+ stretch: [ros-kinetic-rosbridge-server]
+rosbuild:
+ debian:
+ stretch: [ros-kinetic-rosbuild]
+rosclean:
+ debian:
+ stretch: [ros-kinetic-rosclean]
+rosconsole:
+ debian:
+ stretch: [ros-kinetic-rosconsole]
+rosconsole_bridge:
+ debian:
+ stretch: [ros-kinetic-rosconsole-bridge]
+roscpp:
+ debian:
+ stretch: [ros-kinetic-roscpp]
+roscpp_serialization:
+ debian:
+ stretch: [ros-kinetic-roscpp-serialization]
+roscpp_traits:
+ debian:
+ stretch: [ros-kinetic-roscpp-traits]
+roscreate:
+ debian:
+ stretch: [ros-kinetic-roscreate]
+rosgraph:
+ debian:
+ stretch: [ros-kinetic-rosgraph]
+rosgraph_msgs:
+ debian:
+ stretch: [ros-kinetic-rosgraph-msgs]
+roslang:
+ debian:
+ stretch: [ros-kinetic-roslang]
+roslaunch:
+ debian:
+ stretch: [ros-kinetic-roslaunch]
+roslib:
+ debian:
+ stretch: [ros-kinetic-roslib]
+roslint:
+ debian:
+ stretch: [ros-kinetic-roslint]
+roslisp:
+ debian:
+ stretch: [ros-kinetic-roslisp]
+roslz4:
+ debian:
+ stretch: [ros-kinetic-roslz4]
+rosmake:
+ debian:
+ stretch: [ros-kinetic-rosmake]
+rosmaster:
+ debian:
+ stretch: [ros-kinetic-rosmaster]
+rosmsg:
+ debian:
+ stretch: [ros-kinetic-rosmsg]
+rosnode:
+ debian:
+ stretch: [ros-kinetic-rosnode]
+rosout:
+ debian:
+ stretch: [ros-kinetic-rosout]
+rospack:
+ debian:
+ stretch: [ros-kinetic-rospack]
+rosparam:
+ debian:
+ stretch: [ros-kinetic-rosparam]
+rospy:
+ debian:
+ stretch: [ros-kinetic-rospy]
+rospy_tutorials:
+ debian:
+ stretch: [ros-kinetic-rospy-tutorials]
+rosserial_client:
+ debian:
+ stretch: [ros-kinetic-rosserial-client]
+rosserial_msgs:
+ debian:
+ stretch: [ros-kinetic-rosserial-msgs]
+rosserial_python:
+ debian:
+ stretch: [ros-kinetic-rosserial-python]
+rosservice:
+ debian:
+ stretch: [ros-kinetic-rosservice]
+rostest:
+ debian:
+ stretch: [ros-kinetic-rostest]
+rostime:
+ debian:
+ stretch: [ros-kinetic-rostime]
+rostopic:
+ debian:
+ stretch: [ros-kinetic-rostopic]
+rosunit:
+ debian:
+ stretch: [ros-kinetic-rosunit]
+roswtf:
+ debian:
+ stretch: [ros-kinetic-roswtf]
+sensor_msgs:
+ debian:
+ stretch: [ros-kinetic-sensor-msgs]
+smclib:
+ debian:
+ stretch: [ros-kinetic-smclib]
+std_msgs:
+ debian:
+ stretch: [ros-kinetic-std-msgs]
+std_srvs:
+ debian:
+ stretch: [ros-kinetic-std-srvs]
+stereo_msgs:
+ debian:
+ stretch: [ros-kinetic-stereo-msgs]
+tf2:
+ debian:
+ stretch: [ros-kinetic-tf2]
+tf2_bullet:
+ debian:
+ stretch: [ros-kinetic-tf2-bullet]
+tf2_eigen:
+ debian:
+ stretch: [ros-kinetic-tf2-eigen]
+tf2_geometry_msgs:
+ debian:
+ stretch: [ros-kinetic-tf2-geometry-msgs]
+tf2_kdl:
+ debian:
+ stretch: [ros-kinetic-tf2-kdl]
+tf2_msgs:
+ debian:
+ stretch: [ros-kinetic-tf2-msgs]
+tf2_py:
+ debian:
+ stretch: [ros-kinetic-tf2-py]
+tf2_ros:
+ debian:
+ stretch: [ros-kinetic-tf2-ros]
+tf2_sensor_msgs:
+ debian:
+ stretch: [ros-kinetic-tf2-sensor-msgs]
+tf2_tools:
+ debian:
+ stretch: [ros-kinetic-tf2-tools]
+tf:
+ debian:
+ stretch: [ros-kinetic-tf]
+topic_tools:
+ debian:
+ stretch: [ros-kinetic-topic-tools]
+trajectory_msgs:
+ debian:
+ stretch: [ros-kinetic-trajectory-msgs]
+urdf:
+ debian:
+ stretch: [ros-kinetic-urdf]
+urdf_parser_plugin:
+ debian:
+ stretch: [ros-kinetic-urdf-parser-plugin]
+uuid_msgs:
+ debian:
+ stretch: [ros-kinetic-uuid-msgs]
+visualization_msgs:
+ debian:
+ stretch: [ros-kinetic-visualization-msgs]
+xmlrpcpp:
+ debian:
+ stretch: [ros-kinetic-xmlrpcpp]
+boost:
+ debian:
+ stretch: [libboost-all-dev]
+bullet:
+ debian:
+ stretch: [libbullet-dev]
+bzip2:
+ debian:
+ stretch: [libbz2-dev]
+cmake:
+ debian:
+ stretch: [cmake]
+cppunit:
+ debian:
+ stretch: [libcppunit-dev]
+eigen:
+ debian:
+ stretch: [libeigen3-dev]
+geographiclib-tools:
+ debian:
+ stretch: [geographiclib-tools]
+geographiclib:
+ debian:
+ stretch: [libgeographic-dev]
+google-mock:
+ debian:
+ stretch: [google-mock]
+graphviz:
+ debian:
+ stretch: [graphviz]
+gtest:
+ debian:
+ stretch: [libgtest-dev]
+libconsole-bridge-dev:
+ debian:
+ stretch: [libconsole-bridge-dev]
+libjpeg:
+ debian:
+ stretch: [libjpeg-dev]
+libpng-dev:
+ debian:
+ stretch: [libpng-dev]
+libpoco-dev:
+ debian:
+ stretch: [libpoco-dev]
+libssl-dev:
+ debian:
+ stretch: [libssl-dev]
+libtiff-dev:
+ debian:
+ stretch: [libtiff5-dev]
+liburdfdom-dev:
+ debian:
+ stretch: [liburdfdom-dev]
+liburdfdom-headers-dev:
+ debian:
+ stretch: [liburdfdom-headers-dev]
+libv4l-dev:
+ debian:
+ stretch: [libv4l-dev]
+libvtk-qt:
+ debian:
+ stretch: [libvtk6-qt-dev]
+libwebp-dev:
+ debian:
+ stretch: [libwebp-dev]
+log4cxx:
+ debian:
+ stretch: [liblog4cxx-dev]
+lz4:
+ debian:
+ stretch: [liblz4-dev]
+pkg-config:
+ debian:
+ stretch: [pkg-config]
+protobuf:
+ debian:
+ stretch: [libprotobuf10]
+python-bson:
+ debian:
+ stretch: [python-bson]
+python-catkin-pkg:
+ debian:
+ stretch: [python-catkin-pkg]
+python-coverage:
+ debian:
+ stretch: [python-coverage]
+python-defusedxml:
+ debian:
+ stretch: [python-defusedxml]
+python-empy:
+ debian:
+ stretch: [python-empy]
+python-future:
+ debian:
+ stretch: [python-future]
+python-imaging:
+ debian:
+ stretch: [python-imaging]
+python-lxml:
+ debian:
+ stretch: [python-lxml]
+python-mock:
+ debian:
+ stretch: [python-mock]
+python-netifaces:
+ debian:
+ stretch: [python-netifaces]
+python-nose:
+ debian:
+ stretch: [python-nose]
+python-numpy:
+ debian:
+ stretch: [python-numpy]
+python-paramiko:
+ debian:
+ stretch: [python-paramiko]
+python-rosdep:
+ debian:
+ stretch: [python-rosdep]
+python-rospkg:
+ debian:
+ stretch: [python-rospkg]
+python-serial:
+ debian:
+ stretch: [python-serial]
+python-setuptools:
+ debian:
+ stretch: [python-setuptools]
+python-sip:
+ debian:
+ stretch: [python-sip-dev]
+python-tornado:
+ debian:
+ stretch: [python-tornado]
+python-twisted-core:
+ debian:
+ stretch: [python-twisted-core]
+python-websocket:
+ debian:
+ stretch: [python-websocket]
+python-wxtools:
+ debian:
+ stretch: [python-wxtools]
+python-yaml:
+ debian:
+ stretch: [python-yaml]
+python:
+ debian:
+ stretch: [python-dev]
+sbcl:
+ debian:
+ stretch: [sbcl]
+tinyxml2:
+ debian:
+ stretch: [libtinyxml2-dev]
+tinyxml:
+ debian:
+ stretch: [libtinyxml-dev]
+uuid:
+ debian:
+ stretch: [uuid-dev]
+web_video_server:
+ debian:
+ stretch: [ros-kinetic-web-video-server]
+v4l-utils:
+ debian:
+ stretch: [v4l-utils]
+yaml-cpp:
+ debian:
+ stretch: [libyaml-cpp-dev]
+zlib:
+ debian:
+ stretch: [zlib1g-dev]
diff --git a/deploy/monkey b/builder/assets/monkey-clever
similarity index 89%
rename from deploy/monkey
rename to builder/assets/monkey-clever
index bf5e22e9..112d990f 100644
--- a/deploy/monkey
+++ b/builder/assets/monkey-clever
@@ -20,7 +20,7 @@
# Example:
# DocumentRoot /home/krypton/htdocs
- DocumentRoot /home/pi/catkin_ws/src/clever/clever/static
+ DocumentRoot /usr/share/monkey-static
# Redirect:
# ---------
@@ -36,13 +36,13 @@
# ----------
# Registration file of correct request.
- AccessLog /home/pi/monkey/build/log/access.log
+ AccessLog /var/log/monkey-clever/access.log
# ErrorLog:
# ---------
# Registration file of incorrect request.
- ErrorLog /home/pi/monkey/build/log/error.log
+ ErrorLog /var/log/monkey-clever/error.log
[ERROR_PAGES]
404 404.html
diff --git a/deploy/roscore.env b/builder/assets/roscore.env
similarity index 100%
rename from deploy/roscore.env
rename to builder/assets/roscore.env
diff --git a/deploy/roscore.service b/builder/assets/roscore.service
similarity index 76%
rename from deploy/roscore.service
rename to builder/assets/roscore.service
index 56f949ac..b8cf1919 100644
--- a/deploy/roscore.service
+++ b/builder/assets/roscore.service
@@ -3,7 +3,7 @@ Description=Launcher for the ROS master, parameter server and rosout logging nod
After=network.target
[Service]
-EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env
+EnvironmentFile=/root/roscore.env
ExecStart=/opt/ros/kinetic/bin/roscore
Restart=on-abort
diff --git a/builder/image-build.sh b/builder/image-build.sh
new file mode 100755
index 00000000..84d2fa37
--- /dev/null
+++ b/builder/image-build.sh
@@ -0,0 +1,105 @@
+#! /usr/bin/env bash
+
+#
+# Script for build the image. Used builder script of the target repo
+# For build: docker run --privileged -it --rm -v /dev:/dev -v $(pwd):/builder/repo smirart/builder
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+SOURCE_IMAGE="http://repo.coex.space/2018-06-27-raspbian-stretch-lite.zip"
+
+export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:='noninteractive'}
+export LANG=${LANG:='C.UTF-8'}
+export LC_ALL=${LC_ALL:='C.UTF-8'}
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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"
+REPO_DIR="${BUILDER_DIR}/repo"
+SCRIPTS_DIR="${REPO_DIR}/builder"
+IMAGES_DIR="${REPO_DIR}/images"
+
+[[ ! -d ${SCRIPTS_DIR} ]] && (echo_stamp "Directory ${SCRIPTS_DIR} doesn't exist" "ERROR"; exit 1)
+[[ ! -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
+# IMAGE_VERSION="${TRAVIS_TAG:=$(cd ${REPO_DIR}; git log --format=%h -1)}"
+REPO_URL="$(cd ${REPO_DIR}; git remote --verbose | grep origin | grep fetch | cut -f2 | cut -d' ' -f1 | sed 's/git@github\.com\:/https\:\/\/github.com\//')"
+REPO_NAME="$(basename -s '.git' ${REPO_URL})"
+IMAGE_NAME="${REPO_NAME}_${IMAGE_VERSION}.img"
+IMAGE_PATH="${IMAGES_DIR}/${IMAGE_NAME}"
+
+get_image() {
+ # TEMPLATE: get_image
+ local BUILD_DIR=$(dirname $1)
+ local RPI_ZIP_NAME=$(basename $2)
+ local RPI_IMAGE_NAME=$(echo ${RPI_ZIP_NAME} | sed 's/zip/img/')
+
+ if [ ! -e "${BUILD_DIR}/${RPI_ZIP_NAME}" ]; then
+ echo_stamp "Downloading original Linux distribution" \
+ && wget -nv -O ${BUILD_DIR}/${RPI_ZIP_NAME} $2 \
+ && echo_stamp "Downloading complete" "SUCCESS" \
+ || (echo_stamp "Downloading was failed!" "ERROR"; exit 1)
+ else echo_stamp "Linux distribution already donwloaded"; fi
+
+ echo_stamp "Unzipping Linux distribution image" \
+ && unzip -p ${BUILD_DIR}/${RPI_ZIP_NAME} ${RPI_IMAGE_NAME} > $1 \
+ && echo_stamp "Unzipping complete" "SUCCESS" \
+ || (echo_stamp "Unzipping was failed!" "ERROR"; exit 1)
+}
+
+get_image ${IMAGE_PATH} ${SOURCE_IMAGE}
+
+# Make free space
+${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH} max '7G'
+
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/init_rpi.sh' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/hardware_setup.sh' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-init.sh' ${IMAGE_VERSION} ${SOURCE_IMAGE}
+
+# Monkey
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/monkey-clever' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/index.html' '/usr/share/monkey-static/'
+
+# Butterfly
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/butterfly.service' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/butterfly.socket' '/root/'
+# software install
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-software.sh'
+# network setup
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-network.sh'
+
+# If RPi then use a one thread to build a ROS package on RPi, else use all
+[[ $(arch) == 'armv7l' ]] && NUMBER_THREADS=1 || NUMBER_THREADS=$(nproc --all)
+# Clever
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/clever.service' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.env' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.service' '/root/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-rosdep-clever.yaml' '/etc/ros/rosdep/'
+# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clever.rosinstall' '/home/pi/ros_catkin_ws/'
+${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} False False ${NUMBER_THREADS}
+
+${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH}
diff --git a/builder/image-init.sh b/builder/image-init.sh
new file mode 100755
index 00000000..9448bc7f
--- /dev/null
+++ b/builder/image-init.sh
@@ -0,0 +1,54 @@
+#! /usr/bin/env bash
+
+#
+# Script for initialisation image
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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 "Write CLEVER information"
+
+# Clever image version
+echo "$1" >> /etc/clever_version
+# Origin image file name
+echo "${2%.*}" >> /etc/clever_origin
+
+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"
+sed -i "19a${MAGIC_SCRIPT}" /etc/rc.local
+
+# It needs for autosizer.sh & maybe that is correct
+echo_stamp "Change boot partition"
+sed -i 's/root=[^ ]*/root=\/dev\/mmcblk0p2/' /boot/cmdline.txt
+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
+
+echo_stamp "Set max space for syslogs"
+# https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl
+sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/' /etc/systemd/journald.conf
+
+echo_stamp "End of init image"
diff --git a/builder/image-network.sh b/builder/image-network.sh
new file mode 100755
index 00000000..e085a322
--- /dev/null
+++ b/builder/image-network.sh
@@ -0,0 +1,73 @@
+#! /usr/bin/env bash
+
+#
+# Script for network configure
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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 to /etc/wpa_supplicant/wpa_supplicant.conf"
+
+# TODO: Use wpa_cli insted direct file edit
+cat << EOF >> /etc/wpa_supplicant/wpa_supplicant.conf
+network={
+ ssid="CLEVER"
+ psk="cleverwifi"
+ mode=2
+ proto=RSN
+ key_mgmt=WPA-PSK
+ pairwise=CCMP
+ group=CCMP
+ auth_alg=OPEN
+}
+EOF
+
+echo_stamp "#2 Write STATIC to /etc/dhcpcd.conf"
+
+cat << EOF >> /etc/dhcpcd.conf
+interface wlan0
+static ip_address=192.168.11.1/24
+EOF
+
+echo_stamp "#3 Write dhcp-config to /etc/dnsmasq.conf"
+
+cat << EOF >> /etc/dnsmasq.conf
+interface=wlan0
+address=/clever/coex/192.168.11.1
+dhcp-range=192.168.11.100,192.168.11.200,12h
+no-hosts
+filterwin2k
+bogus-priv
+domain-needed
+quiet-dhcp6
+EOF
+
+#echo_stamp "#4 Write magic script for rename SSID to /etc/rc.local"
+#RENAME_SSID="sudo sed -i.OLD \"s/CLEVER/CLEVER-\$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)/g\" /etc/wpa_supplicant/wpa_supplicant.conf && sudo sed -i '/sudo sed/d' /etc/rc.local && sudo reboot"
+#sed -i "19a$RENAME_SSID" /etc/rc.local
+
+echo_stamp "#5 End of network installation"
diff --git a/builder/image-ros.sh b/builder/image-ros.sh
new file mode 100755
index 00000000..ee9dc9e9
--- /dev/null
+++ b/builder/image-ros.sh
@@ -0,0 +1,167 @@
+#! /usr/bin/env bash
+
+#
+# Script for build the image. Used builder script of the target repo
+# For build: docker run --privileged -it --rm -v /dev:/dev -v $(pwd):/builder/repo smirart/builder
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+REPO=$1
+REF=$2
+INSTALL_ROS_PACK_SOURCES=$3
+DISCOVER_ROS_PACK=$4
+NUMBER_THREADS=$5
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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}
+}
+
+# TODO: 'kinetic-rosdep-clever.yaml' should add only if we use our repo?
+echo_stamp "Init rosdep" \
+&& rosdep init \
+&& echo "yaml file:///etc/ros/rosdep/kinetic-rosdep-clever.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list \
+&& rosdep update
+
+resolve_rosdep() {
+ # TEMPLATE: resolve_rosdep
+ CATKIN_PATH=$1
+ ROS_DISTRO='kinetic'
+ OS_DISTRO='debian'
+ OS_VERSION='stretch'
+
+ echo_stamp "Installing dependencies apps with rosdep in ${CATKIN_PATH}"
+ cd ${CATKIN_PATH}
+ set +e
+ # Successfull unmount flag (false at thismoment)
+ install_ok=false
+ # Repeat 5 times
+ for i in {1..5}; do
+ # Resolving Dependencies with rosdep
+ rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -r --os=${OS_DISTRO}:${OS_VERSION} \
+ && install_ok=true && break || (echo_stamp "rosdep iteration #$i failed!" "ERROR"; sleep 2)
+ done
+ set -e
+ # Stage fail if this condition is not true
+ [[ $install_ok ]] \
+ && echo_stamp "All rosdep dependencies was installed!" "SUCCESS" \
+ || (echo_stamp "Rosdep installation was failed!" "ERROR"; exit 1)
+}
+
+INSTALL_ROS_PACK_SOURCES=${INSTALL_ROS_PACK_SOURCES:='False'}
+if [ "${INSTALL_ROS_PACK_SOURCES}" = "True" ]; then
+ DISCOVER_ROS_PACK=${DISCOVER_ROS_PACK:='True'}
+ if [ "${DISCOVER_ROS_PACK}" = "False" ]; then
+ echo_stamp "Preparing ros_comm packages to kinetic-ros_comm-wet.rosinstall" \
+ && mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
+ && rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall \
+ && wstool init -j${NUMBER_THREADS} src kinetic-ros_comm-wet.rosinstall \
+ && echo_stamp "All roscomm sources was installed!" "SUCCESS" \
+ || (echo_stamp "Some roscomm sources installation was failed!" "ERROR"; exit 1)
+
+ echo_stamp "Preparing other ROS-packages to kinetic-custom_ros.rosinstall" \
+ && cd /home/pi/ros_catkin_ws \
+ && rosinstall_generator \
+ actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common cv_bridge cv_camera diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport compressed_image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs web_video_server xmlrpcpp mavros opencv3 mavros_extras interactive_markers tf2_web_republisher interactive_marker_proxy \
+ --rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall \
+ && wstool merge -j${NUMBER_THREADS} -t src kinetic-custom_ros.rosinstall \
+ && wstool update -j${NUMBER_THREADS} -t src \
+ && echo_stamp "All custom sources was installed!" "SUCCESS" \
+ || (echo_stamp "Some custom sources installation was failed!" "ERROR"; exit 1)
+ else
+ echo_stamp "Creating ros_catkin_ws & getting all sources using wstool" \
+ && mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
+ && wstool init -j${NUMBER_THREADS} src kinetic-ros-clever.rosinstall \
+ > /dev/null \
+ && echo_stamp "All CLEVER sources was installed!" "SUCCESS" \
+ || (echo_stamp "Some CLEVER sources installation was failed!" "ERROR"; exit 1)
+ fi
+
+ resolve_rosdep '/home/pi/ros_catkin_ws'
+
+ # TODO: Add refactor to origin repo
+ #echo_stamp "Refactoring usb_cam in SRC"
+ #sed -i '/#define __STDC_CONSTANT_MACROS/a\#define PIX_FMT_RGB24 AV_PIX_FMT_RGB24\n#define PIX_FMT_YUV422P AV_PIX_FMT_YUV422P' /home/pi/ros_catkin_ws/src/usb_cam/src/usb_cam.cpp
+
+ echo_stamp "Building ros_catkin_ws packages"
+ cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -j${NUMBER_THREADS} -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic
+
+ #echo_stamp "#11 Building light packages on 2 threads"
+ #cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -j2 --install-space /opt/ros/kinetic --pkg actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs xmlrpcpp
+
+ #echo_stamp "#12 Building heavy packages"
+ # This command uses less threads to avoid Raspberry Pi freeze
+ #cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -j1 --install-space /opt/ros/kinetic --pkg mavros opencv3 cv_bridge cv_camera mavros_extras web_video_server
+
+ # Install builded packages
+ # WARNING: A major bug was found when using --pkg option (catkin_make_isolated doesn't install environment files)
+ # TODO: Can we increase threads number with HDD swap?
+
+ echo_stamp "Remove build_isolated & devel_isolated from ros_catkin_ws"
+ rm -rf /home/pi/ros_catkin_ws/build_isolated /home/pi/ros_catkin_ws/devel_isolated
+ chown -Rf pi:pi /home/pi/ros_catkin_ws
+fi
+
+echo_stamp "Installing CLEVER" \
+&& git clone ${REPO} /home/pi/catkin_ws/src/clever \
+&& cd /home/pi/catkin_ws/src/clever \
+&& git checkout ${REF} \
+&& cd /home/pi/catkin_ws \
+&& resolve_rosdep $(pwd) \
+&& pip install wheel \
+&& pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \
+&& source /opt/ros/kinetic/setup.bash \
+&& catkin_make -j${NUMBER_THREADS} -DCMAKE_BUILD_TYPE=Release \
+&& ln -s /root/roscore.service /lib/systemd/system/roscore.service \
+&& ln -s /root/clever.service /lib/systemd/system/clever.service \
+&& systemctl enable roscore \
+&& systemctl enable clever \
+&& echo_stamp "All CLEVER was installed!" "SUCCESS" \
+|| (echo_stamp "CLEVER installation was failed!" "ERROR"; exit 1)
+
+# TODO move GeographicLib datasets to Mavros debian package
+echo_stamp "Install GeographicLib datasets (needs for mavros)" \
+&& wget -qO- https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | bash
+
+echo_stamp "Change permissions for catkin_ws"
+chown -Rf pi:pi /home/pi/catkin_ws
+
+echo_stamp "Setup ROS environment"
+cat << EOF >> /home/pi/.bashrc
+LANG='C.UTF-8'
+LC_ALL='C.UTF-8'
+ROS_DISTRO='kinetic'
+export ROS_IP='192.168.11.1'
+source /opt/ros/kinetic/setup.bash
+source /home/pi/catkin_ws/devel/setup.bash
+EOF
+
+#echo_stamp "Removing local apt mirror"
+# Restore original sources.list
+#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_stamp "END of ROS INSTALLATION"
diff --git a/builder/image-software.sh b/builder/image-software.sh
new file mode 100755
index 00000000..f58dcc19
--- /dev/null
+++ b/builder/image-software.sh
@@ -0,0 +1,108 @@
+#! /usr/bin/env bash
+
+#
+# Script for install software to the image.
+#
+# Copyright (C) 2018 Copter Express Technologies
+#
+# Author: Artem Smirnov
+#
+
+set -e # Exit immidiately on non-zero result
+
+echo_stamp() {
+ # TEMPLATE: echo_stamp
+ # 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 "Install apt keys & repos"
+
+# TODO: This STDOUT consist 'OK'
+curl http://repo.coex.space/aptly_repo_signing.key 2> /dev/null | apt-key add -
+apt-get update \
+&& apt-get install --no-install-recommends -y -qq dirmngr=2.1.18-8~deb9u2 > /dev/null \
+&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
+
+echo "deb http://packages.ros.org/ros/ubuntu stretch main" > /etc/apt/sources.list.d/ros-latest.list
+echo "deb http://repo.coex.space/rpi-ros-kinetic stretch main" > /etc/apt/sources.list.d/rpi-ros-kinetic.list
+echo "deb http://repo.coex.space/clever stretch main" > /etc/apt/sources.list.d/clever.list
+
+echo_stamp "Update apt cache"
+
+# TODO: FIX ERROR: /usr/bin/apt-key: 596: /usr/bin/apt-key: cannot create /dev/null: Permission denied
+apt-get update -qq > /dev/null
+# && apt upgrade -y
+
+echo_stamp "Software installing"
+apt-get install --no-install-recommends -y \
+unzip=6.0-21 \
+zip=3.0-11 \
+ipython=5.1.0-3 \
+ipython3=5.1.0-3 \
+screen=4.5.0-6 \
+byobu=5.112-1 \
+nmap=7.40-1 \
+lsof=4.89+dfsg-0.1 \
+git=1:2.11.0-3+deb9u3 \
+dnsmasq=2.76-5+rpt1+deb9u1 \
+tmux=2.3-4 \
+vim=2:8.0.0197-4+deb9u1 \
+cmake=3.7.2-1 \
+python-pip=9.0.1-2+rpt2 \
+python3-pip=9.0.1-2+rpt2 \
+libjpeg8-dev=8d1-2 \
+tcpdump \
+ltrace \
+libpoco-dev=1.7.6+dfsg1-5+deb9u1 \
+python-rosdep=0.12.2-1 \
+python-rosinstall-generator=0.1.14-1 \
+python-wstool=0.1.17-1 \
+python-rosinstall=0.7.8-1 \
+build-essential=12.3 \
+libffi-dev \
+monkey=1.6.9-1 \
+&& echo_stamp "Everything was installed!" "SUCCESS" \
+|| (echo_stamp "Some packages wasn't installed!" "ERROR"; exit 1)
+
+# Deny byobu to check available updates
+sudo sed -i "s/updates_available//" /usr/share/byobu/status/status
+# sudo sed -i "s/updates_available//" /home/pi/.byobu/status
+
+echo_stamp "Upgrade pip"
+pip install --upgrade pip
+pip3 install --upgrade pip3
+
+echo_stamp "Install and enable Butterfly (web terminal)"
+pip3 install butterfly
+pip3 install butterfly[systemd]
+ln -s /root/butterfly.service /lib/systemd/system/
+ln -s /root/butterfly.socket /lib/systemd/system/
+systemctl enable butterfly.socket
+
+echo_stamp "Setup Monkey"
+mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
+ln -s /root/monkey-clever /etc/monkey/sites/default
+
+echo_stamp "Add .vimrc"
+cat << EOF > /home/pi/.vimrc
+set mouse-=a
+syntax on
+autocmd BufNewFile,BufRead *.launch set syntax=xml
+EOF
+
+echo_stamp "End of software installation"
diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch
index 102365ea..ebf83c90 100644
--- a/clever/launch/clever.launch
+++ b/clever/launch/clever.launch
@@ -21,7 +21,7 @@
-
+
diff --git a/clever/package.xml b/clever/package.xml
index 5759150f..5180b43b 100644
--- a/clever/package.xml
+++ b/clever/package.xml
@@ -2,55 +2,39 @@
clever
0.0.1
- The clever package
+ The CLEVER package
-
-
-
Oleg Kalachev
+ MIT
+
+ Oleg Kalachev
+ Artem Smirnov
-
-
-
- TODO
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- catkin
-
nodelet
roscpp
-
+ visualization_msgs
+ tf2_geometry_msgs
+
+ catkin
+
+ catkin
+ ros_cpp
nodelet
- roscpp
+ mavros
+ mavros_extras
+ lxml
+ cv_camera
+ mjpg-streamer
+ rosbridge_server
+ web_video_server
+
+
-
+
-
diff --git a/clever/src/fpv_camera b/clever/src/fpv_camera
index 7ca4981d..052d22d8 100755
--- a/clever/src/fpv_camera
+++ b/clever/src/fpv_camera
@@ -4,5 +4,4 @@
# fpv_camera
echo "Starting FPV camera $1 on :$2"
-cd /home/pi/mjpg-streamer/mjpg-streamer-experimental
-./mjpg_streamer -i "./input_uvc.so -d $1 -r 320x240 -f 30" -o "./output_http.so -w ./www -p $2"
+mjpg_streamer -i "/usr/lib/input_uvc.so -d $1 -r 320x240 -f 30" -o "/usr/lib/output_http.so -w /usr/share/mjpg_streamer/www -p $2"
diff --git a/clever/src/monkey b/clever/src/monkey
index d1fd8ca2..ea5a5d7c 100755
--- a/clever/src/monkey
+++ b/clever/src/monkey
@@ -1,3 +1,3 @@
#!/usr/bin/env bash
-exec /home/pi/monkey/build/monkey --port 80 --workers 1
+exec /usr/sbin/monkey --port 80 --workers 1
diff --git a/deploy/clever_arudino.tar.gz b/deploy/clever_arudino.tar.gz
deleted file mode 100644
index df92e77a..00000000
Binary files a/deploy/clever_arudino.tar.gz and /dev/null differ
diff --git a/deploy/generate_ros_lib b/deploy/generate_ros_lib
deleted file mode 100644
index b72c5602..00000000
--- a/deploy/generate_ros_lib
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-
-# This script generates ros_lib library for Arduino for using with rosseial_arduino:
-# http://wiki.ros.org/rosserial_arduino/Tutorials
-# https://copterexpress.gitbooks.io/clever/content/docs/arduino.html
-
-rm -rf ros_lib
-rosrun rosserial_arduino make_libraries.py .
-tar czf clever_arudino.tar.gz ros_lib
diff --git a/docs/arduino.md b/docs/arduino.md
index 0b99aae7..bd73755f 100644
--- a/docs/arduino.md
+++ b/docs/arduino.md
@@ -1,5 +1,4 @@
-Управление коптером с Arduino
-===
+# Управление коптером с Arduino
Для взаимодействия с ROS-топиками и сервисами на Raspberry Pi можно использовать библиотеку [rosserial_arduino](http://wiki.ros.org/rosserial_arduino).
@@ -7,17 +6,23 @@
Arudino необходимо установить на Клевер и подключить по USB-порту.
-Настройка Arduino IDE
----
+## Настройка Arduino IDE
-Необходимо скачать и скопировать [библиотеку ROS-сообщений Клевера](https://github.com/CopterExpress/clever_bundle/blob/master/deploy/clever_arudino.tar.gz?raw=true) (`ros_lib`) в `<папку скетчей>/libraries`.
+Для работы с ROS, Arduino необходимо понимать формат сообщений. Для этого на Clever необходимо собрать библиотеку ROS-сообщений (`ros_lib`) и скопировать в папку `<папку скетчей>/libraries`.
-Настройка Raspberry Pi
----
+Для сборки библиотеки на коптере необходимо выполнить следующий скрипт:
+
+```bash
+rosrun rosserial_arduino make_libraries.py .
+tar czf clever_arudino.tar.gz ros_lib
+rm -rf ros_lib
+```
+
+## Настройка Raspberry Pi
Чтобы единоразово запустить программу на Arduino, можно воспользоваться командой:
-```
+```bash
roslaunch clever arduino.launch
```
@@ -33,8 +38,7 @@ roslaunch clever arduino.launch
sudo systemctl restart clever
```
-Задержки
----
+## Задержки
При использовании `rosserial_arduino` микроконтроллер Arduino не должен быть заблокирован больше чем на несколько секунд (например, с использованием функции `delay`); иначе связь между Raspberry Pi и Arduino будет разорвана.
@@ -52,13 +56,12 @@ while(/* условие */) {
```cpp
// Задержка на 8 секунд
for(int i=0; i<8; i++) {
- delay(1000);
- nh.spinOnce();
+ delay(1000);
+ nh.spinOnce();
}
```
-Работа с Клевером
----
+## Работа с Клевером
Набор сервисов и топиков аналогичен обычному набору в [simple_offboard](simple_offboard.md) и [mavros](mavros.md).
@@ -165,8 +168,7 @@ void loop()
}
```
-Получение телеметрии
----
+## Получение телеметрии
С Arduino можно использовать [сервис](simple_offboard.md) `get_telemetry`. Для этого надо объявить его по аналогии с сервисами `navigate` и `set_mode`:
@@ -201,8 +203,7 @@ getTelemetry.call(gt_req, gt_res);
// gt_res.z - положение коптера по z
```
-Проблемы
----
+## Проблемы
При использовании Arudino Nano может не хватать оперативной памяти (RAM). В таком случае в Aruino IDE будут появляться сообщения, типа:
diff --git a/image_builder/Jenkinsfile b/image_builder/Jenkinsfile
deleted file mode 100644
index e3b28530..00000000
--- a/image_builder/Jenkinsfile
+++ /dev/null
@@ -1,35 +0,0 @@
-pipeline {
- agent any
- parameters {
- string(name: 'GWBT_REF', defaultValue: "master")
- string(name: 'GWBT_URL', defaultValue: "https://github.com/CopterExpress/clever.git")
- string(name: 'GWBT_FILE', defaultValue: "")
- string(name: 'IMAGE_NAME', defaultValue: "\$(cat ${GWBT_FILE} | jq '.repository.name' -r)-${params.GWBT_REF}.img")
- string(name: 'GWBT_EVENT', defaultValue: 'release')
- booleanParam(name: 'ONLY_PUBLISH', defaultValue: false, description: 'ONLY PUBLISH')
- string(name: 'BUILD_DIR', defaultValue: '/mnt/hdd_builder/workspace', description: 'Build workspace')
- }
- environment {
- DEBIAN_FRONTEND = 'noninteractive'
- LANG = 'C.UTF-8'
- LC_ALL = 'C.UTF-8'
- }
- stages {
- stage('Build image') {
- when { not { expression { return params.ONLY_PUBLISH } } }
- steps {
- build job: 'CopterExpress-clever-build', parameters: [[$class: 'StringParameterValue', name: 'IMAGE_NAME', value: "${params.IMAGE_NAME}"], [$class: 'StringParameterValue', name: 'IMAGE_VERSION', value: "${params.GWBT_REF}"], [$class: 'StringParameterValue', name: 'GWBT_REF', value: "${params.GWBT_REF}"], [$class: 'StringParameterValue', name: 'GWBT_URL', value: "${params.GWBT_URL}"]]
- }
- }
- stage('Publish image') {
- when { environment name: 'GWBT_EVENT', value: 'release' }
- environment {
- CONFIG_FILE = "${params.BUILD_DIR}/coex-ci.json"
- YA_SCRIPT = "$WORKSPACE/image_builder/yadisk.py"
- }
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh publish_image ${params.BUILD_DIR} ${params.IMAGE_NAME} ${YA_SCRIPT} ${CONFIG_FILE} \$(cat ${params.GWBT_FILE} | jq '.release.id' -r) \"\$(cat ${params.GWBT_FILE} | jq '.release.body' | sed 's/\"//' | rev | sed 's/\"//' | rev)\""
- }
- }
- }
-}
diff --git a/image_builder/README.md b/image_builder/README.md
deleted file mode 100644
index d4b0242e..00000000
--- a/image_builder/README.md
+++ /dev/null
@@ -1,89 +0,0 @@
-## Setup your builder
-
-1. Install requirements
-```(bash)
-sudo apt-get install unzip zip git python-pip jq curl
-sudo pip install YaDiskClient
-```
-2. Mount HDD
-```bash
-nano /etc/fstab
-```
-```
-proc /proc proc defaults 0 0
-PARTUUID=37665771-01 /boot vfat defaults 0 2
-PARTUUID=37665771-02 / ext4 defaults,noatime 0 1
-# a swapfile is not a swap partition, no line here
-# use dphys-swapfile swap[on|off] for that
-/dev/sdb1 none swap sw 0 0
-/dev/sdb2 /mnt/hdd_system ext4 defaults,acl 0 0
-/dev/sdb3 /mnt/hdd_builder ext4 defaults,acl 0 0
-```
-
-3. Enable swap on HDD
-> TODO:
-
-And disable `dphys-swapfile`
-```(bash)
-sudo systemctl stop dphys-swapfile
-sudo systemctl disable dphys-swapfile
-```
-
-3. Create /mnt/hdd_builder/workspace/coex-ci.json
-```(json)
-{
- "yadisk":
- {
- "login":"LOGIN",
- "password":"PASS",
- "server_dir":"/clever_images"
- },
- "github":
- {
- "login":"LOGIN",
- "password":"PASS",
- "url":"https://api.github.com/repos/CopterExpress/clever/releases/"
- }
-}
-```
-6. Add webhook to release on your github project
-> TODO
-
-9. Install Jenkins
-> Manual https://www.digitalocean.com/community/tutorials/how-to-install-jenkins-on-ubuntu-16-04
-
-10. Change user & group invoked Jenkins
-```(bash)
-sudo sed -i 's/JENKINS_USER=$NAME/JENKINS_USER=root/' /etc/default/jenkins
-sudo sed -i 's/JENKINS_GROUP=$NAME/JENKINS_GROUP=root/' /etc/default/jenkins
-```
-11. Install Jenikins plugins
-> Pipeline, Git SCM
-
-12. Create Jenkins pipeline job
-> TODO
-
-13. Configure Jenkins
-> TODO: Matrix autorization, GIT Token
-
-13. Add Jenkins service to autostart
-```(bash)
-sudo systemctl enable jenkins
-```
-
-14. Start service
-```(bash)
-sudo systemctl start jenkins
-```
-
-## Requirements
-
-* Jenkins (BlueOcean plugin, optional)
-
-## Troubleshooting
-
-If JDK not installed:
-
-```bash
-sudo apt-get install default-jdk
-```
diff --git a/image_builder/autosizer.sh b/image_builder/autosizer.sh
deleted file mode 100755
index 191de1dc..00000000
--- a/image_builder/autosizer.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/bin/bash
-
-set -e
-
-if [ $(whoami) != "root" ]; then
- echo \
- && echo "********************************************************************" \
- && echo "******************** This should be run as root ********************" \
- && echo "********************************************************************" \
- && echo \
- && exit 1
-fi
-
-if [[ -z $1 ]]; then
- echo "================================================================================"
- echo -e "\033[0;31m\033[1mAutomatic Image file resizer\033[0m\033[0m"
- echo -e "\033[0;31m\033[1mDescription:\033[0m\033[0m This script shrink your image to 10MiB free space"
- echo -e "if you didn't set FREE_SPACE in MiB (see usage below)."
- echo -e "\033[0;31m\033[1mAuthors:\033[0m\033[0m Artem Smirnov @urpylka, SirLagz"
- echo
- echo -e "\033[0;31m\033[1mUsage:\033[0m\033[0m ./autosizer.sh PATH_TO_IMAGE FREE_SPACE"
- echo
- echo -e "\033[0;31m\033[1mRequirements:\033[0m\033[0m parted, losetup, e2fsck, resize2fs, bc, truncate"
- echo "================================================================================"
- exit 0
-fi
-
-echo "================================================================================"
-strImgFile=$1
-echo -e "\033[0;31m\033[1mPath to image: $strImgFile\033[0m\033[0m"
-echo "================================================================================"
-
-if [[ ! -e $strImgFile ]]; then
- echo -e "\033[0;31m\033[1mError: File doesn't exist\033[0m\033[0m"
- echo
- exit 1
-fi
-
-echo "================================================================================"
-partinfo=`parted -m $strImgFile unit B print`
-echo -e "\033[0;31m\033[1mPartition information:\033[0m\033[0m\n$partinfo"
-echo "================================================================================"
-
-partnumber=`echo "$partinfo" | grep ext4 | awk -F: '{ print $1 }'`
-echo -e "\033[0;31m\033[1mPartition number: $partnumber\033[0m\033[0m"
-echo "================================================================================"
-
-partstart=`echo "$partinfo" | grep ext4 | awk -F: '{ print substr($2,0,length($2)-1) }'`
-echo -e "\033[0;31m\033[1mPartition start: $partstart (bytes)\033[0m\033[0m"
-echo "================================================================================"
-
-loopback=`losetup -f --show -o $partstart $strImgFile`
-echo -e "\033[0;31m\033[1mLoopback device: $loopback\033[0m\033[0m"
-echo "================================================================================"
-
-set +e
-e2fsck -fvy $loopback
-set -e
-
-echo "================================================================================"
-minsize=`resize2fs -P $loopback | awk -F': ' '{ print $2 }'`
-#minsize=`resize2fs -P $loopback 2> /dev/null | awk -F': ' '{ print $2 }'`
-echo -e "\033[0;31m\033[1mMinsize: $minsize (4KiB)\033[0m\033[0m"
-echo "================================================================================"
-
-# Default add 10MiB free space to image, if $2 doesn't set
-FREE_SPACE=${2:-10}
-
-FREE_SPACE=$(($FREE_SPACE*1024*1024/4096))
-
-minsize=`echo "$minsize+$FREE_SPACE" | bc`
-echo -e "\033[0;31m\033[1mMinsize + $FREE_SPACE (4KiB): $minsize (4KiB)\033[0m\033[0m"
-echo "================================================================================"
-
-resize2fs -p $loopback $minsize
-sleep 1
-losetup -d $loopback
-
-echo "================================================================================"
-partnewsize=`echo "$minsize * 4096" | bc`
-echo -e "\033[0;31m\033[1mNew size of part: $minsize (4KiB) = $partnewsize (bytes)\033[0m\033[0m"
-echo "================================================================================"
-
-newpartend=`echo "$partstart + $partnewsize" | bc`
-echo -e "\033[0;31m\033[1mNew end of part (Part start + part new size):\033[0m\033[0m"
-echo -e "\033[0;31m\033[1m$partstart (bytes) + $partnewsize (bytes) = $newpartend (bytes)\033[0m\033[0m"
-echo "================================================================================"
-
-part1=`parted $strImgFile rm 2`
-echo "================================================================================"
-part2=`parted $strImgFile unit B mkpart primary $partstart $newpartend`
-
-echo "================================================================================"
-endresult=`parted -m $strImgFile unit B print free | tail -1 | awk -F: '{ print substr($2,0,length($2)-1) }'`
-echo -e "\033[0;31m\033[1mSize of result image: $endresult (bytes)\033[0m\033[0m"
-echo "================================================================================"
-
-truncate -s $endresult $strImgFile
-
-echo "================================================================================"
-partinfo=`parted -m $strImgFile unit B print`
-echo -e "\033[0;31m\033[1mPartition information:\033[0m\033[0m\n$partinfo"
-echo "================================================================================"
diff --git a/image_builder/build.Jenkinsfile b/image_builder/build.Jenkinsfile
deleted file mode 100644
index 4911ae0a..00000000
--- a/image_builder/build.Jenkinsfile
+++ /dev/null
@@ -1,94 +0,0 @@
-pipeline {
- agent any
- parameters {
- string(name: 'IMAGE_NAME', defaultValue: 'clever_noname.img', description: 'Output image file name')
- string(name: 'GWBT_REF', defaultValue: 'master', description: 'Checkout ref-param')
- string(name: 'IMAGE_VERSION', defaultValue: 'no_version', description: 'Image version')
-
- string(name: 'BUILD_DIR', defaultValue: '/mnt/hdd_builder/workspace', description: 'Build workspace')
-
- string(name: 'RPI_DONWLOAD_URL', defaultValue: 'http://director.downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2018-06-29/2018-06-27-raspbian-stretch-lite.zip')
- // TODO: Add mirrorparameters
-
- string(name: 'GWBT_URL', defaultValue: 'https://github.com/CopterExpress/clever.git')
-
- // Experimental function
- booleanParam(name: 'SHRINK', defaultValue: true, description: 'SHRINK IMAGE')
- booleanParam(name: 'DISCOVER_ROS_PACKAGES', defaultValue: false, description: 'DISCOVER ROS PACKAGES')
- }
- environment {
- DEBIAN_FRONTEND = 'noninteractive'
- LANG = 'C.UTF-8'
- LC_ALL = 'C.UTF-8'
- }
- stages {
- stage('Get image') {
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh get_image ${params.BUILD_DIR} ${params.RPI_DONWLOAD_URL} ${params.IMAGE_NAME}"
- }
- }
- stage('Resize FS') {
- environment {
- SIZE = '7G'
- }
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh resize_fs ${params.BUILD_DIR}/${params.IMAGE_NAME} $SIZE"
- }
- }
- stage('Initialize image') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/init_image.sh'
- }
- // TODO: Transfer apps.sh initialisation code here
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE ${params.IMAGE_VERSION} \$(basename ${params.RPI_DONWLOAD_URL})"
- }
- }
- stage('Hardware setup') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/hardware_setup.sh'
- }
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
- }
- }
- stage('Software install') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/software_install.sh'
- }
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
- }
- }
- stage('Network setup') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/network_setup.sh'
- }
- steps {
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
- }
- }
- stage('Install ROS') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/ros_install.sh'
- MOVE_FILE = 'image_builder/kinetic-ros-coex.rosinstall'
- MOVE_TO = '/home/pi/ros_catkin_ws'
- }
- steps {
- sh "if ! ${params.DISCOVER_ROS_PACKAGES}; then $WORKSPACE/image_builder/image_config.sh copy_to_chroot ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$MOVE_FILE $MOVE_TO; fi"
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE ${params.GWBT_URL} ${params.GWBT_REF} ${params.DISCOVER_ROS_PACKAGES}"
- }
- }
- // TODO: Add finalising step, transfer mirror removal from ros.sh
- stage('Shrink image') {
- environment {
- EXECUTE_FILE = 'image_builder/scripts/change_boot_part.sh'
- }
- when { expression { return params.SHRINK } }
- steps {
- sh "$WORKSPACE/image_builder/autosizer.sh ${params.BUILD_DIR}/${params.IMAGE_NAME}"
- sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
- }
- }
- }
-}
diff --git a/image_builder/image_config.sh b/image_builder/image_config.sh
deleted file mode 100755
index d8d86c92..00000000
--- a/image_builder/image_config.sh
+++ /dev/null
@@ -1,385 +0,0 @@
-#!/bin/bash
-
-# Exit immidiately on non-zero result
-set -e
-
-#
-# Script for image configure
-# @urpylka Artem Smirnov
-# @dvornikov-aa Andrey Dvornikov
-#
-
-get_image() {
-
-# STATIC FUNCTION
-# TEMPLATE: get_image $BUILD_DIR $RPI_DONWLOAD_URL $IMAGE_NAME
-
- local RPI_ZIP_NAME=$(basename $2)
- if [ ! -e "$1/${RPI_ZIP_NAME}" ];
- then
- echo "$(date) | 1. Downloading original Linux distribution"
- wget -nv -O $1/${RPI_ZIP_NAME} $2
- echo "$(date) | Downloading complete"
- else
- echo "$(date) | 1. Linux distribution already donwloaded"
- fi
- echo "$(date) | 2. Unzipping Linux distribution image"
- local RPI_IMAGE_NAME=$(echo ${RPI_ZIP_NAME} | sed 's/zip/img/')
- unzip -p $1/${RPI_ZIP_NAME} ${RPI_IMAGE_NAME} > $1/$3
- echo "$(date) | Unzipping complete"
-}
-
-resize_fs() {
-
- # STATIC FUNCTION
- # TEMPLATE: resize_fs $IMAGE_PATH $SIZE
-
- # Partitions numbers
- local BOOT_PARTITION=1
- local ROOT_PARTITION=2
-
- set +e
-
- # https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB
-
- # https://raspberrypi.stackexchange.com/questions/13137/how-can-i-mount-a-raspberry-pi-linux-distro-image
- # fdisk -l 2017-11-29-raspbian-stretch-lite.img
- # https://www.stableit.ru/2011/05/losetup.html
- # -f : losetup сам выбрал loop (минуя занятые)
- # -P : losetup монтирует разделы в образе как отдельные подразделы,
- # например /dev/loop0p1 и /dev/loop0p2
- # --show : печатает имя устройства, например /dev/loop4
-
- # http://karelzak.blogspot.ru/2015/05/resize-by-sfdisk.html
- # ", +" : expand partition for volume size
- # -N 2 : select second partition for work
-
- # There is a risk that sfdisk will ask for a disk remount to update partition table
- # TODO: Check sfdisk exit code
-
- echo -e "\033[0;31m\033[1mTruncate image\033[0m\033[0m" \
- && truncate -s$2 $1 \
- && echo "Mount loop-image: $1" \
- && local DEV_IMAGE=$(losetup -Pf $1 --show) \
- && sleep 0.5 \
- && echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" \
- && echo ", +" | sfdisk -N ${ROOT_PARTITION} ${DEV_IMAGE} \
- && sleep 0.5 \
- && losetup -d ${DEV_IMAGE} \
- && sleep 0.5 \
- && local DEV_IMAGE=$(losetup -Pf $1 --show) \
- && sleep 0.5 \
- && echo -e "\033[0;31m\033[1mCheck & repair filesystem after expand partition\033[0m\033[0m" \
- && e2fsck -fvy "${DEV_IMAGE}p${ROOT_PARTITION}" \
- && echo -e "\033[0;31m\033[1mExpand filesystem\033[0m\033[0m" \
- && resize2fs "${DEV_IMAGE}p${ROOT_PARTITION}" \
- && echo -e "\033[0;31m\033[1mUmount loop-image\033[0m\033[0m" \
- && losetup -d ${DEV_IMAGE}
-
- set -e
-}
-
-mount_system() {
-
- # STATIC FUNCTION
- # TEMPLATE: mount_system $IMAGE
-
- # Partitions numbers
- local BOOT_PARTITION=1
- local ROOT_PARTITION=2
-
- # https://www.stableit.ru/2011/05/losetup.html
- # -f : losetup выбирает незанятое имя устройства, например /dev/loop2
- # -P : losetup монтирует разделы в образе как отдельные подразделы,
- # например /dev/loop0p1 и /dev/loop0p2
- # --show : печатает имя устройства, например /dev/loop4
-
- echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m"
- local DEV_IMAGE=$(losetup -Pf $1 --show)
- sleep 0.5
-
- # Get temp directory to mount image
- local MOUNT_POINT=$(mktemp -d)
-
- echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
- mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
- mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
-
- echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m"
- # https://github.com/debian-pi/raspbian-ua-netinst/issues/314
- echo "Mounting /proc in chroot... "
- if [ ! -d ${MOUNT_POINT}/proc ] ; then
- mkdir -p ${MOUNT_POINT}/proc \
- && echo "Created ${MOUNT_POINT}/proc"
- fi
- mount -t proc -o nosuid,noexec,nodev proc ${MOUNT_POINT}/proc \
- && echo "OK"
-
- echo "Mounting /sys in chroot... "
- if [ ! -d ${MOUNT_POINT}/sys ] ; then
- mkdir -p ${MOUNT_POINT}/sys \
- && echo "Created ${MOUNT_POINT}/sys"
- fi
- mount -t sysfs -o nosuid,noexec,nodev sysfs ${MOUNT_POINT}/sys \
- && echo "OK"
-
- echo "Mounting /dev/ and /dev/pts in chroot... " \
- && mkdir -p -m 755 ${MOUNT_POINT}/dev/pts \
- && mount -t devtmpfs -o mode=0755,nosuid devtmpfs ${MOUNT_POINT}/dev \
- && mount -t devpts -o gid=5,mode=620 devpts ${MOUNT_POINT}/dev/pts \
- && echo "OK"
- # mount -t devpts none "${MOUNT_POINT}/dev/pts" -o ptmxmode=0666,newinstance
- # ln -fs "pts/ptmx" "${MOUNT_POINT}/dev/ptmx"
-
- # mount -o bind /dev ${MOUNT_POINT}/dev
- # mount -t proc proc ${MOUNT_POINT}/proc
- # mount -t devpts devpts ${MOUNT_POINT}/dev/pts
-
- # mount -t proc proc ${MOUNT_POINT}/proc
- # mount -t sysfs sys ${MOUNT_POINT}/sys
- # mount --bind /dev ${MOUNT_POINT}/dev
-
- echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" \
- && cp -L /etc/resolv.conf ${MOUNT_POINT}/etc/resolv.conf
-
- # https://wiki.archlinux.org/index.php/Change_root_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)
- # http://www.unix-lab.org/posts/chroot/
- # https://habrahabr.ru/post/141012/
- # https://losst.ru/vosstanovlenie-grub2
- # http://unixteam.ru/content/virtualizaciya-ili-zapuskaem-prilozhenie-v-chroot-okruzhenii-razmyshleniya
- # http://help.ubuntu.ru/wiki/%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_grub
- echo -e "\033[0;31m\033[1mEnter chroot\033[0m\033[0m" \
- && chroot ${MOUNT_POINT} /bin/bash
-
- umount_system ${MOUNT_POINT} ${DEV_IMAGE}
-}
-
-execute() {
-
- # STATIC FUNCTION
- # TEMPLATE: execute $IMAGE $EXECUTE_FILE ...
-
- # Partitions numbers
- local BOOT_PARTITION=1
- local ROOT_PARTITION=2
-
- echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m"
- local DEV_IMAGE=$(losetup -Pf $1 --show)
- sleep 0.5
-
- # Get temp directory to mount image
- local MOUNT_POINT=$(mktemp -d)
-
- echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
- mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
- mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
-
- echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m"
- echo "Mounting /proc in chroot... "
- if [ ! -d ${MOUNT_POINT}/proc ] ; then
- mkdir -p ${MOUNT_POINT}/proc
- echo "Created ${MOUNT_POINT}/proc"
- fi
- mount -t proc -o nosuid,noexec,nodev proc ${MOUNT_POINT}/proc \
- && echo "OK"
-
- echo "Mounting /sys in chroot... "
- if [ ! -d ${MOUNT_POINT}/sys ] ; then
- mkdir -p ${MOUNT_POINT}/sys
- echo "Created ${MOUNT_POINT}/sys"
- fi
- mount -t sysfs -o nosuid,noexec,nodev sysfs ${MOUNT_POINT}/sys \
- && echo "OK"
-
- echo "Mounting /dev/ and /dev/pts in chroot... " \
- && mkdir -p -m 755 ${MOUNT_POINT}/dev/pts \
- && mount -t devtmpfs -o mode=0755,nosuid devtmpfs ${MOUNT_POINT}/dev \
- && mount -t devpts -o gid=5,mode=620 devpts ${MOUNT_POINT}/dev/pts \
- && echo "OK"
-
- echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" \
- && cp -L /etc/resolv.conf ${MOUNT_POINT}/etc/resolv.conf
-
- echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m"
- local script_name=$(basename $2)
- local script_path_root="${MOUNT_POINT}/root/${script_name}"
- # Copy script into chroot fs
- # TODO: Find more suitable location for temporary script storage
- cp "$2" "${script_path_root}"
- # Its important to save arguments (direct ${@:4} causes problems)
- script_args="${@:3}"
- # Run script in chroot with additional arguments
- chroot ${MOUNT_POINT} /bin/sh -c "/root/${script_name} ${script_args}"
- # Removing script from chroot fs
- rm "${script_path_root}"
-
- umount_system ${MOUNT_POINT} ${DEV_IMAGE}
-}
-
-copy_to_chroot() {
-
- # STATIC FUNCTION
- # TEMPLATE: copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
-
- # Partitions numbers
- local BOOT_PARTITION=1
- local ROOT_PARTITION=2
-
- echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m"
- local DEV_IMAGE=$(losetup -Pf $1 --show)
- sleep 0.5
-
- # Get temp directory to mount image
- local MOUNT_POINT=$(mktemp -d)
-
- echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
- mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
- mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
-
- echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m"
- file_name=$(basename $2)
- file_path_root="${MOUNT_POINT}$3/${file_name}"
- # Copy script into chroot fs
- # TODO: Find more suitable location for temporary script storage
- if [ ! -d ${file_path_root} ] ; then
- mkdir -p ${file_path_root} \
- && echo "Created ${file_path_root}"
- fi
- cp "$2" "${file_path_root}"
-
- umount_system ${MOUNT_POINT} ${DEV_IMAGE}
-}
-
-umount_system() {
-
- # STATIC FUNCTION
- # TEMPLATE: umount_system $MOUNT_POINT $DEV_IMAGE
-
- echo -e "\033[0;31m\033[1m$(date) | Umount recursive dirs: $1\033[0m\033[0m"
- # There is a risk that umount will fail
- set +e
- # Successfull unmount flag (false at thismoment)
- umount_ok=false
- # Repeat 5 times
- for i in {1..5}
- do
- # Unmount chroot rootfs and boot partition
- umount -fR $1
- # If no problems detected
- if [[ $? == 0 ]]
- then
- echo -e "\033[0;31m\033[1m$(date) | Successfull unmount\033[0m\033[0m"
- # Set flag
- umount_ok=true
- # Exit loop
- break
- fi
- # Unmount has failed
- echo -e "\033[0;31m\033[1m$(date) | Unmount failed\033[0m\033[0m"
- # Wait for some time
- sleep 2
- done
- set -e
- # Jenkins job will fail if this condition is not true
- [[ "$umount_ok" == true ]]
- echo -e "\033[0;31m\033[1m$(date) | Umount loop-image\033[0m\033[0m"
- #losetup -d $DEV_IMAGE
- losetup -d $2
-}
-
-publish_image() {
-
-# STATIC FUNCTION
-# TEMPLATE: publish_image_bash $BUILD_DIR $IMAGE_NAME $YA_SCRIPT $CONFIG_FILE $RELEASE_ID $RELEASE_BODY
-
-# https://developer.github.com/v3/repos/releases/
-#RELEASE_BODY="### Changelog\n* Add /boot/cmdline.txt net.ifnames=0 https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/\n* Updated cophelper\n* Installed copstat"
-
- echo -e "\033[0;31m\033[1m$(date) | Zip image\033[0m\033[0m"
- if [ ! -e "$1/$2.zip" ];
- then
- cd $1 && zip $2.zip $2
- echo -e "\033[0;31m\033[1m$(date) | Zipping complete!\033[0m\033[0m"
- else
- echo -e "\033[0;31m\033[1m$(date) | Zip-archive already created\033[0m\033[0m"
- cd $1 && rm $2.zip && zip $2.zip $2
- echo -e "\033[0;31m\033[1m$(date) | Old archive was deleted & create new\033[0m\033[0m"
- fi
-
- echo -e "\033[0;31m\033[1m$(date) | Upload image\033[0m\033[0m"
- local IMAGE_LINK=$($3 $4 $1/$2.zip)
- echo -e "\033[0;31m\033[1m$(date) | Upload copmlete!\033[0m\033[0m"
-
- echo -e "\033[0;31m\033[1m$(date) | Meashure size of zip-image\033[0m\033[0m"
- local IMAGE_SIZE=$(du -sh $1/$2.zip | awk '{ print $1 }')
- echo -e "\033[0;31m\033[1m$(date) | Meashuring copmlete!\033[0m\033[0m"
-
- echo -e "\033[0;31m\033[1m$(date) | Meashure hash-sum of zip-image\033[0m\033[0m"
- local IMAGE_HASH=$(sha256sum $1/$2.zip | awk '{ print $1 }')
- echo -e "\033[0;31m\033[1m$(date) | Meashuring copmlete!\033[0m\033[0m"
-
- echo ""
- echo "\$6: $6"
- echo ""
-
- echo -e "\033[0;31m\033[1m$(date) | Post message to GH\033[0m\033[0m"
- local NEW_RELEASE_BODY="### Download\n* [$2.zip]($IMAGE_LINK) ($IMAGE_SIZE)\nsha256: $IMAGE_HASH\n\n$6"
- local DATA="{ \"body\":\"$NEW_RELEASE_BODY\" }"
-
- echo ""
- echo "\$DATA: $DATA"
- echo ""
-
- local GH_LOGIN=$(cat $4 | jq '.github.login' -r)
- local GH_PASS=$(cat $4 | jq '.github.password' -r)
- local GH_URL=$(cat $4 | jq '.github.url' -r)
- curl -d "$DATA" -u "$GH_LOGIN:$GH_PASS" --request PATCH $GH_URL$5
- echo -e "\033[0;31m\033[1m$(date) | Post message to GH copmlete!\033[0m\033[0m"
-}
-
-if [ $(whoami) != "root" ];
-then echo "" \
- && echo "********************************************************************" \
- && echo "******************** This should be run as root ********************" \
- && echo "********************************************************************" \
- && echo "" \
- && exit 1
-fi
-
-echo "\$#: $#"
-echo "\$1: $1"
-echo "\$2: $2"
-echo "\$3: $3"
-echo "\$4: $4"
-echo "\$5: $5"
-echo "\$6: $6"
-echo "\$7: $7"
-
-case "$1" in
- mount_system)
- # mount_system $IMAGE
- mount_system $2;;
-
- get_image)
- # get_image $BUILD_DIR $RPI_DONWLOAD_URL $IMAGE_NAME
- get_image $2 $3 $4;;
-
- resize_fs)
- # resize_fs $IMAGE_PATH $SIZE
- resize_fs $2 $3;;
-
- publish_image)
- # publish_image $BUILD_DIR $IMAGE_NAME $YA_SCRIPT $CONFIG_FILE $RELEASE_ID $RELEASE_BODY
- publish_image $2 $3 $4 $5 $6 "$7";;
-
- execute)
- # execute $IMAGE $EXECUTE_FILE ...
- execute $2 $3 ${@:4};;
-
- copy_to_chroot)
- # copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
- copy_to_chroot $2 $3 $4;;
-
- *)
- echo "Enter one of: mount_system, get_image, resize_fs, publish_image, execute";;
-esac
diff --git a/image_builder/scripts/change_boot_part.sh b/image_builder/scripts/change_boot_part.sh
deleted file mode 100755
index bca48d7a..00000000
--- a/image_builder/scripts/change_boot_part.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-set -e
-
-echo -e "\033[0;31m\033[1m$(date) | #1 Change boot partition\033[0m\033[0m"
-
-sed -i 's/root=[^ ]*/root=\/dev\/mmcblk0p2/' /boot/cmdline.txt
-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
-
-echo -e "\033[0;31m\033[1m$(date) | End of change boot partition\033[0m\033[0m"
diff --git a/image_builder/scripts/init_image.sh b/image_builder/scripts/init_image.sh
deleted file mode 100755
index b96839ea..00000000
--- a/image_builder/scripts/init_image.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/bash
-
-set -e
-
-##################################################################################################################################
-# Image initialisation
-##################################################################################################################################
-
-# Add apt key to allow local mirror usage during image build
-#wget -O - ftp://192.168.0.10/coex-mirror.gpg | apt-key add -
-# Generate a backup of the original source.list
-#cp /etc/apt/sources.list /var/sources.list.bak
-# Add the local mirror as the first priority repository
-#wget -O - ftp://192.168.0.10/coex-mirror.list 2>/dev/null | cat - /etc/apt/sources.list > /var/sources.list && mv /var/sources.list /etc/apt/sources.list
-
-echo -e "\033[0;31m\033[1m$(date) | #1 apt cache update\033[0m\033[0m"
-
-# Clean repostory cache
-apt-get clean
-# Update repository cache
-apt-get update
-# && apt upgrade -y
-
-echo -e "\033[0;31m\033[1m$(date) | #2 Write clever information\033[0m\033[0m"
-
-# Clever image version
-echo "$1" >> /etc/clever_version
-# Origin image file name
-echo "${2%.*}" >> /etc/clever_origin
-
-
-echo -e "\033[0;31m\033[1m$(date) | #3 Set max space for syslogs\033[0m\033[0m"
-
-# https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl
-sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/' /etc/systemd/journald.conf
-
-
-echo -e "\033[0;31m\033[1m$(date) | #4 End initialisation of image\033[0m\033[0m"
diff --git a/image_builder/scripts/network_setup.sh b/image_builder/scripts/network_setup.sh
deleted file mode 100755
index 420be48e..00000000
--- a/image_builder/scripts/network_setup.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-
-set -e
-
-echo -e "\033[0;31m\033[1m$(date) | #1 Write to /etc/wpa_supplicant/wpa_supplicant.conf\033[0m\033[0m"
-
-# TODO: Use wpa_cli insted direct file edit
-echo "
-network={
- ssid=\"CLEVER\"
- psk=\"cleverwifi\"
- mode=2
- proto=RSN
- key_mgmt=WPA-PSK
- pairwise=CCMP
- group=CCMP
- auth_alg=OPEN
-}" >> /etc/wpa_supplicant/wpa_supplicant.conf
-
-echo -e "\033[0;31m\033[1m$(date) | #2 Write STATIC to /etc/dhcpcd.conf\033[0m\033[0m"
-
-echo "
-interface wlan0
-static ip_address=192.168.11.1/24" >> /etc/dhcpcd.conf
-
-echo -e "\033[0;31m\033[1m$(date) | #3 Write dhcp-config to /etc/dnsmasq.conf\033[0m\033[0m"
-
-echo "
-interface=wlan0
-address=/clever/coex/192.168.11.1
-dhcp-range=192.168.11.100,192.168.11.200,12h
-no-hosts
-filterwin2k
-bogus-priv
-domain-needed
-quiet-dhcp6
-" >> /etc/dnsmasq.conf
-
-echo -e "\033[0;31m\033[1m$(date) | #4 Write magic script for rename SSID to /etc/rc.local\033[0m\033[0m"
-
-RENAME_SSID="sudo sed -i.OLD \"s/CLEVER/CLEVER-\$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)/g\" /etc/wpa_supplicant/wpa_supplicant.conf && sudo sed -i '/sudo sed/d' /etc/rc.local && sudo reboot"
-
-sed -i "19a$RENAME_SSID" /etc/rc.local
-
-echo -e "\033[0;31m\033[1m$(date) | #5 End of network installation\033[0m\033[0m"
diff --git a/image_builder/scripts/ros_install.sh b/image_builder/scripts/ros_install.sh
deleted file mode 100755
index 70383e12..00000000
--- a/image_builder/scripts/ros_install.sh
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/bash
-
-set -e
-
-##################################################################################################################################
-# ROS for user pi
-##################################################################################################################################
-
-# ros http://wiki.ros.org/action/fullsearch/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi
-
-echo -e "\033[0;31m\033[1m$(date) | Installing ROS\033[0m\033[0m"
-
-echo -e "\033[0;31m\033[1m$(date) | #1 Installing dirmngr & add key to apt-key\033[0m\033[0m"
-
-# Install a tool that apt-key uses to add ROS repository key
-# http://wpblogger.su/tags/apt/
-apt-get install --no-install-recommends -y dirmngr=2.1.18-8~deb9u2
-# setup keys
-apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
-
-# setup sources.list
-echo "deb http://packages.ros.org/ros/ubuntu stretch main" > /etc/apt/sources.list.d/ros-latest.list
-
-echo -e "\033[0;31m\033[1m$(date) | #2 apt update && apt upgrade\033[0m\033[0m"
-
-# install bootstrap tools
-apt-get update
-# && apt upgrade -y
-
-echo -e "\033[0;31m\033[1m$(date) | #3 Installing wget, unzip, python-rosdep, python-rosinstall-generator, python-wstool, python-rosinstall, build-essential, cmake\033[0m\033[0m"
-
-apt-get install --no-install-recommends -y \
- python-rosdep=0.12.2-1 \
- python-rosinstall-generator=0.1.14-1 \
- python-wstool=0.1.17-1 \
- python-rosinstall=0.7.8-1 \
- build-essential=12.3
-
-echo -e "\033[0;31m\033[1m$(date) | #4 rosdep init && rosdep update\033[0m\033[0m"
-
-# bootstrap rosdep
-rosdep init && rosdep update
-
-# If $3 = false, then discover packages
-if [ "$3" = "false" ];
-then
- echo -e "\033[0;31m\033[1m$(date) | #5 Preparing ros_comm packages to kinetic-ros_comm-wet.rosinstall\033[0m\033[0m"
-
- # create ros catkin workspace
- mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
- && rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall \
- && wstool init src kinetic-ros_comm-wet.rosinstall
-
- echo -e "\033[0;31m\033[1m$(date) | #6 Preparing other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m"
-
- cd /home/pi/ros_catkin_ws \
- && rosinstall_generator \
- actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common cv_bridge cv_camera diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport compressed_image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs web_video_server xmlrpcpp mavros opencv3 mavros_extras interactive_markers tf2_web_republisher interactive_marker_proxy \
- --rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall \
- && wstool merge -t src kinetic-custom_ros.rosinstall \
- && wstool update -t src
-else
- echo -e "\033[0;31m\033[1m$(date) | #5 Creating manual ros_catkin_ws\033[0m\033[0m"
-
- mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
- && wstool init src kinetic-ros-coex.rosinstall
-fi
-
-echo -e "\033[0;31m\033[1m$(date) | #7 Installing dependencies apps with rosdep\033[0m\033[0m"
-cd /home/pi/ros_catkin_ws
-# There is a risk that umount will fail
-set +e
-# Successfull unmount flag (false at thismoment)
-install_ok=false
-# Repeat 5 times
-for i in {1..5}
-do
- # Resolving Dependencies with rosdep
- rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:stretch
- # If no problems detected
- if [[ $? == 0 ]]
- then
- echo -e "\033[0;31m\033[1m$(date) | Successfull rosdep install\033[0m\033[0m"
- # Set flag
- install_ok=true
- # Exit loop
- break
- fi
- # Unmount has failed
- echo -e "\033[0;31m\033[1m$(date) | Rosdep installation failed\033[0m\033[0m"
- # Wait for some time
- sleep 2
-done
-set -e
-# Jenkins job will fail if this condition is not true
-[[ "$install_ok" == true ]]
-echo -e "\033[0;31m\033[1m$(date) | End of rosdep install\033[0m\033[0m"
-
-echo -e "\033[0;31m\033[1m$(date) | #8 Refactoring usb_cam in SRC\033[0m\033[0m"
-
-sed -i '/#define __STDC_CONSTANT_MACROS/a\#define PIX_FMT_RGB24 AV_PIX_FMT_RGB24\n#define PIX_FMT_YUV422P AV_PIX_FMT_YUV422P' /home/pi/ros_catkin_ws/src/usb_cam/src/usb_cam.cpp
-
-echo -e "\033[0;31m\033[1m$(date) | #9 Installing GeographicLib datasets\033[0m\033[0m"
-
-/home/pi/ros_catkin_ws/src/mavros/mavros/scripts/install_geographiclib_datasets.sh
-
-#echo -e "\033[0;31m\033[1m$(date) | #11 Building light packages on 2 threads\033[0m\033[0m"
-
-# Build the catkin Workspace
-#cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -j2 --install-space /opt/ros/kinetic --pkg actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs xmlrpcpp
-
-#echo -e "\033[0;31m\033[1m$(date) | #12 Building heavy packages\033[0m\033[0m"
-
-# This command uses less threads to avoid Raspberry Pi freeze
-# Build the catkin Workspace
-#cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -j1 --install-space /opt/ros/kinetic --pkg mavros opencv3 cv_bridge cv_camera mavros_extras web_video_server
-
-echo -e "\033[0;31m\033[1m$(date) | #10 Building packages on 1 thread\033[0m\033[0m"
-
-# Install builded packages
-# WARNING: A major bug was found when using --pkg option (catkin_make_isolated doesn't install environment files)
-# TODO: Can we increase threads number with HDD swap?
-cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -j1 -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic
-
-echo -e "\033[0;31m\033[1m$(date) | #11 Remove build_isolated & devel_isolated from ros_catkin_ws\033[0m\033[0m"
-
-rm -rf /home/pi/ros_catkin_ws/build_isolated /home/pi/ros_catkin_ws/devel_isolated
-chown -Rf pi:pi /home/pi/ros_catkin_ws
-
-echo -e "\033[0;31m\033[1m$(date) | #12 Creating catkin_ws & Installing CLEVER-BUNDLE\033[0m\033[0m"
-
-git clone $1 /home/pi/catkin_ws/src/clever \
- && cd /home/pi/catkin_ws/src/clever \
- && git checkout $2 \
- && pip install wheel \
- && pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \
- && cd /home/pi/catkin_ws \
- && . /opt/ros/kinetic/setup.sh \
- && catkin_make -j1 -DCMAKE_BUILD_TYPE=Release \
- && ln -s /home/pi/catkin_ws/src/clever/deploy/roscore.service /lib/systemd/system/roscore.service \
- && ln -s /home/pi/catkin_ws/src/clever/deploy/clever.service /lib/systemd/system/clever.service \
- && systemctl enable roscore \
- && systemctl enable clever
-
-echo -e "\033[0;31m\033[1m$(date) | #13 Change permissions for catkin_ws\033[0m\033[0m"
-
-chown -Rf pi:pi /home/pi/catkin_ws
-
-echo -e "\033[0;31m\033[1m$(date) | #14 Setup ROS environment\033[0m\033[0m"
-
-cat < /dev/null
-LANG=C.UTF-8
-LC_ALL=C.UTF-8
-ROS_DISTRO=kinetic
-export ROS_IP=192.168.11.1
-source /opt/ros/kinetic/setup.bash
-source /home/pi/catkin_ws/devel/setup.bash
-EOF
-
-#echo -e "\033[0;31m\033[1m$(date) | #14 Removing local apt mirror\033[0m\033[0m"
-# Restore original sources.list
-#mv /var/sources.list.bak /etc/apt/sources.list
-# Clean apt cache
-apt-get clean
-# Remove local mirror repository key
-#apt-key del COEX-MIRROR
-
-echo -e "\033[0;31m\033[1m$(date) | #14 Install Butterfly\033[0m\033[0m"
-# install and enable Butterfly (web terminal)
-# TODO: move it back to software_install
-# Had to move it here, as we don't have `clever` directory in software_install
-pip3 install butterfly
-pip3 install butterfly[systemd]
-ln -s /home/pi/catkin_ws/src/clever/deploy/butterfly.service /lib/systemd/system/
-ln -s /home/pi/catkin_ws/src/clever/deploy/butterfly.socket /lib/systemd/system/
-systemctl enable butterfly.socket
-
-echo -e "\033[0;31m\033[1m$(date) | END of ROS INSTALLATION\033[0m\033[0m"
diff --git a/image_builder/scripts/software_install.sh b/image_builder/scripts/software_install.sh
deleted file mode 100755
index cb82a03b..00000000
--- a/image_builder/scripts/software_install.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-
-set -e
-
-##################################################################################################################################
-# Image software installation
-##################################################################################################################################
-
-echo -e "\033[0;31m\033[1m$(date) | #1 Software installing\033[0m\033[0m"
-
-# TODO: Use dnsmasq instead of isc-dhcp-server
-apt-get install --no-install-recommends -y \
- unzip=6.0-21 \
- zip=3.0-11 \
- ipython=5.1.0-3 \
- ipython3=5.1.0-3 \
- screen=4.5.0-6 \
- byobu=5.112-1 \
- nmap=7.40-1 \
- lsof=4.89+dfsg-0.1 \
- git=1:2.11.0-3+deb9u3 \
- dnsmasq=2.76-5+rpt1+deb9u1 \
- tmux=2.3-4 \
- vim=2:8.0.0197-4+deb9u1 \
- cmake=3.7.2-1 \
- python-pip=9.0.1-2+rpt2 \
- python3-pip=9.0.1-2+rpt2 \
- libjpeg8-dev=8d1-2 \
- tcpdump \
- ltrace \
- libpoco-dev=1.7.6+dfsg1-5+deb9u1 \
- libffi-dev # for butterfly
-
-# Deny byobu to check available updates
-sed -i "s/updates_available//" /usr/share/byobu/status/status
-# sed -i "s/updates_available//" /home/pi/.byobu/status
-
-# install Monkey web-server
-cd /home/pi
-git clone https://github.com/monkey/monkey.git
-cd monkey
-git checkout v1.6.9
-./configure --malloc-libc --local
-make
-setcap 'cap_net_bind_service=+ep' ./build/monkey # allow using 80 port
-rm build/conf/sites/default
-ln -s /home/pi/catkin_ws/src/clever/deploy/monkey ./build/conf/sites/default
-cd /home/pi
-
-echo -e "\033[0;31m\033[1m$(date) | #2 Adding mjpg-streamer at /home/pi\033[0m\033[0m"
-# https://github.com/jacksonliam/mjpg-streamer
-
-git clone https://github.com/jacksonliam/mjpg-streamer.git /home/pi/mjpg-streamer \
- && cd /home/pi/mjpg-streamer/mjpg-streamer-experimental \
- && make \
- && make install \
- && chown -Rf pi:pi /home/pi/mjpg-streamer
-
-echo -e "\033[0;31m\033[1m$(date) | Miscellaneous\033[0m\033[0m"
-
-# vim settings
-echo "set mouse-=a
-syntax on
-autocmd BufNewFile,BufRead *.launch set syntax=xml
-" > /home/pi/.vimrc
-
-echo -e "\033[0;31m\033[1m$(date) | End of network installation\033[0m\033[0m"
diff --git a/image_builder/yadisk.py b/image_builder/yadisk.py
deleted file mode 100755
index cacd1517..00000000
--- a/image_builder/yadisk.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Simple python uploader to YaDisk
-# Smirnov Artem @urpylka
-#
-# Use:
-# python yadisk.py login password file server_dir
-#
-
-from YaDiskClient.YaDiskClient import YaDisk
-import os.path, sys, json
-
-def upload(_login, _password, _server_dir, _file):
- if os.path.isfile(_file):
- disk = YaDisk(_login, _password)
- disk.upload(_file, _server_dir + '/' + os.path.basename(_file))
- link = disk.publish_doc(_server_dir + '/' + os.path.basename(_file))
- print link
- else:
- print "Error: file-path is bad"
- return 1
-
-def main():
- if (len(sys.argv) == 5):
- print "login: " + sys.argv[1]
- print "password: " + sys.argv[2]
- print "server_dir: " + sys.argv[3]
- print "file: " + sys.argv[4]
-
- upload(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
-
- elif (len(sys.argv) == 3):
- # print "config: " + sys.argv[1]
- # print "file: " + sys.argv[2]
-
- if os.path.isfile(sys.argv[1]) and os.path.isfile(sys.argv[2]):
-
- with open(sys.argv[1]) as json_data:
- d = json.load(json_data)
- upload(d['yadisk']['login'], d['yadisk']['password'], d['yadisk']['server_dir'], sys.argv[2])
-
- else:
- print "Error: file-path or config-path is bad"
- return 1
- else:
- print "Error: amount of args is incorrect"
- return 1
-
-if __name__ == '__main__':
- main()