参考学习网站:https://google-cartographer-ros.readthedocs.io/en/latest/
问题提出:四旋翼搭载激光雷达A3进行SLAM室内定位,其怎样Running Cartographer ROS on your own bag //https://google-cartographer-ros.readthedocs.io/en/latest/ 特意去carto...的官方网站上学习了一下,并结合自己的平台做一些记录。
在自己的包里运行 Cartographer ROS
现在,您已经在提供的几个包上运行了Cartographer ROS,您可以继续让Cartographer使用您自己的数据。找到一个你想用来做Slam的.bag录音,并完成本教程。
注:当您想运行制图器ROS时,您可能需要首先运行source install_isolated/setup.bash来获得您的ROS环境(如果您的shell是zsh,则将bash替换为zsh)
验证您的包
Cartographer ROS提供了一个名为“cartographer_rosbag_validate”的工具,可以自动分析包中存在的数据。一般来说,在尝试调整Cartographer的错误数据之前运行此工具是一个好主意。
它从Cartographer自身的经验中得到好处,并能检测出一种常见的错误在bags中的种类。就实例而言,如果确定了一个sensor_msgs/Imu,该工具将确保重力矢量没有从IMU测量中被清除,因为Cartographer使用重力标准来确定地面的方向。
该工具还可以提供有关如何提高数据质量的提示。例如,对于Velodyne激光雷达,例如,对于Velodyne激光雷达,建议传感器发送每个UDP数据包一条sensor_msgs/PointCloud2
消息,而不是每转一条消息。通过这种粒度,制图员就可以将机器人运动引起的点云变形展开,从而得到更好的重建效果。
如果您已经获得了Cartographer的ROS环境,您可以简单地运行如下工具:
cartographer_rosbag_validate -bag_filename your_bag.bag
Cartographer是高度灵活的,可以配置为工作在各种机器人。robot配置是从必须从lua脚本定义的options数据结构中读取的。示例配置在src/cartographer_ros/cartographer_ros/configuration_files/中定义,并安装在install_isolated/share/cartographer_ros/configuration_files/中。
注意:理想情况下,.lua配置应该是特定于机器人的,而不是特定于包的。
//You can start by copying one of the example and then adapt it to your own need. If you want to use 3D SLAM:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
If you want to use 2D SLAM:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
然后您可以编辑我的robot.lua以满足您的机器人的需求。options 块中定义的值定义了制图员ROS前端应如何与您的包交互。options 段后定义的值用于调整制图员的内部工作,现在我们将忽略这些值。
也可以看:https://google-cartographer-ros.readthedocs.io/en/latest/configuration.html和https://google-cartographer.readthedocs.io/en/latest/configuration.html (The reference documentation of the Cartographer ROS configuration values and of the Cartographer configuration values.)
在需要调整的值中,您可能需要提供环境和机器人的tf帧ID
在需要调整的值中,您可能需要在地图帧、跟踪帧、发布帧和Odom帧(map_frame
, tracking_frame
, published_frame
and odom_frame
)中提供环境和机器人的tf帧ID。
您可以从包中的 /tf主题分发机器人的tf树,也可以在.urdf机器人定义中定义它。
注意:你应该相信你的姿势!在你的机器人和IMU或激光雷达之间的链路上稍微偏移一点,就会导致地图重建不连贯。Cartographer 通常可以纠正小的姿势错误,但不是所有的错误!
在/carto_ws/install_isolated/share/cartographer_ros/configuration_files/中定义了自己激光雷达的.lua文件 rplidar.lua
-- Copyright 2016 The Cartographer Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_link",
published_frame = "base_link",
odom_frame = "odom",
provide_odom_frame = false,
publish_frame_projected_to_2d = false,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1, --//Number of sensor_msgs/LaserScan topics you’ll use.
num_multi_echo_laser_scans = 0, --//Number of sensor_msgs/MultiEchoLaserScan topics you’ll use.
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0, --//Number of sensor_msgs/PointCloud2 topics you’ll use.
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 0.1,
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.pure_localization = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.min_range = 0.15
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
return options
还可以使用“使用地标(use_landmarks)”和“导航卫星(use_nav_sat)”启用地标和GPS作为附加定位源。options块中的其余变量通常应保持不变。
但是,有一个全局变量是您绝对需要适应您的包的需求的:
TRAJECTORY_BUILDER_3D.num_accumulated_range_data
or TRAJECTORY_BUILDER_2D.num_accumulated_range_data
.
这个变量定义了构造完整扫描(通常是一个完整的旋转)所需的消息数。
如果您遵循"cartographer_rosbag_validate”建议,每次扫描使用100条ROS消息,则可以将此变量设置为100。如果有两个测距传感器(例如,两个激光雷达)同时提供全扫描,则应将此变量设置为2。
您可能已经注意到,上一节中介绍的每个演示都是使用不同的roslaunch命令运行的。推荐使用制图器确实是为每个机器人提供一个定制的.launch文件和slam类型。The example .launch
files are defined in src/cartographer_ros/cartographer_ros/launch
and installed in install_isolated/share/cartographer_ros/launch/
.
例如我们的设置:
在文件目录:
/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/launch 和
/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/launch 分别复制了rplidar.launch
从复制提供的示例之一开始:
cp install_isolated/share/cartographer_ros/launch/backpack_3d.launch install_isolated/share/cartographer_ros/launch/my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d.launch install_isolated/share/cartographer_ros/launch/demo_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/offline_backpack_3d.launch install_isolated/share/cartographer_ros/launch/offline_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d_localization.launch install_isolated/share/cartographer_ros/launch/demo_my_robot_localization.launch
cp install_isolated/share/cartographer_ros/launch/assets_writer_backpack_3d.launch install_isolated/share/cartographer_ros/launch/assets_writer_my_robot.launch
my_robot.launch: 是用来在机器人上用真实的传感器数据在线(实时)执行SLAM。
demo_my_robot.launch: 是指从开发机器上使用,并期望使用bag文件名参数来重放记录中的数据。此启动文件还生成一个配置为可视化绘图器状态的rviz窗口。
offline_my_robot.launch: 与demo_my_robot.launch非常相似,但尝试尽可能快地执行slam。这可以显著加快地图的绘制。此启动文件还可以使用提供给bag文件名参数的多个bag文件。
demo_my_robot_localization.launch: 与demo_my_robot.launch非常相似,但需要一个load_state_filename参数,指向以前Cartographer 执行的.pbstream记录。之前的记录将用作预先计算的地图,Cartographer 将仅在此地图上执行定位。
assets_writer_my_robot.launch: 用于从以前制图器执行的.pstream记录中提取数据。
同样,需要对这些文件进行一些调整以适应您的机器人。
给-configuration_basename指定的每个参数都应该适合指向my_robot.lua。
如果决定使用机器人的.urdf描述,则应将描述放在install_isolated/share/cartographer_ros/urdf中,并调整robot_description参数以指向您的文件名。
如果决定使用/tf消息,则可以删除robot的描述参数、robot的state_publisher节点以及使用-urdf的行statring。
如果您的包或传感器发布的主题名称与制图员ROS预期的名称不匹配,则可以使用
注意:IMU主题应命名为“IMU”
如果只使用一个sensor_msgs/LaserScan主题,则应将其命名为scan。如果你有更多,他们应该被命名为scan_1
, scan_2
等…
如果您只使用一个sensor_msgs/multiecholaserscan主题,则应将其命名为echos。如果你有更多,他们应该被命名为echoes_1
, echoes_2
等…
如果只使用一个sensor_msgs/pointcloud2主题,则应将其命名为points2。如果您有更多,它们应该命名为points2_1、points2_2等…
一切都安排好了!现在,您可以使用以下命令开始制图:
roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag
如果你够幸运的话,一切都应该已经按预期工作了。但是,您可能有一些需要调优的问题。
在使用Rplidar A2/A3 激光雷达和cartographer算法进行激光SLAM的时候,需要更改的主要有两个地方:
1. 在/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/configuration_files/中定义,并在/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/configuration_files/中安装.lua文件,并仿照修改
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
修改后的rplidar.lua如下:
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_link", //修改了端口号为base_link
published_frame = "base_link", //修改了端口号为base_link
odom_frame = "odom",
provide_odom_frame = false, //关闭了里程计
publish_frame_projected_to_2d = false,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1, //修改了激光传感器话题数量为1
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0, //修改点云数量为0
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 0.1, //周期修改
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.pure_localization = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.min_range = 0.15 //修改了激光雷达测量范围
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
return options
2. 在/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/launch 和
/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/launch 分别仿照修改rplidar.launch
cp install_isolated/share/cartographer_ros/launch/backpack_2d.launch install_isolated/share/cartographer_ros/launch/my_robot.launch
my_robot.launch: 是用来在机器人上用真实的传感器数据在线(实时)执行SLAM。
3.最后需要在rplidar_ws驱动包里修改端口号
附上:
cartographer_ros 安装
cartographer_ros github 主页:
https://github.com/googlecartographer/cartographer_ros
cartographer_ros 官方安装指引:
https://google-cartographer-ros.readthedocs.io/en/latest/
安装步骤:
# Install wstool and rosdep.
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
# Create a new workspace in 'catkin_ws'.
mkdir catkin_ws (这里建议换一个名字,叫 cartographer 就行,这个工作空间专
用于 cartographer)
cd catkin_ws
wstool init src
# Merge the cartographer_ros.rosinstall file and fetch code for dependencies.
wstool merge -t src
https://raw.githubusercontent.com/googlecartographer/cartographer_ros
/master/cartographer_ros.rosinstall
wstool update -t src
这一步会报一个 ceres-solver failed 的错误,需要修改一个网址
#进入到 src 文件夹后 ctrl+h 显示出隐藏文件,打开.rosinstall
#更改 ceres-solver 中地址改为下面的地址:#>>uri: https://github.com/ceres-solver/ceres-solver.git
# Install proto3.
src/cartographer/scripts/install_proto3.sh (失败试一下前面加 sudo)
# Install deb dependencies.
# The command 'sudo rosdep init' will print an error if you have already
# executed it since installing ROS. This error can be ignored.
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} –y
(根据自己版本将${ROS_DISTRO } 替换为 kinetic 或者 indigo)
# Build and install.
catkin_make_isolated --install --use-ninja【此步编译成功 代表安装成功】
运行官方数据集 - Revo LDS 机器人:
1. 下载数据集
wget -P ~/Downloads https://storage.googleapis.com/cartographer-
public-data/bags/revo_lds/cartographer_paper_revo_lds.bag
2. 运行数据集
roslaunch cartographer_ros demo_revo_lds.launch \
bag_filename:=${HOME}/Downloads/cartographer_paper_revo_lds.bag
rplidar驱动安装
rplidar github主页:https://github.com/robopeak/rplidar_ros
1、安装步骤:
mkdir –p ~/rplidar_ws/src
cd rplidar_ws/src
catkin_init_workspace
git clone https://github.com/robopeak/rplidar_ros
cd ..
catkin_make
2、手动source
新开一个终端
sudo gedit .bashrc
在打开的txt文件下面加上
source /home/nvidia/rplidar_ws/devel/setup.bash 根据安装目录的不同,红色部分可能有所变化
3、运行
roslaunch rplidar_ros rplidar.launch (注意修改launch文件中的端口号和波特率才能正常运行)
运行起来不报错 且 雷达转起来 就代表OK!
4、对于tx1或者tx2,可能插上激光雷达没法识别设备,这是由于系统没有安装相关驱动,拷贝
cp210x.ko
至本地
sudo insmod cp210x.ko
但是这种方法必须每次手动安装,暂时没有找到永久安装的方法,但可以把这句话写到开机脚本中