diff --git a/bash_scripts/protobuf_install.txt b/bash_scripts/protobuf_install.txt new file mode 100644 index 0000000..7bd7a4b --- /dev/null +++ b/bash_scripts/protobuf_install.txt @@ -0,0 +1,14 @@ +sudo apt-get install libprotobuf-dev=3.0.0-9.1ubuntu1 libprotoc-dev=3.0.0-9.1ubuntu1 protobuf-compiler=3.0.0-9.1ubuntu1 + +commit: 601c588294973caf105b79a23f7587c6b991bb05 + +Qground control: +wget https://github.com/mavlink/qgroundcontrol/releases/download/v4.2.0/QGroundControl.AppImage +chmod +x QGroundControl.AppImage + +mavros/mavlink: +cp -R ~/catkin_ws/src/oscillation_ctrl/bash_scripts/rosinstall.txt /tmp/mavros.rosinstall +wstool merge -t src /tmp/mavros.rosinstall +wstool update -t src -j4 +rosdep install --from-paths src --ignore-src -y +catkin build diff --git a/bash_scripts/rosinstall.txt b/bash_scripts/rosinstall.txt new file mode 100644 index 0000000..dcf2309 --- /dev/null +++ b/bash_scripts/rosinstall.txt @@ -0,0 +1,8 @@ +- git: + local-name: mavlink + uri: https://github.com/mavlink/mavlink-gbp-release.git + version: release/melodic/mavlink/2020.2.2-1 +- git: + local-name: mavros + uri: https://github.com/mavlink/mavros.git + version: 0.32.0 diff --git a/bash_scripts/ubuntu.sh b/bash_scripts/ubuntu.sh new file mode 100755 index 0000000..852f38c --- /dev/null +++ b/bash_scripts/ubuntu.sh @@ -0,0 +1,254 @@ +#! /usr/bin/env bash + +set -e + +## Bash script to setup PX4 development environment on Ubuntu LTS (20.04, 18.04, 16.04). +## Can also be used in docker. +## +## Installs: +## - Common dependencies and tools for nuttx, jMAVSim, Gazebo +## - NuttX toolchain (omit with arg: --no-nuttx) +## - jMAVSim and Gazebo9 simulator (omit with arg: --no-sim-tools) +## +## Not Installs: +## - FastRTPS and FastCDR + +INSTALL_NUTTX="true" +INSTALL_SIM="true" +INSTALL_ARCH=`uname -m` + +# Parse arguments +for arg in "$@" +do + if [[ $arg == "--no-nuttx" ]]; then + INSTALL_NUTTX="false" + fi + + if [[ $arg == "--no-sim-tools" ]]; then + INSTALL_SIM="false" + fi + +done + +# detect if running in docker +if [ -f /.dockerenv ]; then + echo "Running within docker, installing initial dependencies"; + apt-get --quiet -y update && DEBIAN_FRONTEND=noninteractive apt-get --quiet -y install \ + ca-certificates \ + gnupg \ + lsb-core \ + sudo \ + wget \ + ; +fi + +# script directory +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# check requirements.txt exists (script not run in source tree) +REQUIREMENTS_FILE="requirements.txt" +if [[ ! -f "${DIR}/${REQUIREMENTS_FILE}" ]]; then + echo "FAILED: ${REQUIREMENTS_FILE} needed in same directory as ubuntu.sh (${DIR})." + return 1 +fi + + +# check ubuntu version +# otherwise warn and point to docker? +UBUNTU_RELEASE="`lsb_release -rs`" + +if [[ "${UBUNTU_RELEASE}" == "14.04" ]]; then + echo "Ubuntu 14.04 is no longer supported" + exit 1 +elif [[ "${UBUNTU_RELEASE}" == "16.04" ]]; then + echo "Ubuntu 16.04 is no longer supported" + exit 1 +elif [[ "${UBUNTU_RELEASE}" == "18.04" ]]; then + echo "Ubuntu 18.04" +elif [[ "${UBUNTU_RELEASE}" == "20.04" ]]; then + echo "Ubuntu 20.04" +fi + + +echo +echo "Installing PX4 general dependencies" + +sudo apt-get update -y --quiet +sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + astyle \ + build-essential \ + cmake \ + cppcheck \ + file \ + g++ \ + gcc \ + gdb \ + git \ + lcov \ + libxml2-dev \ + libxml2-utils \ + make \ + ninja-build \ + python3 \ + python3-dev \ + python3-pip \ + python3-setuptools \ + python3-wheel \ + rsync \ + shellcheck \ + unzip \ + zip \ + ; + +# Python3 dependencies +echo +echo "Installing PX4 Python3 dependencies" +if [ -n "$VIRTUAL_ENV" ]; then + # virtual envrionments don't allow --user option + python -m pip install -r ${DIR}/requirements.txt +else + # older versions of Ubuntu require --user option + python3 -m pip install --user -r ${DIR}/requirements.txt +fi + +# NuttX toolchain (arm-none-eabi-gcc) +if [[ $INSTALL_NUTTX == "true" ]]; then + + echo + echo "Installing NuttX dependencies" + + sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + automake \ + binutils-dev \ + bison \ + build-essential \ + flex \ + g++-multilib \ + gcc-multilib \ + gdb-multiarch \ + genromfs \ + gettext \ + gperf \ + libelf-dev \ + libexpat-dev \ + libgmp-dev \ + libisl-dev \ + libmpc-dev \ + libmpfr-dev \ + libncurses5 \ + libncurses5-dev \ + libncursesw5-dev \ + libtool \ + pkg-config \ + screen \ + texinfo \ + u-boot-tools \ + util-linux \ + vim-common \ + ; + if [[ "${UBUNTU_RELEASE}" == "20.04" ]]; then + sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + kconfig-frontends \ + ; + fi + + + if [ -n "$USER" ]; then + # add user to dialout group (serial port access) + sudo usermod -a -G dialout $USER + fi + + # arm-none-eabi-gcc + NUTTX_GCC_VERSION="9-2020-q2-update" + NUTTX_GCC_VERSION_SHORT="9-2020q2" + + source $HOME/.profile # load changed path for the case the script is reran before relogin + if [ $(which arm-none-eabi-gcc) ]; then + GCC_VER_STR=$(arm-none-eabi-gcc --version) + GCC_FOUND_VER=$(echo $GCC_VER_STR | grep -c "${NUTTX_GCC_VERSION}") + fi + + if [[ "$GCC_FOUND_VER" == "1" ]]; then + echo "arm-none-eabi-gcc-${NUTTX_GCC_VERSION} found, skipping installation" + + else + echo "Installing arm-none-eabi-gcc-${NUTTX_GCC_VERSION}"; + wget -O /tmp/gcc-arm-none-eabi-${NUTTX_GCC_VERSION}-linux.tar.bz2 https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/${NUTTX_GCC_VERSION_SHORT}/gcc-arm-none-eabi-${NUTTX_GCC_VERSION}-${INSTALL_ARCH}-linux.tar.bz2 && \ + sudo tar -jxf /tmp/gcc-arm-none-eabi-${NUTTX_GCC_VERSION}-linux.tar.bz2 -C /opt/; + + # add arm-none-eabi-gcc to user's PATH + exportline="export PATH=/opt/gcc-arm-none-eabi-${NUTTX_GCC_VERSION}/bin:\$PATH" + + if grep -Fxq "$exportline" $HOME/.profile; then + echo "${NUTTX_GCC_VERSION} path already set."; + else + echo $exportline >> $HOME/.profile; + fi + fi +fi + +# Simulation tools +if [[ $INSTALL_SIM == "true" ]]; then + + echo + echo "Installing PX4 simulation dependencies" + + # General simulation dependencies + sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + bc \ + ; + + if [[ "${UBUNTU_RELEASE}" == "18.04" ]]; then + java_version=11 + gazebo_version=9 + elif [[ "${UBUNTU_RELEASE}" == "20.04" ]]; then + java_version=13 + gazebo_version=11 + else + java_version=14 + gazebo_version=11 + fi + # Java (jmavsim or fastrtps) + sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + ant \ + openjdk-$java_version-jre \ + openjdk-$java_version-jdk \ + libvecmath-java \ + ; + + # Set Java 11 as default + sudo update-alternatives --set java $(update-alternatives --list java | grep "java-$java_version") + + # Gazebo + sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' + wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - + # Update list, since new gazebo-stable.list has been added + sudo apt-get update -y --quiet + sudo DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends install \ + dmidecode \ + gazebo$gazebo_version \ + gstreamer1.0-plugins-bad \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-ugly \ + gstreamer1.0-libav \ + libeigen3-dev \ + libgazebo$gazebo_version-dev \ + libgstreamer-plugins-base1.0-dev \ + libimage-exiftool-perl \ + libopencv-dev \ + libxml2-utils \ + pkg-config \ + protobuf-compiler \ + ; + + if sudo dmidecode -t system | grep -q "Manufacturer: VMware, Inc." ; then + # fix VMWare 3D graphics acceleration for gazebo + echo "export SVGA_VGPU10=0" >> ~/.profile + fi +fi + +if [[ $INSTALL_NUTTX == "true" ]]; then + echo + echo "Relogin or reboot computer before attempting to build NuttX targets" +fi diff --git a/bash_scripts/ubuntu_sim_ros_melodic.sh b/bash_scripts/ubuntu_sim_ros_melodic.sh new file mode 100644 index 0000000..e31985f --- /dev/null +++ b/bash_scripts/ubuntu_sim_ros_melodic.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +## Bash script for setting up ROS Melodic (with Gazebo 9) development environment for PX4 on Ubuntu LTS (18.04). +## It installs the common dependencies for all targets (including Qt Creator) +## +## Installs: +## - Common dependencies libraries and tools as defined in `ubuntu_sim_common_deps.sh` +## - ROS Melodic (including Gazebo9) +## - MAVROS + +if [[ $(lsb_release -sc) == *"xenial"* ]]; then + echo "OS version detected as $(lsb_release -sc) (16.04)." + echo "ROS Melodic requires at least Ubuntu 18.04." + echo "Exiting ...." + return 1; +fi + +echo "Downloading dependent script 'ubuntu_sim_common_deps.sh'" +# Source the ubuntu_sim_common_deps.sh script directly from github +common_deps=$(wget https://raw.githubusercontent.com/PX4/Devguide/master/build_scripts/ubuntu_sim_common_deps.sh -O -) +wget_return_code=$? +# If there was an error downloading the dependent script, we must warn the user and exit at this point. +if [[ $wget_return_code -ne 0 ]]; then echo "Error downloading 'ubuntu_sim_common_deps.sh'. Sorry but I cannot proceed further :("; exit 1; fi +# Otherwise source the downloaded script. +. <(echo "${common_deps}") + +# ROS Melodic +## Gazebo simulator dependencies +sudo apt-get install libeigen3-dev libopencv-dev protobuf-compiler=3.0.0-9.1ubuntu1 -y + +## ROS Gazebo: http://wiki.ros.org/melodic/Installation/Ubuntu +## Setup keys +sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' +sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 +## For keyserver connection problems substitute hkp://pgp.mit.edu:80 or hkp://keyserver.ubuntu.com:80 above. +sudo apt-get update +## Get ROS/Gazebo +sudo apt install ros-melodic-desktop-full -y +## Initialize rosdep +sudo rosdep init +rosdep update +## Setup environment variables +rossource="source /opt/ros/melodic/setup.bash" +if grep -Fxq "$rossource" ~/.bashrc; then echo ROS setup.bash already in .bashrc; +else echo "$rossource" >> ~/.bashrc; fi +eval $rossource + +## Install rosinstall and other dependencies +sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y + + + +# MAVROS: https://dev.px4.io/en/ros/mavros_installation.html +## Install dependencies +sudo apt-get install python-catkin-tools python-rosinstall-generator -y + +## Create catkin workspace +mkdir -p ~/catkin_ws/src +cd ~/catkin_ws +catkin init +wstool init src + + +## Install MAVLink +###we use the Kinetic reference for all ROS distros as it's not distro-specific and up to date +rosinstall_generator --rosdistro kinetic mavlink | tee /tmp/mavros.rosinstall + +## Build MAVROS +### Get source (upstream - released) +rosinstall_generator --upstream mavros | tee -a /tmp/mavros.rosinstall + +### Setup workspace & install deps +wstool merge -t src /tmp/mavros.rosinstall +wstool update -t src +if ! rosdep install --from-paths src --ignore-src -y; then + # (Use echo to trim leading/trailing whitespaces from the unsupported OS name + unsupported_os=$(echo $(rosdep db 2>&1| grep Unsupported | awk -F: '{print $2}')) + rosdep install --from-paths src --ignore-src --rosdistro melodic -y --os ubuntu:bionic +fi + +if [[ ! -z $unsupported_os ]]; then + >&2 echo -e "\033[31mYour OS ($unsupported_os) is unsupported. Assumed an Ubuntu 18.04 installation," + >&2 echo -e "and continued with the installation, but if things are not working as" + >&2 echo -e "expected you have been warned." +fi + +#Install geographiclib +sudo apt install geographiclib-tools -y +echo "Downloading dependent script 'install_geographiclib_datasets.sh'" +# Source the install_geographiclib_datasets.sh script directly from github +install_geo=$(wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh -O -) +wget_return_code=$? +# If there was an error downloading the dependent script, we must warn the user and exit at this point. +if [[ $wget_return_code -ne 0 ]]; then echo "Error downloading 'install_geographiclib_datasets.sh'. Sorry but I cannot proceed further :("; exit 1; fi +# Otherwise source the downloaded script. +sudo bash -c "$install_geo" + +## Build! +catkin build +## Re-source environment to reflect new packages/build environment +catkin_ws_source="source ~/catkin_ws/devel/setup.bash" +if grep -Fxq "$catkin_ws_source" ~/.bashrc; then echo ROS catkin_ws setup.bash already in .bashrc; +else echo "$catkin_ws_source" >> ~/.bashrc; fi +eval $catkin_ws_source