草庐IT

Cartographer建图和纯定位

小霍金 2023-04-08 原文

(一)cartographer在ros下安装参考:

要求:

64-bit, modern CPU (e.g. 3rd generation i7)
16 GB RAM
Ubuntu 18.04 (Bionic), 20.04 (Focal)
gcc version 6.3.0, 7.5.0, 9.3.0

参考安装指南:https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html

1.下载两个文件:

cartographer
cartographer_ros

2.建立工作空间

建立cartographer_ws/src,并把以上两个文件放入到src下面:

3.安装和编译ninja

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

4.安装依赖

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

如果失败,参照:Ubuntu下多版本sophus、opencv使用: 3. 鱼香ROS一键安装程序包依赖

wget http://fishros.com/install -O fishros && . fishros
rosdepc install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO

5.安装 abseil-cpp

src/cartographer/scripts/install_abseil.sh

同时卸载方式为:

sudo apt-get remove ros-${ROS_DISTRO}-abseil-cpp

6.编译

catkin_make_isolated --install --use-ninja

7.官方数据集下载链接

2D数据集
3D数据集

8.官方demo

建图
2D

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

3D:

roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag

纯定位
下载2D数据集:

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-05-14-44-52.bag
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-27-12-31-41.bag

一个用来定位一个用来建立地图,

roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=${HOME}/Downloads/b2-2016-04-05-14-44-52.bag
roslaunch cartographer_ros demo_backpack_2d_localization.launch \
   load_state_filename:=${HOME}/Downloads/b2-2016-04-05-14-44-52.bag.pbstream \
   bag_filename:=${HOME}/Downloads/b2-2016-04-27-12-31-41.bag

下载3D数据集,操作相同:

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-13-54-42.bag
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-15-52-20.bag
roslaunch cartographer_ros offline_backpack_3d.launch bag_filenames:=${HOME}/Downloads/b3-2016-04-05-13-54-42.bag
roslaunch cartographer_ros demo_backpack_3d_localization.launch \
   load_state_filename:=${HOME}/Downloads/b3-2016-04-05-13-54-42.bag.pbstream \
   bag_filename:=${HOME}/Downloads/b3-2016-04-05-15-52-20.bag

(二)2d cartographer 解决cartographer纯定位问题

1.使用话题的类型是pointcloud2

backpack_2d.launch:

2.lua文件的修改

backpack_2d.lua:
修改以下几句:

  num_laser_scans = 0,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 1,

添加几句:

MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true

参照:https://www.codeleading.com/article/77834618087/
完整的backpack_2d.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",
  published_frame = "base_link",
  odom_frame = "odom",
  provide_odom_frame = true,
  publish_frame_projected_to_2d = false,
  use_pose_extrapolator = true,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 0,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 1,
  lookup_transform_timeout_sec = 0.2,
  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.use_imu_data = false
TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true

return options

3.urdf的修改:

backpack_2d.urdf: 为激光雷达的frame_id,imu暂且不管

  <joint name="velodyne_joint" type="fixed">   与base_link链接情况,暂且理解base_link为车体坐标系
    <parent link="base_link" />
    <child link="velodyne" />
    <origin xyz="0.1007 0 0.0558" />
  </joint>

完整的backpack_2d.urdf

<robot name="cartographer_backpack_2d">
  <material name="orange">
    <color rgba="1.0 0.5 0.2 1" />
  </material>
  <material name="gray">
    <color rgba="0.2 0.2 0.2 1" />
  </material>

  <link name="imu_link">
    <visual>
      <origin xyz="0 0 0" />
      <geometry>
        <box size="0.06 0.04 0.02" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>

  <link name="velodyne">
    <visual>
      <origin xyz="0 0 0" />
      <geometry>
        <cylinder length="0.05" radius="0.03" />
      </geometry>
      <material name="gray" />
    </visual>
  </link>

  <link name="base_link" />

  <joint name="imu_link_joint" type="fixed">
    <parent link="base_link" />
    <child link="imu_link" />
    <origin xyz="0 0 0" />
  </joint>

  <joint name="velodyne_joint" type="fixed">
    <parent link="base_link" />
    <child link="velodyne" />
    <origin xyz="0.1007 0 0.0558" />
  </joint>
  
</robot>

4.修改完成之后启动建图节点:

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/home/xxx/a.bag

5.保存地图:

完成轨迹, 不接受进一步的数据:
新开终端:
注意要进行source,不然无法启用rosservice

source  ~/cartographer/devel_isolated/setup.bash
rosservice call /finish_trajectory 0

序列化保存其当前状态

rosservice call /write_state "{filename: '${HOME}/Downloads/mymap.pbstream'}"

将pbstream转换为pgm和yaml

rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/Downloads/mymap -pbstream_filename=${HOME}/Downloads/mymap.pbstream -resolution=0.05

或者

roslaunch cartographer_ros assets_writer_ros_map.launch bag_filenames:=/home/xxxxx/a.bag pose_graph_filename:=/home/xxxx/a.bag.pbstream -resolution=0.05

6.纯定位功能(bag已经解决任意点启动功能,有待实车实验)

demo_backpack_2d_localization.launch:
添加:

<remap from="points2" to="/velodyne_points" />    

注释:

  <!-- <node name="playbag" pkg="rosbag" type="play"
</launch> -->改由手动rosbag play xx.bag -s 50

7.启动定位节点(已经完成由传感器直接输入):

roslaunch cartographer_ros demo_backpack_2d_localization.launch load_state_filename:=/home/xxxx/a.bag.pbstream

启动bag包:

rosbag play xx.bag -s 50

-s 50表示在bag第50s的时候启动

8.cartographer编译

catkin_make_isolated --install --use-ninja

9.纯定位,取消更新地图部分

occupancy_grid_node_main.cc中的 occupancy_grid_publisher_.publish(*msg_ptr);注释掉

10.加入IMU的数据,需要修改的部分

backpack_2d.launchdemo_backpack_2d_localization.launch添加: <remap from="imu" to="/pa_gs02/imu/data" />
backpack_2d.lua:修改为TRAJECTORY_BUILDER_2D.use_imu_data = true

(三)相关操作博客

具体操作系列:

Cartographer用于机器人纯定位

cartographer建图,重定位及发布消息结构为nav_msgs::Odometry的odom话题

ROS小车记录系列(二)IMU采集、过滤,与odom数据融合,发布新的odom话题

ROS小车记录系列(八)树莓派4b安装cartographer,使用官方bag包测试建图

cartographer_ros定位功能位姿获取与重定位设置

cartographer pure_localization 纯定位修改 +初始化位置

ROS小车,乐视深度相机+cartographer+move_base从零开始配置导航

cartographer+move_base在gazebo中给px4添加激光雷达并接入ROS进行SLAM自动导航避障

第一讲【ROS-SLAM】2D激光雷达 cartographer构建地图

第二讲 【cartographer】Ubuntu16.04 kinetic 最新版cartographer安装

第三讲 【cartographer】 添加功能以从RVIZ为纯本地化模式设置初始姿势

第四讲 【cartographer】纯定位 纯本地化 pure_localization

第五讲【cartographer】在仿真环境中 建图 纯定位

第六讲【cartographer】纯定位参数优化(初级篇)

Cartographer魔改 cartographer定位模式下设置起始位姿——快速重定位

有关Cartographer建图和纯定位的更多相关文章

  1. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  2. 打通源码,高效定位代码问题|云效工程师指北 - 2

    大家好,我叫胡飞虎,花名虎仔,目前负责云效旗下产品Codeup代码托管的设计与开发。代码作为企业最核心的数据资产,除了被构建、部署之外还有更大的价值。为了帮助企业和团队挖掘更多源代码价值以赋能日常代码研发、运维等工作,云效代码团队在大数据和智能化方向进行了一系列的探索和实践(例如代码搜索与推荐),本文主要介绍我们如何通过直接打通源代码来提高研发与运维效率。随着微服务架构的流行,一个业务流程需要多个微服务共同完成。一旦出现问题,运维人员在面对数量多、调用链路复杂的情况下,很难快速锁定导致问题发生的罪魁祸首:代码。为了提高排查效率,目前常见的解决方案是:链路跟踪+日志分析工具相结合。即通过链路跟踪

  3. ruby - 在 Mac 上定位 "irbrc"文件 - 2

    我看到很多很酷的东西可以添加到我的Ruby控制台中。例如,一个好的列表是“My.irbrcforconsole/irb”。我用谷歌搜索,但我只找到了网络日志,上面写着人们在他们的.irbrc中添加了什么gem。没有人说在哪里可以找到它。我找不到“irbrc”。我打开了我的主文件夹,如果我输入IRB,它会转到Ruby控制台,但我找不到这个文件。谁能帮我找到它? 最佳答案 这是一个irbrc点文件,因此您需要在您的主目录中ls-a才能找到它。如果它不在那里,只需创建一个.irbrc文件。我的很简单,但这就是我的内容:require'ru

  4. ruby-on-rails - capybara :查找(元素)使用选择器来定位复杂的属性名称 - 2

    使用cucumber和capybara测试Rails应用。假设我无法更改标记,我可以使用capybara在充满类似td和select的页面中选择以下选择吗?LanguagesCommunication这似乎失败了(我假设是因为嵌套的“[”和“]”)。find("select[name=attributes[ruby][category]]")转义也不行。想法? 最佳答案 您可以尝试find('select',:name=>'attributes[ruby][category]')或find_field('attributes[rub

  5. 工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码) - 2

    博主的合并代码git@github.com:huashu996/VINS-FUSION-ESDFmap.git一、D435i深度相机配置1.1SDK+ROS参考我之前的博客,步骤和所遇见的问题已经写的很详细了https://blog.csdn.net/HUASHUDEYANJING/article/details/129323834?spm=1001.2014.3001.55011.2相机标定参数1、相机内参通过rostopic的camera/info获取header:标准消息头seq:序列ID,连续递增的ID号stamp:两个时间戳frame_id:与此数据相关联的帧IDheight:图像尺

  6. 基于对象属性定位的 Ruby 数组方法? - 2

    假设我有一个Ruby类,Flight。Flight上有一个attr_accessor:key。如果有一个此类的实例数组:flights=[flight1,flight2,flight3],我有一个“目标键”,比如说“2jf345”,我想根据它找到一个航类键,来自该数组-我应该使用哪种代码?这是我要使用的代码:航类[flights.map{|s|s.key}.index(target_key)]但是对于Ruby,似乎应该有更简单的方法。此外,上面的代码为我返回了一个错误-`[]':noimplicitconversionfromniltointeger(TypeError)。我认为这意味

  7. ruby - 在 Ruby 中将元素重新定位到数组的前面 - 2

    即使来自javascript,这对我来说也很糟糕:irb>>a=['a','b','c']=>["a","b","c"]>>a.unshift(a.delete('c'))=>["c","a","b"]有没有更清晰的方法将元素放在数组的前面?编辑我的实际代码:if@admin_users.include?(current_user)@admin_users.unshift(@admin_users.delete(current_user))end 最佳答案 也许这对你来说更好看:a.insert(0,a.delete('c'))

  8. ruby-on-rails - Ruby 地理定位 Gem/插件 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion什么可用的(最好的)基于ruby​​IP的地理定位gem/插件?它们在功能、性能和易用性方面如何相互比较(例如,它们是否与网络服务交互,或需要单独的数据库等)?希望有使用过的friend可以分享一下经验和建议。

  9. ruby-on-rails - 如何使用 capistrano deploy 定位特定的提交 SHA - 2

    我想知道如何使用Capistrano在Git中针对特定的提交SHA进行部署?应该是这样的capdeploy--version=经过大量搜索似乎无法找到这个问题的答案。 最佳答案 对于Capistrano2.9到3.0:cap-Srevision=80655da8d80aaaf92ce5357e7828dc09adb00993deploy对于旧版本的Capistrano,您可以通过执行以下操作来部署特定的gitcommit/tree/branch/tag:cap-sbranch=80655da8d80aaaf92ce5357e7828

  10. javascript - 如何使用 grunt autoprefixer 定位 IE9 及更高版本? - 2

    如何使用gruntautoprefixer针对IE9及更高版本?我可以做类似以下的事情吗:grunt.config('autoprefixer',{options:{browsers:['IE9+']},dist:{expand:true,src:'/styles/app.css'}}); 最佳答案 browsers选项的语法可以在主Autoprefixerdocumentation中找到。.相关位是:Firefox>=20isFirefoxversion20ornewer.和:Browsersnames(caseinsensiti

随机推荐