Installing ROS docker with GPU support, for controlling DJI's Tello drone.

Hey, its been a while.

That probably because I'm knees deep in Technion's Autonomous & Perception course,

of the Aerodynamics & Space faculty.

As for the final project, we ought to implement (and improve):

Sampling-based robotic information gathering algorithm,

By Geoffrey A. Hollingerand Gaurav S. Sukhatme.

We aim to demonstrate our work in a real life example, where a drone (my beloved Tello drone) will use GIL algorithms for planning and executing an optimal trajectory between two points, while avoiding obstacles.

In this post I'll focus on the platform well use for developing and testing our project.

Installations

Using ros docker tutorial, We can create a ros docker with Hardware Acceleration.

  • We create a Dockerfile, with NVIDIA support, and all dependencies for TelloPy:
FROM osrf/ros:melodic-desktop-full

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \  
    ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES \  
    ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
# Set the working directory
# WORKDIR /usr/src/app

# Install any needed packages specified in requirements.txt
RUN apt-get update  
RUN apt-get install -y pkg-config  
RUN apt install -y python3-dev  
RUN apt-get install -y python3-pip

# AV library dependencies
RUN apt-get install -y libavformat-dev libavdevice-dev  
RUN apt-get install -y libsm6 libxext6 libxrender-dev

# Tello library dependencies
RUN pip3 install av==6.1.2

# OpenCV
RUN pip3 install opencv-python  
  • Then we build
docker build -t ros_tello .  
  • Now we create a script to run the image called run_my_image.bash:
# Exposing Tellos ports.
XAUTH=/tmp/.docker.xauth  
if [ ! -f $XAUTH ]  
then  
    xauth_list=$(xauth nlist :0 | sed -e 's/^..../ffff/')
    if [ ! -z "$xauth_list" ]
    then
        echo $xauth_list | xauth -f $XAUTH nmerge -
    else
        touch $XAUTH
    fi
    chmod a+r $XAUTH
fi


xhost + && docker run -it \  
    --privileged \ # Needed to access display, otherwise
    --network host \
    --env="DISPLAY=$DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    -env="XAUTHORITY=$XAUTH" \
    --volume="$XAUTH:$XAUTH" \
    --runtime=nvidia \
    --name tello_ros \
    ros_tello \
    bash
  • Make the script executable
$ chmod a+x run_my_image.bash
  • Execute the script
$ ./run_my_image.bash
  • Flags explanations:

    • --privleged: Otherwise
    • --network host: Will be using ports to communicate with the Tello. So well expose all host's ports.
    • --env="DISPLAY=$DISPLAY": Point to which display to to show context.
    • --env="QT_X11_NO_MITSHM=1": IDK
    • --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw": Point to the X11 server, unix graphics server.
    • -env="XAUTHORITY=$XAUTH": Point to config that gives authority for controlling graphics.
    • --volume="$XAUTH:$XAUTH": Point to the volume of that config.
    • --runtime=nvidia: Run with external GPU's capabilities.
    • --name tello_ros: Name of the new container.
    • ros_tello: Name of the Image, that will creates our container.
    • bash: Start command.
  • Test if everything work fine (within the container):

roscore > /dev/null & rosrun rviz rviz  

RVIZ should open, with ros in the background.

Installing tello-driver

Assuming we're out of the container

  • Start container
docker container start tello_ros  
  • Attach container
docker container attach tello_ros  
  • Make a catkin_ws:
mkdir -p /home/catkin_ws/src  
cd /home/catkin_ws && catkin_make # Create workspace for the first time.  
  • Download the tello-driver
cd ./src  
git clone --recursive https://github.com/appie-17/tello_driver.git  
  • Making the package
cd .. # Go back to /catkin_ws  
rosdep install --from-paths src --ignore-src -r -y  # Install package dependencies.  
catkin_make  

That will build the project.

Now we run tello-driver:

source ./devel/setup.bash

#### Before, we make sure we're connected to Tello's wifi.
roslaunch tello_driver tello_node.launch  

Testing connection

In another terminal:

docker exec -it tello_ros bash  
cd home/catkin_ws/  
source devel/setup.bash  
rviz  

Results:

We have ROS docker. with Tello driver. And GPU capabilities.

New we can start our project :)

Here's some raw High Level overview of our project:

Installing Pycharm inside Docker

Epilogue.

It took me tonne of work just to make the ros-tello-driver to run within ROS container, when that being said, developing with python against a container, is somewhat a painful process. Pycharm isn't using python interpreter within a docker. It is possible to get it to work, but I had enough, thus installed ROS2 on my laptop, and started from scratch. Ditching the docker part.

Till next time.

Gal