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

一、准备工作

1.1、安装Ubuntu和ROS系统

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

ROS发布日期ROS版本停止支持日期对应Ubuntu版本2018年5月23日ROS Melodic Morenia2023年5月Ubuntu 18.042016年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">
  </remap></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">
</node></node></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,
-- &#x5730;&#x56FE;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x7528;&#x6765;&#x53D1;&#x5E03;&#x5B50;&#x5730;&#x56FE;&#x7684;ROS&#x5750;&#x6807;&#x7CFB;ID&#xFF0C;&#x4F4D;&#x59FF;&#x7684;&#x7236;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x901A;&#x5E38;&#x662F;"map"
  map_frame = "map",
-- &#x5EFA;&#x56FE;&#x65F6;&#x8DDF;&#x8E2A;&#x7684;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;IMU&#x5E94;&#x8BE5;&#x662F;IMU&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x5C3D;&#x7BA1;&#x5B83;&#x53EF;&#x80FD;&#x8F6C;&#x52A8;&#x4E86;&#xFF0C;"imu_link"&#x6216;"base_link"
  tracking_frame = "iris_0/laser_2d",
-- &#x4F5C;&#x4E3A;&#x53D1;&#x5E03;&#x4F4D;&#x7F6E;&#x7684;&#x5B50;&#x5750;&#x6807;&#x7CFB;&#x7684;ROS&#x5750;&#x6807;&#x7CFB;ID
-- &#x5BF9;&#x4E8E;"odom"&#x4F8B;&#x7A0B;&#xFF0C;&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x7684;&#x5176;&#x4ED6;&#x5730;&#x65B9;&#x63D0;&#x4F9B;"odom"&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x90A3;&#x4E48;"odom"&#x5728;map_frame&#x4E2D;&#x7684;&#x4F4D;&#x7F6E;&#x5C06;&#x4F1A;&#x88AB;&#x53D1;&#x5E03;&#xFF0C;&#x5426;&#x5219;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E3A;"base_link"&#x5373;&#x53EF;
  published_frame = "base_link",
-- "provide_odom_frame"&#x4E3A;&#x771F;&#x65F6;&#x4F7F;&#x7528;&#xFF0C;&#x4F4D;&#x4E8E;"published_frame"&#x548C;"map_frame"&#x4E4B;&#x95F4;&#xFF0C;&#x7528;&#x6765;&#x53D1;&#x5E03;&#x672C;&#x5730;SLAM&#x7ED3;&#x679C;&#xFF08;&#x975E;&#x95ED;&#x73AF;&#xFF09;&#xFF0C;&#x901A;&#x5E38;&#x662F;"odom"
  odom_frame = "odom",
-- &#x5982;&#x679C;&#x4F7F;&#x80FD;&#xFF0C;&#x8FD9;&#x4E2A;&#x5C40;&#x90E8;&#x7684;&#x3001;&#x975E;&#x95ED;&#x73AF;&#x7684;&#x3001;&#x8FDE;&#x7EED;&#x7684;"odom_frame"&#x5728;"map_frame"&#x4E2D;&#x7684;&#x4F4D;&#x7F6E;&#x5C06;&#x88AB;&#x53D1;&#x5E03;
  provide_odom_frame = true,
-- &#x5982;&#x679C;&#x4F7F;&#x80FD;&#xFF0C;&#x53D1;&#x5E03;&#x7684;&#x4F4D;&#x59FF;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x88AB;&#x9650;&#x5236;&#x4E3A;2D&#x4F4D;&#x59FF;(&#x65E0;&#x6A2A;&#x6EDA;&#x3001;&#x4FEF;&#x4EF0;&#x548C;z&#x4F4D;&#x7F6E;)&#x3002;
  publish_frame_projected_to_2d = false,
--  use_pose_extrapolator = true,
-- &#x5982;&#x679C;&#x4F7F;&#x80FD;&#xFF0C;&#x5C06;&#x8BA2;&#x9605;nav_msgs/Odometry&#x7C7B;&#x578B;&#x7684;topic "odom"&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5FC5;&#x987B;&#x63D0;&#x4F9B;&#x91CC;&#x7A0B;&#x8BA1;&#xFF0C;&#x800C;&#x4E14;&#x91CC;&#x7A0B;&#x8BA1;&#x7684;&#x4FE1;&#x606F;&#x5C06;&#x88AB;&#x5305;&#x542B;&#x5728;SLAM&#x4E2D;
  use_odometry = false,
-- &#x5982;&#x679C;&#x4F7F;&#x80FD;&#xFF0C;&#x5C06;&#x8BA2;&#x9605;sensor_msgs/NavSatFix&#x7C7B;&#x578B;&#x7684;topic "fix"&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5FC5;&#x987B;&#x63D0;&#x4F9B;&#x5BFC;&#x822A;&#x6570;&#x636E;&#xFF0C;&#x800C;&#x4E14;&#x5BFC;&#x822A;&#x6570;&#x636E;&#x7684;&#x4FE1;&#x606F;&#x5C06;&#x88AB;&#x5305;&#x542B;&#x5728;SLAM&#x4E2D;
  use_nav_sat = false,
-- &#x5982;&#x679C;&#x4F7F;&#x80FD;&#xFF0C;&#x5C06;&#x8BA2;&#x9605;cartographer_ros_msgs/LandmarkList&#x7C7B;&#x578B;&#x7684;topic "landmarks"
  use_landmarks = false,
-- &#x8BA2;&#x9605;&#x7684;laser scan topics&#x7684;&#x4E2A;&#x6570;
-- &#x5BF9;&#x4E8E;&#x5355;&#x4E2A;&#x6FC0;&#x5149;&#xFF0C;&#x8BA2;&#x9605;sensor_msgs/LaserScan&#x7C7B;&#x578B;&#x7684;"scan" topic(sensor_msgs/LaserScan&#x8FD9;&#x4E2A;topic&#x5C06;&#x88AB;&#x7528;&#x4E8E;SLAM&#x7684;&#x8F93;&#x5165;)
-- &#x5BF9;&#x4E8E;&#x591A;&#x4E2A;&#x6FC0;&#x5149;&#xFF0C;topics&#x4E3A;"scan_1","scan_2"...(&#x5982;&#x679C;num_laser_scans&#x5927;&#x4E8E;1&#xFF0C;&#x90A3;&#x4E48;&#x591A;&#x4E2A;&#x88AB;&#x7F16;&#x53F7;&#x7684;scan topics&#xFF0C;&#x6BD4;&#x5982;scan1&#x3001;scan2&#x3001;scan3...&#x76F4;&#x5230;&#x5E76;&#x5305;&#x62EC;num_laser_scans&#xFF0C;&#x5C06;&#x88AB;&#x7528;&#x4F5C;SLAM&#x7684;&#x8F93;&#x5165;)
  num_laser_scans = 1,
-- &#x8BA2;&#x9605;&#x591A;&#x56DE;&#x6CE2;&#x6280;&#x672F;laser scan topics&#x7684;&#x4E2A;&#x6570;
-- &#x5BF9;&#x4E8E;&#x5355;&#x4E2A;&#x6FC0;&#x5149;&#xFF0C;&#x8BA2;&#x9605;sensor_msgs/MultiEchoLaserScan&#x7C7B;&#x578B;&#x7684;"echoes"topic
-- &#x5BF9;&#x4E8E;&#x591A;&#x4E2A;&#x6FC0;&#x5149;&#xFF0C;topics&#x4E3A;"echoes_1", "echoes_2"...

  num_multi_echo_laser_scans = 0,
-- &#x63A5;&#x6536;&#x5230;&#x7684;&#xFF08;&#x591A;&#x56DE;&#x6CE2;&#xFF09;laser scan&#x4E2D;&#x5206;&#x79BB;&#x51FA;&#x6765;&#x7684;&#x70B9;&#x4E91;&#x7684;&#x4E2A;&#x6570;&#xFF0C;&#x5206;&#x5272;scan&#x80FD;&#x591F;&#x4FDD;&#x8BC1;&#x5728;&#x6FC0;&#x5149;&#x8BBE;&#x5907;&#x79FB;&#x52A8;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;scans&#x4E0D;&#x5F2F;&#x66F2;&#x53D8;&#x5F62;&#x3002;&#x6709;&#x76F8;&#x5E94;&#x7684;&#x8F68;&#x8FF9;&#x751F;&#x6210;&#x5668;&#x9009;&#x9879;&#x53EF;&#x4EE5;&#x5C06;&#x5206;&#x79BB;&#x7684;scans&#x7D2F;&#x79EF;&#x5230;&#x70B9;&#x4E91;&#x4E2D;&#xFF0C;&#x7528;&#x6765;&#x8FDB;&#x884C;scan matching
  num_subdivisions_per_laser_scan = 1,
-- &#x8BA2;&#x9605;&#x7684;&#x70B9;&#x4E91;topics&#x7684;&#x4E2A;&#x6570;
-- &#x5BF9;&#x4E8E;&#x5355;&#x4E2A;&#x6D4B;&#x8DDD;&#x4EEA;&#xFF0C;&#x8BA2;&#x9605;sensor_msgs/PointCloud2&#x7C7B;&#x578B;&#x7684;"points2" topic
-- &#x5BF9;&#x4E8E;&#x591A;&#x4E2A;&#x6D4B;&#x8DDD;&#x4EEA;&#xFF0C;topics&#x4E3A;"points2_1", "points2_2"...

  num_point_clouds = 0,
-- &#x4F7F;&#x7528;tf2&#x673A;&#x578B;&#x8F6C;&#x6362;&#x641C;&#x7D22;&#x7684;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#x79D2;&#x6570;
  lookup_transform_timeout_sec = 0.2,
-- &#x53D1;&#x5E03;submap&#x4F4D;&#x7F6E;&#x7684;&#x95F4;&#x9694;&#x79D2;&#x6570;
  submap_publish_period_sec = 0.3,
-- &#x53D1;&#x5E03;&#x4F4D;&#x7F6E;&#x7684;&#x95F4;&#x9694;&#x79D2;&#x6570;
  pose_publish_period_sec = 5e-3,
-- &#x53D1;&#x5E03;&#x8F68;&#x8FF9;&#x6807;&#x8BB0;&#x7684;&#x95F4;&#x9694;&#x79D2;&#x6570;
  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

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

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使无人机悬停于某一高度,就可以移动无人机进行建图了。

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

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

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

Original: https://blog.csdn.net/weixin_42600623/article/details/125377415
Author: 勤奋的搞机人
Title: ROS-基于PX4的无人机SLAM建图(Cartographer)仿真

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/720482/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球