自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3

参考学习网站: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

Create a .lua configuration

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.htmlhttps://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_frametracking_framepublished_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。

Create .launch files for your SLAM scenarios

您可能已经注意到,上一节中介绍的每个演示都是使用不同的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

<launch>  
      
      <param name="/use_sim_time" value="false" /> 
 
      <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 from="scan" to="scan" />  
      </node>
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />


</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预期的名称不匹配,则可以使用<remap>元素重定向主题。预期的主题名称取决于所使用的范围查找设备的类型。

注意:IMU主题应命名为“IMU”
           如果只使用一个sensor_msgs/LaserScan主题,则应将其命名为scan。如果你有更多,他们应该被命名为scan_1scan_2等…
           如果您只使用一个sensor_msgs/multiecholaserscan主题,则应将其命名为echos。如果你有更多,他们应该被命名为echoes_1echoes_2等…
           如果只使用一个sensor_msgs/pointcloud2主题,则应将其命名为points2。如果您有更多,它们应该命名为points2_1、points2_2等…

Try your configuration

一切都安排好了!现在,您可以使用以下命令开始制图:

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。

<launch>  
      
      <param name="/use_sim_time" value="false" /> 
 
      <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 from="scan" to="scan" />  
      </node>
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />


</launch>

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
但是这种方法必须每次手动安装,暂时没有找到永久安装的方法,但可以把这句话写到开机脚本中

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值