clydemcqueen / tello_ros Goto Github PK
View Code? Open in Web Editor NEWC++ ROS2 driver for DJI Tello drones
License: BSD 3-Clause "New" or "Revised" License
C++ ROS2 driver for DJI Tello drones
License: BSD 3-Clause "New" or "Revised" License
Greeting, I have been following ur codes for awhile. may I know are there any methods to rename the video streaming window application? I am currently running multiple drones and would to rename from "frame" to either "drone1" or 2. Thank you.
ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'battery?'}"
Measure the effect of various rc commands, and improve the translation of cmd_vel
to rc a b c d
.
I was using the driver to control DJI Tello on Ubuntu 20.04 using ROS 2 Foxy, but now I'm using Ubuntu 22.04 and ROS 2 Humble, so I would like to know if tello_ros can be used to control the drone on Humble?
ros2dashing+gazebo9
Likely solution: subscribe to cmd_vel, and convert to 'rc a b c d'.
if I make the drone yaw I can see that the streaming on rviz stops once there are no markers visible in the frame. I tested adding more markers, and indeed if I place enough of them around the drone, the streaming continues.
Is there a reason for this?
Reproducible with:
ros2 launch tello_gazebo vlam_launch.py
And another terminal running the command :
ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'takeoff'}" ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'rc 0 0 0 0.5'}"
Foxy changes how parameters work. This is addressed in #53
Add this to CMakeLists.txt:
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif ()
And then fix the warnings.
Pull the camera info from a file
Detect ArUco messages and publish poses & corners for use in RCARS.
This breaks the design pattern for a ROS driver, but there are 2 reasons to do this:
When sending rc commands to the drone inside simulation it follows the format: forward/back, left/right, up/down, yaw.
This conflicts with the actual rc command which is left/right, forward/back, up/down, yaw (which is what is described in the documentation).
Provide URDF and SDF files
Convert TelloDriver to a ROS2 component. Set use_intra_process_comms = true.
Running this package in a docker container
Built the dockerfile and ran the container using
docker run -td --privileged --net=host --ipc=host
--name="tello12"
--gpus=all
-e "DISPLAY=$DISPLAY"
-e "QT_X11_NO_MITSHM=1"
-v "/tmp/.X11-unix:/tmp/.X11-unix:rw"
-e "XAUTHORITY=$XAUTH"
-e ROS_IP=127.0.0.1
-e NVIDIA_DRIVER_CAPABILITIES=all
--cap-add=SYS_PTRACE
tello1 bash
However, running the container normally (docker run -it tello1 bash) also produces the same result,
[gazebo-1] [Msg] Waiting for master.
[gazebo-1] [Msg] Connected to gazebo master @ http://127.0.0.1:11345
[gazebo-1] [Msg] Publicized address: 172.17.0.2
[gazebo-1] [Wrn] [GuiIface.cc:298] Couldn't locate specified .ini. Creating file at "/root/.gazebo/gui.ini"
[gazebo-1] [Err] [RenderEngine.cc:749] Can't open display:
[gazebo-1] [Wrn] [RenderEngine.cc:89] Unable to create X window. Rendering will be disabled
[gazebo-1] [Wrn] [RenderEngine.cc:292] Cannot initialize render engine since render path type is NONE. Ignore this warning ifrendering has been turned off on purpose.
[gazebo-1] [Wrn] [GuiIface.cc:120] could not connect to display
[gazebo-1] [Msg] Could not load the Qt platform plugin "xcb" in "" even though it was found.
[gazebo-1] [Err] [GuiIface.cc:124] This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
[gazebo-1]
[gazebo-1] Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
ROS2 Eloquent is expected 11/22, betas are out now. Create a dashing branch, then port to master to Eloquent.
Similar to teleop_twist_joy, but should work with 4 axes, as well as land
and takeoff
actions.
Hello, I am still in Tello and ROS 2. I want to buy 2 tellos and build swarm controller. Before I buy it, I have a question, how to install ROS 2 in tello and use this repo as a driver? Will I buy Raspberry Phi and attach it on tello? Thank you
Hi, I am trying to colcon build using Ubuntu 22.04 and ROS2 Humble. I got error for the /tello_description/src/replace.py: Permission denied.
I have tried adding sudo to the colcon build but still the same
On the 'dashing' branch, and possibly 'master' (Eloquent).
Hello,
Thank you for your open-source plugin, which was quite useful to simulate and control Tello through ROS2.
I want to acknowledge your work by citing you in my scientific article. Do you have any reference that I can cite?
Have a good day
Hello sir, I'm having this error when i compile with colcon build, i can't solve the problem. Should I have to modify my cmake ?
cmake in Tello_gazebo:
cmake_minimum_required(VERSION 3.5)
project(tello_gazebo)
#=============
#=============
if (NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif ()
if (NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif ()
if ($ENV{CLION_IDE})
message("Running inside CLion")
set(tello_msgs_DIR "${PROJECT_SOURCE_DIR}/../../../install/tello_msgs/share/tello_msgs/cmake")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRUN_INSIDE_CLION")
endif ()
find_package(ament_cmake REQUIRED)
find_package(gazebo REQUIRED) # Note uppercase variables in /usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake
find_package(gazebo_dev REQUIRED)
find_package(gazebo_ros REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(tello_msgs REQUIRED)
include_directories(
include
${gazebo_ros_INCLUDE_DIRS}
${geometry_msgs_INCLUDE_DIRS}
${std_msgs_INCLUDE_DIRS}
${tello_msgs_INCLUDE_DIRS}
)
#=============
#=============
add_library(
TelloPlugin SHARED
src/tello_plugin.cpp
)
ament_target_dependencies(
TelloPlugin
gazebo_dev
gazebo_ros
geometry_msgs
rclcpp
std_msgs
tello_msgs
)
#=============
#=============
install(
TARGETS TelloPlugin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
install(
DIRECTORY models worlds launch
DESTINATION share/${PROJECT_NAME}
)
install(
PROGRAMS src/inject_entity.py
DESTINATION lib/${PROJECT_NAME}
)
#=============
#=============
ament_package()
The camera topic does not display any information in rviz2
Thank you so much for this great project!
I just wanted to thank you and share a project that I made this weekend: tello_ros_docker. It creates a docker image to run tello_ros. Right now, it's not completely setup to work with a real Tello drone (I don't have one yet, but should be getting one this week). So, for the moment, it defaults to running the tello_gazebo simple_launch.
Anyhow, it should be a useful development environment for others or even just a quick way to get tello_ros running. If you're interested in taking a look, I'd welcome any feedback.
Right now frame_id is hardcoded:
header.frame_id = "camera_frame"
It probably makes sense to pass TelloDriverContext into the sockets, since we may want to add more parameters later.
I'm having issues running the teleop code in a Docker container. I tried running it on the tiryoh foxy image https://github.com/Tiryoh/docker-ros2-desktop-vnc and it didn't connect.
Respond to the cmd_vel message, and see how the drone flies w/ the published SDK 1.3 interface.
SDK v2.0 was released, with new commands.
Dashing has just released: https://discourse.ros.org/t/ros-2-dashing-diademata-released/9365
ros2_shared is missing from install instructions (README.md).
As of Dashing, gazebo_ros_packages publishes camera_info as "best effort," which is probably a good idea. Also change this in tello_driver.
It should be possible to build a ROS image msg directly from the output of libav.
Hi, thank you very much for sharing such a great project ~
It is very amazing ~
So far I tried tello_gazebo and it works very well ~
However, when I tried the integration of fiducial_vlam, it showed the following error:
user@ubuntu:~/tello_ros_ws$ ros2 launch tello_gazebo vlam_launch.py
[INFO] [launch]: All log files can be found below /home/user/.ros/log/2020-11-01-01-37-50-957820-ubuntu-9691
[INFO] [launch]: Default logging verbosity is set to INFO
[ERROR] [launch]: Caught exception in launch (see debug for traceback): executable 'vmap_node' not found on the libexec directory '/home/user/tello_ros_ws/install/fiducial_vlam/lib/fiducial_vlam'
Task exception was never retrieved
future: <Task finished coro=<LaunchService._process_one_event() done, defined at /opt/ros/eloquent/lib/python3.6/site-packages/launch/launch_service.py:293> exception=RuntimeError('Signal event received before subprocess transport available.',)>
Traceback (most recent call last):
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/launch_service.py", line 295, in _process_one_event
await self.__process_event(next_event)
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/launch_service.py", line 315, in __process_event
visit_all_entities_and_collect_futures(entity, self.__context))
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/utilities/visit_all_entities_and_collect_futures_impl.py", line 38, in visit_all_entities_and_collect_futures
sub_entities = entity.visit(context)
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/action.py", line 108, in visit
return self.execute(context)
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/actions/opaque_function.py", line 75, in execute
return self.__function(context, *self.__args, **self.__kwargs)
File "/opt/ros/eloquent/lib/python3.6/site-packages/launch/actions/execute_process.py", line 383, in __on_signal_process_event
raise RuntimeError('Signal event received before subprocess transport available.')
RuntimeError: Signal event received before subprocess transport available.
[INFO] [gazebo-1]: process started with pid [9707]
[gazebo-1] [Msg] Waiting for master.
[gazebo-1] [Msg] Connected to gazebo master @ http://127.0.0.1:11345
[gazebo-1] [Msg] Publicized address: 192.168.142.135
[gazebo-1] Gazebo multi-robot simulator, version 9.14.0
[gazebo-1] Copyright (C) 2012 Open Source Robotics Foundation.
[gazebo-1] Released under the Apache 2 License.
[gazebo-1] http://gazebosim.org
[gazebo-1]
[gazebo-1] Gazebo multi-robot simulator, version 9.14.0
[gazebo-1] Copyright (C) 2012 Open Source Robotics Foundation.
[gazebo-1] Released under the Apache 2 License.
[gazebo-1] http://gazebosim.org
[gazebo-1]
[gazebo-1] [Wrn] [ModelDatabase.cc:340] Getting models from[http://models.gazebosim.org/]. This may take a few seconds.
[ERROR] [gazebo-1]: process[gazebo-1] failed to terminate '5' seconds after receiving 'SIGINT', escalating to 'SIGTERM'
[INFO] [gazebo-1]: sending signal 'SIGTERM' to process[gazebo-1]
[ERROR] [gazebo-1]: process has died [pid 9707, exit code -15, cmd 'gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so /home/user/tello_ros_ws/install/tello_gazebo/share/tello_gazebo/worlds/fiducial.world'].
[gazebo-1]
[gazebo-1]
user@ubuntu:~/tello_ros_ws$
Can I know what should I do in order to solve this ?
Thank you very much ..
Appreciate a lot ~
Running with ROS2Eloquent and Gazebo 9
Errors:
I got this line : "Unable to parse model.config for model : bin_4_dropping_task" together will other errors to import models from the online database
Hi @clydemcqueen,
Tello IMU data aren't standard raw IMU measurments. Is it possible to do VIO just using monocular video + Tello IMU messages?
Regards,
I am running ros2 Dashing and I get this error whenever I try to simulate the drone in gazebo. I am able to control the actual tello drone through teleop, this problem arises only when i run the gazebo simulation. I followed every step in the readme file but there is always the possibility I might have missed something
alessandro@alessandro-K501UX:~/projects/ros_tello$ ros2 launch tello_gazebo simple_launch.py
[INFO] [launch]: All log files can be found below /home/alessandro/.ros/log/2019-12-09-18-44-13-280853-alessandro-K501UX-10266
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [gazebo-1]: process started with pid [10276]
[INFO] [inject_entity.py-2]: process started with pid [10277]
[ERROR] [inject_entity.py-2]: process has died [pid 10277, exit code 1, cmd '/home/alessandro/projects/ros_tello/install/tello_gazebo/lib/tello_gazebo/inject_entity.py /home/alessandro/projects/ros_tello/install/tello_description/share/tello_description/urdf/tello_1.urdf 0 0 1 0'].
[INFO] [robot_state_publisher-3]: process started with pid [10278]
[INFO] [joy_node-4]: process started with pid [10279]
[INFO] [tello_joy-5]: process started with pid [10280]
[ERROR] [launch]: Caught exception in launch (see debug for traceback): I/O operation on closed file
[INFO] [tello_joy-5]: sending signal 'SIGINT' to process[tello_joy-5]
[INFO] [joy_node-4]: sending signal 'SIGINT' to process[joy_node-4]
[INFO] [robot_state_publisher-3]: sending signal 'SIGINT' to process[robot_state_publisher-3]
[INFO] [gazebo-1]: sending signal 'SIGINT' to process[gazebo-1]
[robot_state_publisher-3] Initialize urdf model from file: /home/alessandro/projects/ros_tello/install/tello_description/share/tello_description/urdf/tello_1.urdf
[robot_state_publisher-3] Parsing robot urdf xml string.
[robot_state_publisher-3] The root link base_link_1 has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF.
[robot_state_publisher-3] Link camera_link_1 had 0 children
[robot_state_publisher-3] got segment base_link_1
[robot_state_publisher-3] got segment camera_link_1
[robot_state_publisher-3] Adding fixed segment from base_link_1 to camera_link_1
[gazebo-1] Gazebo multi-robot simulator, version 9.0.0
[gazebo-1] Copyright (C) 2012 Open Source Robotics Foundation.
[gazebo-1] Released under the Apache 2 License.
[gazebo-1] http://gazebosim.org
[gazebo-1]
[gazebo-1] Gazebo multi-robot simulator, version 9.0.0
[gazebo-1] Copyright (C) 2012 Open Source Robotics Foundation.
[gazebo-1] Released under the Apache 2 License.
[gazebo-1] http://gazebosim.org
[gazebo-1]
[tello_joy-5] [INFO] [rclcpp]: signal_handler(signal_value=2)
[INFO] [tello_joy-5]: process has finished cleanly [pid 10280]
[robot_state_publisher-3] [INFO] [rclcpp]: signal_handler(signal_value=2)
[INFO] [robot_state_publisher-3]: process has finished cleanly [pid 10278]
[joy_node-4] terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
[joy_node-4] what(): Failed to create interrupt guard condition in Executor constructor: the given context is not valid, either rcl_init() was not called or rcl_shutdown() was called., at /tmp/binarydeb/ros-dashing-rcl-0.7.7/src/rcl/guard_condition.c:69
[gazebo-1] [Msg] Waiting for master.
[gazebo-1] [Msg] Connected to gazebo master @ http://127.0.0.1:11345
[gazebo-1] [Msg] Publicized address: 192.168.1.37
[ERROR] [joy_node-4]: process has died [pid 10279, exit code -6, cmd '/opt/ros/dashing/lib/joy/joy_node __ns:=/drone1'].
[INFO] [gazebo-1]: process has finished cleanly [pid 10276]
[gazebo-1]
[gazebo-1]
alessandro@alessandro-K501UX:
I will provide any further information if needed
Build instructions for Dashing and Eloquent (README.md, Dockerfile) should be updated.
E.g., in docker/eloquent/Dockerfile
RUN git clone https://github.com/clydemcqueen/tello_ros.git
RUN git clone https://github.com/ptrmu/ros2_shared.git
RUN git clone https://github.com/ptrmu/fiducial_vlam.git
should be
RUN git clone https://github.com/clydemcqueen/tello_ros.git -b eloquent
RUN git clone https://github.com/ptrmu/ros2_shared.git -b eloquent
RUN git clone https://github.com/ptrmu/fiducial_vlam.git -b eloquent
wonderfull work, i buy a tello drone, but i have intalled ros 1 with catkin_make , how i can run the driver on ros1 , please help me
I made this change in 38895d8 but it's flaky, so I reverted it. Figure out why it didn't work.
Hi, I am trying to make a simulation for personal project using the tello model you made. however i can't find a way to get the image sent from the tello in gazebo. Is it possible to get it? (I am just starting of with using ros2...so I am having a hard time)
i faced issue at inject_entity.py (/root/tello_ws/install/tello_gazebo/lib/tello_gazebo/inject_entity.py)
and i can't solve use "pip install" command
ModuleNotFoundError: No module named 'transformations'
and i would like to share the solution for you who try to spawn tello_urdf in gazebo
solution1)
add below method in inject_entity.py
def quaternion_from_euler(roll, pitch, yaw):
"""
Converts euler roll, pitch, yaw to quaternion (w in last place)
quat = [x, y, z, w]
Bellow should be replaced when porting for ROS 2 Python tf_conversions is done.
"""
cy = math.cos(yaw * 0.5)
sy = math.sin(yaw * 0.5)
cp = math.cos(pitch * 0.5)
sp = math.sin(pitch * 0.5)
cr = math.cos(roll * 0.5)
sr = math.sin(roll * 0.5)
q = [0] * 4
q[0] = cy * cp * cr + sy * sp * sr
q[1] = cy * cp * sr - sy * sp * cr
q[2] = sy * cp * sr + cy * sp * cr
q[3] = sy * cp * cr - cy * sp * sr
return q
solution2)
include tranformation.py file in the same path as injcet_entity.py
https://github.com/ros/geometry/blob/noetic-devel/tf/src/tf/transformations.py#L1100
When launching the sample Gazebo sim with ros2 launch tello_gazebo simple_launch.py
and the driver with ros2 launch tello_driver teleop_launch.py
then running ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'takeoff'}"
to arm the drone, the response from the driver is always [tello_driver]: Not connected, dropping 'takeoff'
From the code I can see this is the warning that occurs when the state socket or video socket are not receiving data. When no command is sent, a [tello_driver]: Command timed out
error is printed at regular intervals, which indicates no connection.
Any insight as to what might be wrong?
I am running this in Docker if that is relevant
tello_driver always binds to 0.0.0.0, which will listen to every network interface. There should be an option to bind to a particular IP address, so that users with multiple wifi network cards can control multiple drones.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.