/terrain-navigation

Implementation for safe low altitude navigation in steep terrain for fixed-wing Aerial Vehicles

Primary LanguageC++BSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

terrain-navigation

Build Test

This package includes an implementation of the RA-L submission of "Safe Low-Altitude Navigation in Steep Terrain with Fixed-Wing Aerial Vehicles". The implementation includes a global planner based on a RRT* in the Dubins Airplane space enabling low altitude navigation for fixed wing vehicles in steep terrain.

ROS 2 support of the package can be found in the ros2 branch. The implementation supports ROS 2 Humble.

overview

Paper and Video

If you find this package useful in an academic context, please consider citing the paper

  • Lim, Jaeyoung, Florian Achermann, Rik Girod, Nicholas Lawrance, and Roland Siegwart. "Safe Low-Altitude Navigation in Steep Terrain with Fixed-Wing Aerial Vehicles." arXiv preprint arXiv:2401.04831 (2024). [paper] [video]
@article{lim2024safe,
  title={Safe Low-Altitude Navigation in Steep Terrain with Fixed-Wing Aerial Vehicles},
  author={Lim, Jaeyoung and Achermann, Florian and Girod, Rik and Lawrance, Nicholas and Siegwart, Roland},
  journal={IEEE Robotics and Automation Letters},
  year={2024},
  publisher={IEEE}
}

Setup

Setting up the Build Environment using Docker

If your operating system doesn't support ROS 1 noetic, docker is a great alternative.

First, create the image, with the build context at the root of this repo

docker build --file docker/Dockerfile --tag terrain-navigation-ros1 .

You can see the image exists:

docker images
>>> REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
>>> terrain-navigation-ros1   latest    5565f845ab4f   2 weeks ago    774MB

Next, run the image, mounting in the source into a workspace. All the dependencies are now installed.

docker run --network=host -it -v $(pwd):/root/catkin_ws/src/terrain-navigation -w /root/catkin_ws terrain-navigation-ros1 bash

Running the Build

Configure the catkin workspace

catkin config --extend "/opt/ros/noetic"
catkin config --merge-devel

For dependencies that do not have binaries available, pull them in using rosinstall.

wstool init src src/terrain-navigation/dependencies.rosinstall
wstool update -t src -j4

For dependencies available through binaries, use rosdep. This package depends on GDAL to read georeferenced images and GeoTIFF files.

apt update
rosdep update
source /opt/ros/noetic/setup.bash
rosdep install --from-paths src --ignore-src -y

Build the package

catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release -DCATKIN_ENABLE_TESTING=False
catkin build -j$(nproc) -l$(nproc) terrain_navigation_ros

Running an example of the planner

In order to run the examples, build the terrain_planner_benchmark package.

catkin build terrain_planner_benchmark

Run a simple planning example:

roslaunch terrain_planner_benchmark test_ompl_rrt_circle.launch 

example

Running with PX4 SITL(Software-In-The-Loop)

To setup PX4, clone the ETHZ ASL PX4 autopilot project The setup instructions can be found in the documentation for the latest dependencies.

For Ubuntu 20.04+ROS noetic with Gazebo classic:

git clone https://github.com/ethz-asl/ethzasl_fw_px4.git --branch pr-hinwil-testing --recursive
cd ..
cd ethzasl_fw_px4
bash ./Tools/setup/ubuntu.sh

make px4_sitl gazebo

Do source the relevant environment variables before launching terrain navigation. For instance, for Ubuntu 20.04 + ROS Noetic + Gazebo classic:

px4_dir=~/ethzasl_fw_px4
source $px4_dir/Tools/simulation/gazebo/setup_gazebo.bash $px4_dir $px4_dir/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$px4_dir
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$px4_dir/Tools/simulation/gazebo/sitl_gazebo
export GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins

Note: The path for gazebo may vary for a different version of Gazebo, update GAZEBO_PLUGIN_PATH as well as ROS_PACKAGE_PATH accordingly.

The default launch file can be run as the following command.

roslaunch terrain_navigation_ros test_terrain_planner.launch

You can use QGroundcontrol to configure and fly the vehicle. Get the vehicle flying, and plan a mission to fly!

Once the vehicle is flying in a loiter, plan a mission, engage the planner and fly through the rviz UI (Video: https://youtu.be/EJWyGSqaKb4)