ROS-基于PX4的无人机SLAM建图(Cartographer)仿真

2023-05-16

一、准备工作

1.1、安装Ubuntu和ROS系统

首先在电脑上安装好Ubuntu系统和ROS系统,我安装的是Ubuntu18.04和ROS Melodic,不同的Ubuntu版本对应不同的ROS版本

ROS发布日期ROS版本停止支持日期对应Ubuntu版本
2018年5月23日ROS Melodic Morenia2023年5月Ubuntu 18.04
2016年5月23日ROS Kinetic Kame2021年4月Ubuntu 16.04 (Xenial) Ubuntu 15.10 (Wily)
2015年5月23日ROS Jade Turtle2017年5月Ubuntu 15.04 (Wily) Ubuntu 14.04 LTS (Trusty)
2014年7月22日ROS Indigo Igloo2019年4月Ubuntu 14.04 (Trusty)
2013年9月4日ROS Hydro Medusa2015年5月Ubuntu 12.04 LTS (Precise)
2012年12月31日ROS Groovy Galapagos2014年7月Ubuntu 12.04 (Precise)

Ubuntu18.04安装ROS Melodic(详细,亲测安装完成,有清晰的截图步骤)

1.2、Cartographer功能包安装

1.2.1 安装工具:

sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build

1.2.2 创建并初始胡工作空间:

使用如下命令创建并初始化工作空间(为了不和其他功能包冲突,最好为cartographer专门创建一个工作空间,这里我们新创建了一个工作空间carto_ws)

mkdir -p carto_ws/src
cd carto_ws
wstool init src   #ctrl+H 打开隐藏文件,会在src文件夹下生成.rosinstall文件

1.2.3 更新依赖

进入到carto_ws/src目录下,ctrl+H打开隐藏文件,打开.rosinstall文件,将如下代码复制粘贴进去

- git:
    local-name: cartographer
    uri: https://github.com/cartographer-project/cartographer.git
    version: master
- git:
    local-name: cartographer_ros
    uri: https://github.com/cartographer-project/cartographer_ros.git
    version: master
- git:
    local-name: ceres-solver
    uri: https://github.com/ceres-solver/ceres-solver.git
    version: master

再执行

wstool update -t src

注意:自动下载可能不成功,可以手动从上面的github地址中下载,解压放在carto_ws/src目录下。如果手动下载,可以不需要执行wstool update -t src命令

1.2.4 安装依赖并下载cartographer相关功能包

rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

${ROS_DISTRO}填自己的ROS版本名称,如melodic

1.2.5 编译并安装

catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash

若编译安装没有报错,则cartographer功能包已安装成功。

3、安装功能包及源码下载

成功安装ROS和cartographer功能包后,参考仿真平台基础配置,安装Gazebo,MAVROS,PX4和XTDrone源码,本仿真将部分依赖XTDrone源码实现。

二、Cartographer建图配置

进入carto_ws/src/cartographer_ros/cartographer_ros/launch目录下,创建一个launch文件

cd ~/carto_ws/src/cartographer_ros/cartographer_ros/launch
touch cartographer_demo_rplidar.launch
gedit cartographer_demo_rplidar.launch

cartographer_demo_rplidar.launch文件的具体内容如下:

<launch>
  <!-- 在仿真时设为true,但当需要实际建图时,一定要改为false,否则会报错 -->
  <param name="/use_sim_time" value="true" />

  <!-- 其中的***.lua文件需要改为自己的lua文件 -->
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename rplidar.lua"
      output="screen">
    <!-- remap后面的名称根据实际设置,可以在rostopic list中查找 -->
    <remap from="scan" to="iris_0/scan" />
  </node>

  <!-- 这是实现建图必不可少的部分 -->
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
</launch>

rplidar.lua文件在carto_ws/src/cartographer_ros/cartographer_ros/configuration目录下,具体内容及参数注释如下:

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
-- 地图坐标系,用来发布子地图的ROS坐标系ID,位姿的父坐标系,通常是"map"
  map_frame = "map",
-- 建图时跟踪的坐标系,如果使用了IMU应该是IMU的位置,尽管它可能转动了,"imu_link"或"base_link"
  tracking_frame = "iris_0/laser_2d",
-- 作为发布位置的子坐标系的ROS坐标系ID
-- 对于"odom"例程,如果系统的其他地方提供"odom"坐标系,那么"odom"在map_frame中的位置将会被发布,否则,设置为"base_link"即可
  published_frame = "base_link",
-- "provide_odom_frame"为真时使用,位于"published_frame"和"map_frame"之间,用来发布本地SLAM结果(非闭环),通常是"odom"
  odom_frame = "odom",
-- 如果使能,这个局部的、非闭环的、连续的"odom_frame"在"map_frame"中的位置将被发布
  provide_odom_frame = true,
-- 如果使能,发布的位姿信息将会被限制为2D位姿(无横滚、俯仰和z位置)。
  publish_frame_projected_to_2d = false,
--  use_pose_extrapolator = true,
-- 如果使能,将订阅nav_msgs/Odometry类型的topic "odom",这种情况下,必须提供里程计,而且里程计的信息将被包含在SLAM中
  use_odometry = false,
-- 如果使能,将订阅sensor_msgs/NavSatFix类型的topic "fix",这种情况下,必须提供导航数据,而且导航数据的信息将被包含在SLAM中
  use_nav_sat = false,
-- 如果使能,将订阅cartographer_ros_msgs/LandmarkList类型的topic "landmarks"
  use_landmarks = false,
-- 订阅的laser scan topics的个数
-- 对于单个激光,订阅sensor_msgs/LaserScan类型的"scan" topic(sensor_msgs/LaserScan这个topic将被用于SLAM的输入)
-- 对于多个激光,topics为"scan_1","scan_2"...(如果num_laser_scans大于1,那么多个被编号的scan topics,比如scan1、scan2、scan3...直到并包括num_laser_scans,将被用作SLAM的输入)
  num_laser_scans = 1,
-- 订阅多回波技术laser scan topics的个数
-- 对于单个激光,订阅sensor_msgs/MultiEchoLaserScan类型的"echoes"topic
-- 对于多个激光,topics为"echoes_1", "echoes_2"...
  num_multi_echo_laser_scans = 0,
-- 接收到的(多回波)laser scan中分离出来的点云的个数,分割scan能够保证在激光设备移动的过程中scans不弯曲变形。有相应的轨迹生成器选项可以将分离的scans累积到点云中,用来进行scan matching
  num_subdivisions_per_laser_scan = 1,
-- 订阅的点云topics的个数
-- 对于单个测距仪,订阅sensor_msgs/PointCloud2类型的"points2" topic
-- 对于多个测距仪,topics为"points2_1", "points2_2"...
  num_point_clouds = 0,
-- 使用tf2机型转换搜索的超时时间秒数
  lookup_transform_timeout_sec = 0.2,
-- 发布submap位置的间隔秒数
  submap_publish_period_sec = 0.3,
-- 发布位置的间隔秒数
  pose_publish_period_sec = 5e-3,
-- 发布轨迹标记的间隔秒数
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1

POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65

return options

修改rplidar.lua文件的参数之后,要重新进行编译,因为lua文件,它调用了别的文件,参数修改后会有一个整体的影响:

cd carto_ws/
catkin_make_isolated --install --use-ninja

三、仿真实现

1、打开PX4中自带的室内地图环境,里面包含一个带有激光雷达的无人机(iris):

roslaunch px4 indoor3.launch 

 

2、运行cartographer算法,在运行之前注意要source一下进入工作空间,否则可能会报错:

source ~/carto_ws/install_isolated/setup.bash
roslaunch cartographer_ros cartographer_demo_rplidar.launch

3、启动通信脚本

cd ~/XTDrone/communication/
python multirotor_communication.py iris 0

4、启动键盘控制脚本,控制无人机飞行,注意不能飞太高,导致激光雷达扫不到围墙

cd ~/XTDrone/control/keyboard/
python multirotor_keyboard_control.py iris 1 vel

5、通过键盘控制无人机飞行,扫描地图环境,建立地图

可以先按b进入offboard模式,然后按t解锁无人机,可以从gazebo中看到无人机桨叶开始转动,再连续按i键(upward vel +)使upward vel达到0.3m/s以上,此时无人机开始起飞,飞到一定高度后按s或k使无人机悬停于某一高度,就可以移动无人机进行建图了。

6、完成建图后,保存地图

rosrun map_server map_saver -f ~/carto_ws/src/cartographer_ros-master/cartographer_ros/map/indoor3_carto

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS-基于PX4的无人机SLAM建图(Cartographer)仿真 的相关文章

  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header
  • ROS AsyncSpinner 的多线程行为

    我试图了解 ROS 中的 AsyncSpinner 是如何工作的 因为我可能有一些误解 你可以找到类似的问题here As seen here它的定义提到 异步旋转器 产生几个线程 可配置 将并行执行回调 同时不会阻塞执行该操作的线程 叫它
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • 如何访问 Heroku 中的 docker 容器?

    我已按照此处构建图像的说明进行操作 https devcenter heroku com articles container registry and runtime getting started https devcenter her
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • 无法在 Ubuntu 20.04 上安装 ROS Melodic

    我正在尝试使用这些命令在 Ubuntu 20 04 上安装 ROS Melodic sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐