此项目是基于tello_ros项目的二次开发,使用大疆RoboMaster Tello Talent (RMTT)无人机,调用ORB_SLAM3与OctoMap进行建图,并在ROS2-humble环境中进行测试。
tello_ros项目的详细说明请参阅src/tello_ros/README.md.
此项目在Ubuntu22.04,ROS2-humble环境中进行开发,因此需要首先安装ROS2,对于中国大陆的ROS初学者,推荐使用鱼香ROS一键安装工具:
wget http://fishros.com/install -O fishros && . fishros
正式部署之前需要安装相关依赖:
# 安装asio
sudo apt install libasio-dev
# 安装ros附加功能包
sudo apt install ros-$ROS_DISTRO-cv-bridge/
ros-$ROS_DISTRO-camera-calibration-parsers/
ros-$ROS_DISTRO-robot_state_publisher/
ros-$ROS_DISTRO-joint_state_publisher/
# 确保当前Python环境下已经安装以下库
pip3 install catkin_pkg empy==3.3.4 lark numpy # 也可使用conda等工具
# 下载仓库
cd ~/WorkSpace # 自定义一个下载目录
git clone https://github.com/FallThrive/Tello-Talent-ROS2.git tello_ws
编译ros2_shared tello_description tello_driver tello_msgs四个功能包即可实现无人机基本飞行功能。
原项目的tello_gazebo功能包适配的是Gazabo Classic版本,因此未安装Gazabo Classic(例如安装的为Gazebo Harmonic)建议跳过此功能包的编译。
cd ~/WorkSpace/tello_ws # 以自己的项目目录为准
chmod +x src/tello_ros/tello_description/src/replace.py
colcon build --symlink-install --packages-select ros2_shared tello_description tello_driver tello_msgs
当然,如果ubuntu系统支持Gazebo Classic,也可以使用以下命令安装(提示:目前Gazebo Classic已经停止维护):
sudo apt install ros-$ROS_DISTRO-gazebo-ros-pkgs
cd ~/WorkSpace/tello_ws # 以自己的项目目录为准
colcon build --symlink-install --packages-select tello_gazebo
下载Pangolin到自定义目录,Pangolin被拆分为几个组件,安装时可以只包含所需的组件,大多数依赖项都是可选的,详细的说明可以直接参阅官方文档。
# 下载仓库
cd ~/Source # 自定义一个下载目录
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
# 安装依赖项
./scripts/install_prerequisites.sh recommended # 这里只安装了必需的
# 配置与编译(也可使用Ninja提高编译速度)
cmake -B build
cmake --build build
sudo cmake --build build --target install
# 安装Python绑定
cmake --build build -t pypangolin_pip_install
# 添加到LD_LIBRARY_PATH环境变量
echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
首先下载ORB_SLAM3的仓库,详细说明可以查阅官方文档,这里推荐使用开发者zang09修改后的仓库,从C++11支持到了C++14,在ROS2的foxy(zang09测试)和humble环境中通过了测试。
cd ~/Source # 自定义一个安装目录
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 # 原版
git clone https://github.com/zang09/ORB-SLAM3-STEREO-FIXED.git ORB_SLAM3 # 推荐
cd ORB_SLAM3
chmod +x build.sh
./build.sh
# 安装Sophus
cd Thirdparty/Sophus/build
sudo make install
tello_map使用OctoMap将点云数据发布到地图,因此,需要安装OctoMap:
sudo apt install ros-$ROS_DISTRO-octomap*
该命令将会安装以下功能包:
octomap
octomap_mapping
octomap_msgs
octomap_ros
octomap_rviz_plugins
octomap_server
设置FindORB_SLAM3.cmake里第8行ORB_SLAM3_ROOT_DIR为自己的ORB_SLAM3路径。
设置CMakeLists.txt里第5行ENV{PYTHONPATH}为自己的ROS Python功能包路径。
cd ~/WorkSpace/tello_ws # 以自己的项目目录为准
cd tello/extras/tello_slam/vocabulary
tar -xf ORBvoc.txt.tar.gz
colcon build --symlink-install --packages-select tello_slam
项目功能包整体路径如下:
tello_ws/
├── src/
│ ├── ros2_shared/ # ROS2共享工具包
│ ├── tello_ros/ # Tello无人机ROS驱动主包
│ │ ├── tello_description/ # URDF模型描述文件
│ │ ├── tello_driver/ # 无人机驱动节点
│ │ ├── tello_gazebo/ # Gazebo仿真支持
│ │ └── tello_msgs/ # 自定义消息类型
│ └── tello_extras/ # 扩展功能包
│ ├── tello_slam/ # SLAM功能实现包
│ └── tello_yolo/ # YOLO目标跟随(计划中)
├── build/ # 编译输出目录(已忽略)
├── install/ # 安装目录(已忽略)
└── log/ # 日志目录(已忽略)
在tello_driver功能包的tello_key_main节点,可以使用键盘控制无人机,采用美国手布局方式,即左手控制垂直运动与左右转向,右手控制前进后退与左右平移,与手柄控制保持一致:
---------------------------
T: Takeoff, B: Land, Q: Quit
---------------------------
Left Hand Right Hand
W I
A S D J K L
---------------------------
W/S: Up/Down, A/D: Yaw Left/Right
I/K: Forward/Backward, J/L: Left/Right
Hold a button to move, release to stop.
---------------------------
节点每10ms会发布一次/cmd_vel话题,如果键盘没有输入则将所有速度置零,因此需要长按来控制无人机运动。
如果需要修改键盘控制的无人机速度,可以修改tello_key_node.hpp中的LINEAR_SPEED与ANGULAR_SPEED.
在项目目录打开终端,一个终端运行tello_driver_main节点,另一个终端运行tello_key_main节点以进行使用:
# 终端1
. install/setup.bash
ros2 run tello_driver tello_driver_main
# 终端2
. install/setup.bash
ros2 run tello_driver tello_key_main
该功能参考ORB_SLAM3_ROS2项目,部署在tello_extras文件夹下tello_slam功能包,使用ORB_SLAM3进行纯视觉单目相机建图,使用OctoMap建立栅格地图。
tello系列无人机搭载的为单目相机,并且SDK提供的并不是完整IMU数据,因此这里只保留了单目相机mono模式,默认使用ORB词汇表ORBvoc.txt和tello相机配置文件tello_cam.yaml.
mono节点将点云数据发布到~pointcloud话题,消息类型为sensor_msgs/PointCloud2;同时,实现map -> base_link的坐标系映射。
在终端中运行如下命令,即可运行ORB_SLAM3和无人机模型tello.urdf;同时启动手柄控制节点,并使用配置文件slam.rviz加载RViz2:
. install/setup.bash
ros2 launch tello_slam slam_launch.py
以上,将发布的tf坐标变换为:
map -> base_link -> camera_link
获取点云话题~pointcloud后,可以使用OctoMap建立栅格地图,终端运行如下命令,可以在启用ORB_SLAM3的同时,调用配置文件tello_octomap.yaml以启用OctoMap:
. install/setup.bash
ros2 launch tello_slam slam_map_launch.py
# 无需额外再启动slam_launch.py
OctoMap将会发布以下话题:
~octomap_full- 完整概率三维占用地图~octomap_binary- 精简二进制三维占用地图~octomap_point_cloud_centers- 占用体素中心点云~occupied_cells_vis_array- 占用体素可视化方块~free_cells_vis_array- 空闲体素可视化方块~projected_map- 二维投影占用栅格
ros2_shared来自 https://github.com/ptrmu/ros2_sharedtello_ros修改自 https://github.com/clydemcqueen/tello_rostello_slam修改自 https://github.com/zang09/ORB_SLAM3_ROS2
- 编译tello_ros项目,在ROS2-humble中测试基本功能
- 使用键盘控制无人机运动
- 使用ORB_SLAM3发布点云话题
- 使用OctoMap建立栅格地图
- 使用YOLO+PID进行目标检测与跟随
- 使用强化学习进行运动控制