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).** -[![Build Status](http://builder.coex.space/job/CopterExpress---clever/badge/icon)](http://builder.coex.space/job/CopterExpress---clever/) +[![Build Status](https://travis-ci.org/urpylka/clever.svg?branch=master)](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()