Giter Club home page Giter Club logo

ros2_px4_offboard_example's Introduction

ROS2_PX4_Offboard_Example

Overview

This tutorial explains at a basic level how to use ROS2 and PX4 in order to control a simulated UAV's velocity with keyboard controls. The goal is to create a simple example that a complete beginner can follow and understand, even with no ROS2 or PX4 experience.

This repo is a derivative of Jaeyoung Lim's Offboard example https://github.com/Jaeyoung-Lim/px4-offboard

I've taken his example and added some functionality.

YouTube Tutorial

We published a walkthrough tutorial on YouTube to demonstrate the example and to help beginners set up their enviornment. The video is helpful, but be sure to always defer to this Readme file for instructions. Some changes have been made since the video was posted, meaning that though it is helpful, it is not 100% accurate.

You can watch the video here.

Prerequisites

  • ROS2 Humble
  • PX4 Autopilot
  • Micro XRCE-DDS Agent
  • px4_msgs
  • Ubuntu 22.04
  • Python 3.10

Setup Steps

Install PX4 Autopilot

To Install PX4 run this code

git clone https://github.com/PX4/PX4-Autopilot.git --recursive -b release/1.14

Run this script in a bash shell to install everything

bash ./PX4-Autopilot/Tools/setup/ubuntu.sh

You will now need to restart your computer before continuing.

Install ROS2 Humble

To install ROS2 Humble follow the steps here

Install Dependencies

Install Python dependencies as mentioned in the PX4 Docs with this code

pip3 install --user -U empy pyros-genmsg setuptools

I also found that without these packages installed Gazebo has issues loading

pip3 install kconfiglib
pip install --user jsonschema
pip install --user jinja2

Build Micro DDS

As mentioned in the PX4 Docs run this code in order to build MicroDDS on your machine

git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/

Setup Workspace

This git repo is intended to be a ROS2 package that is cloned into a ROS2 workspace.

We're going to create a workspace in our home directory, and then clone in this repo and also the px4_msgs repo.

For more information on creating workspaces, see here

Run this code to create a workspace in your home directory

mkdir -p ~/ros2_px4_offboard_example_ws/src
cd ~/ros2_px4_offboard_example_ws/src

ros2_px4_offboard_example_ws is just a name I chose for the workspace. You can name it whatever you want. But after we run colcon build you might have issues changing your workspace name so choose wisely.

We are now in the src directory of our workspace. This is where ROS2 packages go, and is where we will clone in our two repos.

Clone in Packages

We first will need the px4_msgs package. Our ROS2 nodes will rely on the message definitions in this package in order to communicate with PX4. Read here for more information.

Be sure you're in the src directory of your workspace and then run this code to clone in the px4_msgs repo

git clone https://github.com/PX4/px4_msgs.git -b release/1.14

Once again be sure you are still in the src directory of your workspace. Run this code to clone in our example package

git clone https://github.com/ARK-Electronics/ROS2_PX4_Offboard_Example.git

Run this code to clone the repo

Building the Workspace

The two packages in this workspace are px4_msgs and px4_offboard. px4_offboard is a ROS2 package that contains the code for the offboard control node that we will implement. It lives inside the ROS2_PX4_Offboard_Example directory.

Before we build these two packages, we need to source our ROS2 installation. Run this code to do that

source /opt/ros/humble/setup.bash

This will need to be run in every terminal that wants to run ROS2 commands. An easy way to get around this, is to add this command to your .bashrc file. This will run this command every time you open a new terminal window.

To build these two packages, you must be in workspace directory not in src, run this code to change directory from src to one step back i.e. root of your workspace and build the packages

cd ..
colcon build

As mentioned in Jaeyoung Lim's example you will get some warnings about setup.py but as long as there are no errors, you should be good to go.

After this runs, we should never need to build px4_msgs again. However, we will need to build px4_offboard every time we make changes to the code. To do this, and save time, we can run

colcon build --packages-select px4_offboard

If you tried to run our code now, it would not work. This is because we need to source our current workspace. This is always done after a build. To do this, be sure you are in the src directory, and then run this code

source install/setup.bash

We will run this every time we build. It will also need to be run in every terminal that we want to run ROS2 commands in.

Running the Code

This example has been designed to run from one launch file that will start all the necessary nodes. The launch file will run a python script that uses gnome terminal to open a new terminal window for MicroDDS and Gazebo.

Run this code to start the example

ros2 launch px4_offboard offboard_velocity_control.launch.py

This will run numerous things. In no particular order, it will run:

  • processes.py in a new window
    • MicroDDS in a new terminal window
    • Gazebo will open in a second tab in the same terminal window
      • Gazebo GUI will open in it's own window
  • control.py in a new window
    • Sends ROS2 Teleop commands to the /offboard_velocity_cmd topic based on keyboard input
  • RVIZ will open in a new window
  • velocity_control.py runs as it's own node, and is the main node of this example

Once everything is running, you should be able to focus into the control.py terminal window, arm, and takeoff. The controls mimic Mode 2 RC Transmitter controls with WASD being the left joystick and the arrow keys being the right joystick. The controls are as follows:

  • W: Up
  • S: Down
  • A: Yaw Left
  • D: Yaw Right
  • Up Arrow: Pitch Forward
  • Down Arrow: Pitch Backward
  • Left Arrow: Roll Left
  • Right Arrow: Roll Right
  • Space: Arm/Disarm

Pressing Space will arm the drone. Wait a moment and it will takeoff and switch into offboard mode. You can now control it using the above keys. If you land the drone, it will disarm and to takeoff again you will need to toggle the arm switch off and back on with the space bar.

Using the controls, click W to send a vertical veloctiy command and take off. Once in the air you can control it as you see fit.

Closing Simulation IMPORTANT

When closing the simulation, it is very tempting to just close the terminal windows. However, this will leave Gazebo running in the background, potentially causing issues when you run Gazebo in the future. To correctly end the Gazebo simulation, go to it's terminal window and click Ctrl+C. This will close Gazebo and all of it's child processes. Then, you can close the other terminal windows.

Explanation of processes.py

This code runs each set of bash commands in a new tab of a gnome terminal window. It assumes that your PX4 installation is accessible from your root directory, and it is using the gz_x500 simulation. There is no current implementation to change these commands when running the launch file, however you can modify the command string within processes.py to change these values to what you need.

If line 17 of processes.py were uncommented

17     # "cd ~/QGroundControl && ./QGroundControl.AppImage"

then QGroundControl would run in a new tab of the terminal window and the QGroundControl GUI would then open up. This is commented out by default because it is not necessary for the simulation to run, but it is useful for debugging, and is a simple example showing how to add another command to the launch file.

Questions

Join the ARK Electronics Discord here for more help and to stay up to date on our projects.

ros2_px4_offboard_example's People

Contributors

bradenwagstaff avatar nikhilsnayak avatar alexklimaj avatar dakejahl avatar

Stargazers

Thomas Brune avatar Zhipeng Shen avatar  avatar Andrea Giusti avatar  avatar Francesco Sonnessa avatar ℤ𝕆𝔽 ☭  avatar Raj Anadkat avatar  avatar Marcello avatar  avatar Victor Chen avatar Anton Pisarenko avatar  avatar  avatar  avatar  avatar Dan Frakes avatar  avatar Marcello Vangi avatar  avatar  avatar Brian  avatar sharath nair avatar Jakub Zając avatar Hyemin Song avatar  avatar Andy Pillay avatar Frank Loewenich avatar Gerardo Martino avatar  avatar Antoine Kassi avatar Guglielmo Palaferri avatar AngTsusiong avatar Abdulrahman S. Al-Batati avatar  avatar Santiago avatar Junwoo Hwang avatar  avatar Dennis Baldwin avatar  avatar  avatar  avatar  avatar  avatar Vasily avatar  avatar AdrianCo avatar Jean Paul avatar Prabhav Gupta avatar KamalanathanN avatar VIJAYA PRAKASH MURUGAN avatar Riguene Hani avatar Sudharshan  avatar BhavikJ12 avatar Luis Carlos Meron Jaen  avatar Omer Faruk Edemen avatar Zahid avatar Kalash Jain avatar  avatar Claud10 avatar Matheus Rodrigues avatar Awais Ali avatar  avatar Aravind Sairam avatar Iftach Naftaly avatar Andrew Brahim avatar  avatar  avatar Muhammmad kazim avatar Tomato1107 avatar ShiauweiZhao avatar Martin Albertsen Brandt avatar

Watchers

Daniel Agar avatar  avatar Frank Loewenich avatar  avatar  avatar  avatar

ros2_px4_offboard_example's Issues

Rover control in gazebo classic

Hi, first of all - thanks a lot for your astonishing work!
I have a question - what should I change to be able to control a rover?

Process has died error

Tried running the launch file but the logging terminal shows the process has died error:

[INFO] [launch]: All log files can be found below /home/USERNAME/.ros/log/2023-09-04-19-45-35-649660-USERNAME-22502
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [visualizer-1]: process started with pid [22503]
[INFO] [gnome-terminal-2]: process started with pid [22505]
[INFO] [gnome-terminal-3]: process started with pid [22507]
[INFO] [velocity_control-4]: process started with pid [22509]
[INFO] [rviz2-5]: process started with pid [22511]
[INFO] [gnome-terminal-2]: process has finished cleanly [pid 22505]
[rviz2-5] Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
[INFO] [gnome-terminal-3]: process has finished cleanly [pid 22507]
[visualizer-1] /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/qos.py:307: UserWarning: ReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT is deprecated. Use ReliabilityPolicy.BEST_EFFORT instead.
[visualizer-1]   warnings.warn(
[visualizer-1] /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/qos.py:307: UserWarning: HistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST is deprecated. Use HistoryPolicy.KEEP_LAST instead.
[visualizer-1]   warnings.warn(
[velocity_control-4] /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/qos.py:307: UserWarning: ReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT is deprecated. Use ReliabilityPolicy.BEST_EFFORT instead.
[velocity_control-4]   warnings.warn(
[velocity_control-4] /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/qos.py:307: UserWarning: DurabilityPolicy.RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL is deprecated. Use DurabilityPolicy.TRANSIENT_LOCAL instead.
[velocity_control-4]   warnings.warn(
[velocity_control-4] /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/qos.py:307: UserWarning: HistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST is deprecated. Use HistoryPolicy.KEEP_LAST instead.
[velocity_control-4]   warnings.warn(
[velocity_control-4] Traceback (most recent call last):
[velocity_control-4]   File "/home/USERNAME/px4_ros2_ws/install/px4_offboard/lib/px4_offboard/velocity_control", line 33, in <module>
[velocity_control-4]     sys.exit(load_entry_point('px4-offboard==0.0.0', 'console_scripts', 'velocity_control')())
[velocity_control-4]   File "/home/USERNAME/px4_ros2_ws/install/px4_offboard/lib/python3.10/site-packages/px4_offboard/velocity_control.py", line 309, in main
[velocity_control-4]     offboard_control = OffboardControl()
[velocity_control-4]   File "/home/USERNAME/px4_ros2_ws/install/px4_offboard/lib/python3.10/site-packages/px4_offboard/velocity_control.py", line 110, in __init__
[velocity_control-4]     self.arm_state = VehicleStatus.ARMING_STATE_MAX
[velocity_control-4] AttributeError: type object 'VehicleStatus' has no attribute 'ARMING_STATE_MAX'. Did you mean: 'ARMING_STATE_ARMED'?
[rviz2-5] [INFO] [1693836936.665989450] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-5] [INFO] [1693836936.666187427] [rviz2]: OpenGl version: 4.5 (GLSL 4.5)
[ERROR] [velocity_control-4]: process has died [pid 22509, exit code 1, cmd '/home/USERNAME/px4_ros2_ws/install/px4_offboard/lib/px4_offboard/velocity_control --ros-args -r __node:=velocity -r __ns:=/px4_offboard'].
[rviz2-5] [INFO] [1693836936.765787542] [rviz2]: Stereo is NOT SUPPORTED

The simulation is running, every node is running but the simulation is not entering offboard mode (hovering) when armed (pressing the space key).

I'm using Ubuntu 22.04, Python 3.10.12, ROS2 Humble and all the other default supported dependencies and environment.

multi vehicle error

Thank you for your offboard control example.
I tried your example in ROS2 humble & gazebo garden environment.
And I want to use your example for multi drones with instances like picture below.

Screenshot from 2024-01-18 23-29-26
It successfully spawn the drone and the codes.
And I changes the topic names with uav instances below.

Screenshot from 2024-01-18 23-23-19

Screenshot from 2024-01-18 23-22-36

But I tried to arm and control the velocity of the drone, but it doesn't move and arm.
Screenshot from 2024-01-18 23-26-19

So I checked rqt_graph, but node publisher and subscriber is connected like below.

Screenshot from 2024-01-18 23-34-24
So could you help how can i fix it?

Attribute Error VehicleStatus.ARMING_STATE_MAX

Hello,

I'm having an issue running this. I get to the ros2 launch px4_offboard offboard_velocity_control.launch.py command, and everything launches, but the teleop window seems to be disconnected from the simulation. I see in the main terminal this error:

[velocity_control-4] AttributeError: type object 'VehicleStatus' has no attribute 'ARMING_STATE_MAX'. Did you mean: 'ARMING_STATE_ARMED'?

I checked the file ~/ros2_px4_offboard_example_ws/src/px4_msgs/msg/VehivleStatus.msg, and indeed there is nothing named ARMING_STATE_MAX defined in it. What do you think the fix is for this?

Gazebo Sim Blank Screen

My program launches perfectly fine, and the colcon build is successful. However, when Gazebo Sim launches, I get a blank screen. When I scroll I can see a silhouette of the drone appear, however, when resting the Sim is simply a blank.

RViz works perfectly, and I can see the drone fly arround using the key-controls, but again, Gazebo Sim does not seem to be working appropriately.

Has anyone come across this issue or have any suggestions?

Also, does anyone know if this simulation would work in Gazebo11 or Gazebo9 instead of Gazebo Sim?

image

Publish PX4 uorb messages to standard ROS2 topics

We want to take PX4 uorb topics coming in on DDS and publish them to standard ROS2 topics. Here is a non exhaustive list of some of the corresponding messages.

@dagar

https://github.com/ros2/common_interfaces/tree/humble
https://github.com/PX4/PX4-Autopilot/tree/main/msg

DebugArray.msg -> DiagnosticArray.msg
DebugValue.msg -> DiagnosticStatus.msg

VehicleAcceleration.msg -> Accel.msg

BatteryStatus.msg -> BatteryState.msg
VehicleImu.msg -> Imu.msg
VehicleMagnetometer.msg -> MagneticField.msg
vehicle_gps_position(SensorGps.msg) -> NavSatFix.msg
vehicle_gps_position(SensorGps.msg) -> NavSatStatus.msg ?
vehicle_gps_position(SensorGps.msg) -> TimeReference.msg ?
DistanceSensor.msg -> Range.msg
SensorHygrometer.msg -> RelativeHumidity.msg ?
VehicleAirData.msg -> Temperature.msg

colcon build command executed in wrong directory

According to the official docs of ROS2, the colcon build command must be run in the root directory of the workspace not src in this case colcon build must be run in ~/ros2_px4_offboard_example_ws/ directory not ~/ros2_px4_offboard_example_ws/src

Using a custom Gazebo world

How do I add my own world file? I'm relatively new to ROS2 - Gazebo, and looking over the code it's not immediately obvious to me.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.