基于Cartographer的建图与导航

2023-05-16

一、 RoboSense 16线雷达驱动安装 2

二、 Cartographer的安装 2

三、 配置文件结构说明 4

四、 配置文件详解 4

2D lua文件的配置 5

2D launch文件的配置 6

2D pure location lua文件的配置 7

2D pure location launch文件的配置 7

3D lua文件的配置 8

3D launch文件的配置 9

3D pure location lua文件的配置 10

3D pure location launch文件的配置 10

Assets writer 3D lua文件的配置 11

Assets writer 3D launch文件的配置 12

五、 建图命令 12

六、 纯定位命令 13

七、 导航文件配置 13

launch文件的配置 13

move_base_params.yaml文件参数 15

costmap_common_params.yaml文件参数 16

local_costmap_params.yaml  文件参数 17

global_costmap_params.yaml文件参数 18

dwa_local_planner_params.yaml文件参数 18

navfn_global_planner_params.yaml文件参数 19

八、 导航命令 20

九、 发送目标点的导航路线规划 20

十、 导航探索SLAM 20

十一、 其余功能包说明 21

1. imu_pub 21

2. odom_pub(未用到) 21

3. cmd_vel_to_stm 21

4. pointcloud_to_laserscan 21

参数设置请参照wiki.ros.org/pointcloud_to_laserscan 21

十二、 相关博客推荐 21

Ros版本:ROS-Kinect

工作目录:~/carto_ws

  • RoboSense 16线雷达驱动安装

安装依赖项

$>>  sudo apt-get install libpcap-dev

下载源码到工作目录的src/文件夹下

$>>  cd ~/carto_ws/src

$>>  git clone https://github.com/RoboSense-LiDAR/ros_rslidar

修改文件权限

$>>  cd ~/carto_ws/src/ros_rslidar/rslidar_drvier

$>>  chmod 777 cfg/*

$>>  cd ~/carto_ws/src/ros_rslidar/rslidar_pointcloud

$>>  chmod 777 cfg/*

源码编译

$>>  cd ~/carto_ws

$>>  catkin_make

设置电脑的静态ip地址

$>>  sudo gedit /etc/networsk/interfaces

设置eth0(有些是eth1,或者eno0等,根据自己的网口修改),修改或增加内容如下:

# interfaces eth0 for  rslidar connect

auto eth0

iface eth0 inet static

address 192.168.1.102

netmask 255.255.255.0

gateway 192.168.1.1

连接雷达电源和网线,重启电脑。

$>>  cd carto_ws

$>>  source devel/setup.bash

$>>  roslaunch rslidar_pointcloud rs_lidar_16.launch

可以在RVIZ中看到点云,注意要设置全局坐标系为rslidar。

  • Cartographer的安装

cartographer的安装主要是ceres、prtobuf和cartographer的安装,cartographer_ros是ROS的功能包,调用cartographer算法。

安装依赖:

$>>  sudo apt-get update

$>>  sudo apt-get install -y python-wstool python-rosdep ninja-build

安装Ceres solver

$>>  cd  ~/carto_ws/document

$>>  git clone GitHub - ceres-solver/ceres-solver: A large scale non-linear optimization library

$>>  cd ceres-solver

$>>  mkdir build

$>>  cd build

$>>  cmake ..

$>>  make -j

$>>  sudo make install

ceres:可能存在报错,

先查看gcc版本:ubuntu16.04安装ceres时make出错_阿巴乾的博客-CSDN博客_ceres库make失败  https://blog.csdn.net/weixin_44235615/article/details/122651628

如果版本正确,编译ceres时,需要更改eigen3 到 3.3 版本以上。3.4测试有效。

安装Prtobuf 3.0

$>>  cd  ~/carto_ws/document

$>>  git clone https://github.com/google/protobuf.git

$>>  cd protobuf

$>>  git checkout v3.6.1

$>>  mkdir build

$>>  cd build

$>>  cmake  \

  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \

  -DCMAKE_BUILD_TYPE=Release \

  -Dprotobuf_BUILD_TESTS=OFF \

  ../cmake

$>>  make -j 2

$>>  sudo make install

安装Cartographer

$>>  cd  ~/carto_ws/document

$>>  git clone https://github.com/BlueWhaleRobot/cartographer.git

$>>  cd cartographer

$>>  mkdir build

$>>  cd build

$>>  cmake ..

$>>  make -j

$>>  sudo make install

安装cartographer_ros

$>>  cd ~/carto_ws/src   #请修改路径到自己的ROS catkin工作空间

$>>  git clone https://github.com/BlueWhaleRobot/cartographer_ros.git

$>>  cd ..

$>>  catkin_make_isolated --install --use-ninja

测试

下载文件:https://www.bwbot.org/s/vQ2D9Z

然后运行。根据个人平台计算能力不同,完整运行时间一般为半个小时到1个小时之间

$>>  source devel_ioslated/setup.bash

$>>  roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=${HOME}/Desktop/cartographer_paper_deutsches_museum.bag

##修改到自己保存的路径

提取建立的地图,结束测试

上面步骤会生成一个pbstream文件,用cartographer_ assets_writer可以转换成ROS使用的栅格地图。

$>>  roslaunch cartographer_ros assets_writer_ros_map.launch bag_filenames:=${HOME}/Desktop/cartographer_paper_deutsche

  • 配置文件结构说明

工作目录为carto_ws,src同级目录除了编译产生的,其余都是安装依赖留下的文件夹。

Cartographer配置文件主要存在src/cartographer_ros/cartographer_ros下的urdf文件夹的myself_robot.urdf、configuration文件夹下的myself_rslidar_2(3)d.lua,myself_backpack_2(3)d_localization.lua以及rslidar_2(3)d.rviz、demo_2d.rviz配置文件、launch文件夹下的myself_rslidar_2(3)d.launch、myself_backpack_2(3)d_localization.launch。这里定位由于和后面导航rviz显示冲突,注释了rviz,纯定位时需要取消注释,显示调用rviz。

在3D建图还需要后面进行离线处理,需要assets_writer_myself_3d.launch,其中相关的配置文件为 assets_writer_myself_3d.lua。

利用bag包进行离线3D SLAM建图可以使用offline_myself_rslidar_3d.launch

  • 配置文件详解

URDF文件的配置(这里2D和3D都是使用的同一个urdf):

<robot name="my_robot">

<!--设置颜色-->

  <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>

 <!--设置imu link,长方体,长宽高为0.06 0.04 0.02,这里的单位为米m-->

  <link name="imu">

    <visual>

      <origin xyz="0.0 0.0 0.0" />

      <geometry>

        <box size="0.06 0.04 0.02" />

      </geometry>

      <material name="orange" />

    </visual>

  </link>

  <!--设置lidar link,圆柱,半径0.05,高为0.07,这里的单位为米m-->

  <link name="laser">

    <visual>

      <origin xyz="0.0 0.0 0.0" />

      <geometry>

        <cylinder length="0.07" radius="0.05" />

      </geometry>

      <material name="gray" />

    </visual>

  </link>

 <!--设置base link,box 0.5x0.5x0.5,可根据实际机器人大小设置-->

  <link name="base_link" />

   <visual>

      <origin xyz="0 0 0" />

      <geometry>

        <box size="0.5 0.5 0.5" />

      </geometry>

      <material name="Cyan" />

<color rgba="0 0.4 0.2 0.6"/>

    </visual>

  </link>

 <!--设置imu和基座base的关系,imu和base没有偏移和旋转,默认为同一个坐标系,根据实际情况修改,注意子零件在父零件的坐标中的位姿表示,(右手坐标系,车头方向为x正向,车体左侧为y正向,天空为z正向)-->

  <joint name="imu2base" type="fixed">

    <parent link="base_link" />

    <child link="imu" />

    <origin xyz="0 0 0" rpy="0 0 0" />

  </joint>

  <!--设置lidar和基座base的关系,在base的x方向上偏移0.25,z方向偏移0.5-->

  <joint name="laser2base" type="fixed">

    <parent link="base_link" />

    <child link="laser" />

    <origin xyz="0.25 0.0 0.5" rpy="0. 0. 0." />

  </joint>

</robot>

2D lua文件的配置

include "map_builder.lua"

include "trajectory_builder.lua"

options = {

  map_builder = MAP_BUILDER,

  trajectory_builder = TRAJECTORY_BUILDER,

  map_frame = "map",  #这个是地图坐标系名称

  tracking_frame = "imu",#设置为IMU的坐标系

  published_frame = "base_link",#设置为机器人基底坐标系

  odom_frame = "odom",#里程计坐标系名称

  provide_odom_frame = true,#发布base_link->odom的tf变化,否则发布base_link->map

  publish_frame_projected_to_2d = false, #如果启用,发布的姿态将被限制为纯2D姿态(无滚动、俯仰或z-偏移)。

  use_odometry = false,#是否使用编码器提供odom

  use_nav_sat = false,#是否使用gps

  use_landmarks = false,#是否使用路标

  num_laser_scans = 0,#使用2d 雷达的数量

  num_multi_echo_laser_scans = 0,#使用 echo_laser的数量

  num_subdivisions_per_laser_scan = 1,

  num_point_clouds = 1, #使用3D雷达的数量

  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.,

}

TRAJECTORY_BUILDER_3D.num_accumulated_range_data = 1

MAP_BUILDER.use_trajectory_builder_3d = true

MAP_BUILDER.num_background_threads = 7

POSE_GRAPH.optimization_problem.huber_scale = 5e2

POSE_GRAPH.optimize_every_n_nodes = 320

POSE_GRAPH.constraint_builder.sampling_ratio = 0.03

POSE_GRAPH.optimization_problem.ceres_solver_options.max_num_iterations = 10

POSE_GRAPH.constraint_builder.min_score = 0.62

POSE_GRAPH.constraint_builder.global_localization_min_score = 0.66

return options

其他参数,参考链接:

Lua configuration reference documentation — Cartographer ROS documentation

2D launch文件的配置

<launch>

 <!--加载机器人模型-->

  <param name="robot_description"

    textfile="$(find cartographer_ros)/urdf/myself_robot.urdf" />

 <!--发布tf-->

  <node name="robot_state_publisher" pkg="robot_state_publisher"

    type="robot_state_publisher" />

 <!--启动建图节点-->

  <node name="cartographer_node" pkg="cartographer_ros"

      type="cartographer_node" args="

          -configuration_directory

              $(find cartographer_ros)/configuration_files

          -configuration_basename myself_rslidar_2d.lua"

      output="screen">

 <!--重映射话题-->

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

  </node>

<!--启动RVIZ-->

  <node name="rviz" pkg="rviz" type="rviz" required="true"

      args="-d $(find cartographer_ros)/configuration_files/rslidar_2d.rviz" />

</launch>

2D pure location lua文件的配置

include "myself_rslidar_2d.lua"

TRAJECTORY_BUILDER.pure_localization = true

POSE_GRAPH.optimize_every_n_nodes = 20

--fast location

MAP_BUILDER.num_background_threads=8

POSE_GRAPH.constraint_builder.sampling_ratio=0.5*POSE_GRAPH.constraint_builder.sampling_ratio

POSE_GRAPH.global_sampling_ratio=0.1*POSE_GRAPH.global_sampling_ratio

POSE_GRAPH.max_num_final_iterations=1

return options

2D pure location launch文件的配置

<launch>

  <param name="/use_sim_time" value="false" />

<!--加载机器人模型-->

  <param name="robot_description"

    textfile="$(find cartographer_ros)/urdf/myself_robot.urdf" />

<!--发布tf-->

  <node name="robot_state_publisher" pkg="robot_state_publisher"

    type="robot_state_publisher" />

  <!--启动建图节点-->

  <node name="cartographer_node" pkg="cartographer_ros"

      type="cartographer_node" args="

          -configuration_directory $(find cartographer_ros)/configuration_files

          -configuration_basename myself_backpack_2d_localization.lua

          -load_state_filename /home/dcz/bag/map.pbstream"

      output="screen">

 <!--重映射话题-->

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

  </node>

 <!--需要注释下面所示文件的源码,然后重新编译-->

<!--cartographer_ros/cartographer_ros/occupancy_grid_node_main.cc //occupancy_grid_publisher_.publish(*msg_ptr); /-->

 <!--发布地图-->

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"

      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

<!--启动RVIZ-->

 <!--node name="rviz" pkg="rviz" type="rviz" required="true"

      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" /-->

</launch>

3D lua文件的配置

include "map_builder.lua"

include "trajectory_builder.lua"

options = {

  map_builder = MAP_BUILDER,

  trajectory_builder = TRAJECTORY_BUILDER,

  map_frame = "map",

  tracking_frame = "imu",

  published_frame = "base_link",

  odom_frame = "odom",

  provide_odom_frame = true,

  publish_frame_projected_to_2d = false,

  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.,

}

TRAJECTORY_BUILDER_3D.num_accumulated_range_data = 1

--change 当三维点云效果不好时使用离线建图方法,这里为离线建图需要调整的参数

TRAJECTORY_BUILDER_3D.min_range = 0.2

TRAJECTORY_BUILDER_3D.max_range = 30.

--need try

--TRAJECTORY_BUILDER_2D.min_z = 0.1

--TRAJECTORY_BUILDER_2D.max_z = 1.0

MAP_BUILDER.use_trajectory_builder_3d = true

MAP_BUILDER.num_background_threads = 7

POSE_GRAPH.optimization_problem.huber_scale = 5e2

POSE_GRAPH.optimize_every_n_nodes = 320

POSE_GRAPH.constraint_builder.sampling_ratio = 0.03

POSE_GRAPH.optimization_problem.ceres_solver_options.max_num_iterations = 10

POSE_GRAPH.constraint_builder.min_score = 0.62

POSE_GRAPH.constraint_builder.global_localization_min_score = 0.66

return options

3D launch文件的配置

<launch>

 <!--加载机器人模型-->

  <param name="robot_description"

    textfile="$(find cartographer_ros)/urdf/myself_robot.urdf" />

<!--发布tf-->

  <node name="robot_state_publisher" pkg="robot_state_publisher"

    type="robot_state_publisher" />

  <!--启动建图节点-->

  <node name="cartographer_node" pkg="cartographer_ros"

      type="cartographer_node" args="

          -configuration_directory

              $(find cartographer_ros)/configuration_files

          -configuration_basename myself_rslidar_3d.lua"

      output="screen">

    <!--重映射话题-->

      <!--remap from="/odom" to="/odom" /-->

      <!--remap from="/imu" to="/imu" /-->

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

  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"

      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

<!--启动RVIZ-->

  <node name="rviz" pkg="rviz" type="rviz" required="true"

      args="-d $(find cartographer_ros)/configuration_files/demo_3d.rviz" />

3D pure location lua文件的配置

include "myself_rslidar_3d.lua"

TRAJECTORY_BUILDER.pure_localization = true

POSE_GRAPH.optimize_every_n_nodes = 100

return options

3D pure location launch文件的配置

<launch>

 <!--加载机器人模型-->

  <param name="/use_sim_time" value="false" />

  <param name="robot_description"

    textfile="$(find cartographer_ros)/urdf/myself_robot.urdf" />

<!--发布tf-->

  <node name="robot_state_publisher" pkg="robot_state_publisher"

    type="robot_state_publisher" />

  <!--启动定位节点-->

  <node name="cartographer_node" pkg="cartographer_ros"

      type="cartographer_node" args="

          -configuration_directory $(find cartographer_ros)/configuration_files

          -configuration_basename myself_backpack_3d_localization.lua

          -load_state_filename $(arg load_state_filename)"

      output="screen">

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

    <!--remap from="/imu" to="/your_imu_topic" /-->

  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"

      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

<!--启动RVIZ-->

  <node name="rviz" pkg="rviz" type="rviz" required="true"

      args="-d $(find cartographer_ros)/configuration_files/demo_3d.rviz" />

</launch>

Assets writer 3D lua文件的配置

VOXEL_SIZE = 5e-2

include "transform.lua"

options = {

  tracking_frame = "imu", #imu坐标系

  pipeline = {

    {

      action = "min_max_range_filter",

      min_range = 1.,

      max_range = 20.,

    },

    {

      action = "dump_num_points",

    },

    {

      action = "fixed_ratio_sampler",

      sampling_ratio = 0.01,

    },

    {

      action = "write_ply",

      filename = "points.ply"

    },

    -- Gray X-Rays. These only use geometry to color pixels.

   

  

    -- Now we recolor our points by frame and write another batch of X-Rays. It

    -- is visible in them what was seen by the horizontal and the vertical

    -- laser.

    {

      action = "color_points",

      frame_id = "rslidar",#雷达坐标系

      color = { 255., 0., 0. },

    },

    {

      action = "write_xray_image",

      voxel_size = VOXEL_SIZE,

      filename = "xray_xy_all_color",

      transform = XY_TRANSFORM,

    },

  }

}

return options

Assets writer 3D launch文件的配置

<launch>

  <node name="cartographer_assets_writer" pkg="cartographer_ros" required="true"

      type="cartographer_assets_writer" args="

          -configuration_directory $(find cartographer_ros)/configuration_files

          -configuration_basename assets_writer_myself_3d.lua

          -urdf_filename $(find cartographer_ros)/urdf/myself_robot.urdf

          -bag_filenames $(arg bag_filenames)

          -pose_graph_filename $(arg pose_graph_filename)"

      output="screen">

  </node>

</launch>

  • 建图命令

#SLAM

启动雷达点云

$>>  roslaunch rslidar_pointcloud cloud_nodelet.launch

启动Cartographer建图

$>>  roslaunch cartographer_ros myself_rslidar_2d.launch

Or

$>>  roslaunch cartographer_ros myself_rslidar_3d.launch

Tips:纯定位需要修改源码,所以如果建图前请确保,src/cartographer_ros/cartographer_ros/cartographer_ros/occupancy_grid_node.main.cc中main函数上面第五行是否注释了

occupancy_grid_publisher_.publish(*msg);

纯定位注释掉,建图时打开,然后执行catkin_make,再执行建图或者定位。

3d建图需要先发布imu ,并且需要rosbag保存点云和imu消息:

$>>  rosrun imu_pub imu_pub_node

$>>  rosbag record /imu /rslidar_points

结束建图

$>>  rosservice call /finish_trajectory 0

保存地图,在~/.ros目录下

$>>  rosservice call /write_state  “filenames: ’map.pbstream’”

拷贝出地图转化地图到ros使用的栅格地图yaml文件,使用绝对路径

rosrun cartographer_ros cartographer_pbstream_to_ros_map -pbstream_filename=<pbstream_file_path> -map_filestem=<map_file_path> -resolution=0.05

3d点云地图转化与查看

地图格式Bag转ply

$>>  roslaunch cartographer_ros assert_writer_myself_3d.launch bag_filenames:=~/bag_path/2020.....bag.bag  pose_graph_filename:=~/pbstream_path/map.pbstream

地图格式Ply转pcd

$>>  pcl_ply2pcd your.bag_points.ply your_pcd_filename.pcd

查看点云

$>>  pcl_viewer your_pcd_filename.pcd

如果效果不好,使用offline_myself_rslidar_3d.launch重新建图,记得更改launch加载的bag文件路径,如果不满意,修改myself_rslidar_3d.lua文件的TRAJECTORY_BUILD_3D.max_range的大小,建议区间在30-80,之至点云图满意收敛。

  • 纯定位命令

命令:

$>>  roslaunch cartographe_ros myself_backpack_2(3)d_localization.launch

根据实际情况加载load_state_filename,如果未显示rviz,请查看launch文件是否注释了rviz的显示。

  • 导航文件配置

安装导航功能包

$>>  sudo apt-get install ros-kinect-navigation

导航包主要是launch文件加cost_map、planner参数配置文件。

 launch文件的配置

<launch>  

  <!-- map server 提供地图-->

    <arg name="map" default="/home/dcz/bag/map.yaml" />

    <node name="map_server" pkg="map_server" type="map_server" args="$(arg map)"/>

<!-- map server 重映射话题名和坐标系-->

  <arg name="odom_frame_id"   default="odom"/>

  <arg name="base_frame_id"    default="base_link"/>

  <arg name="global_frame_id"   default="map"/>

  <arg name="odom_topic"       default="odom" />

  <arg name="laser_topic"        default="scan" />

<!-- 静态坐标-->

<node pkg="tf" type="static_transform_publisher" name="map_odom_broadcaster" args="0 0 0 0 0 0 /map /odom 100" />

<!-- 加载cost_map 和 planner,分为local 和 global-->

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">

    <rosparam file="$(find navigation)/config/param/costmap_common_params.yaml" command="load" ns="global_costmap" />

    <rosparam file="$(find navigation)/config/param/costmap_common_params.yaml" command="load" ns="local_costmap" />   

    <rosparam file="$(find navigation)/config/param/local_costmap_params.yaml" command="load" />   

    <rosparam file="$(find navigation)/config/param/global_costmap_params.yaml" command="load" />

    <rosparam file="$(find navigation)/config/param/dwa_local_planner_params.yaml" command="load" />

    <rosparam file="$(find navigation)/config/param/move_base_params.yaml" command="load" />

    <rosparam file="$(find navigation)/config/param/global_planner_params.yaml" command="load" />

    <rosparam file="$(find navigation)/config/param/navfn_global_planner_params.yaml" command="load" />

    

    <!-- reset frame_id parameters using user input data -->

    <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>

    <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>

    <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>

    <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>

    <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

    <remap from="odom" to="$(arg odom_topic)"/>

    <remap from="scan" to="$(arg laser_topic)"/>

    <!--remap from="cmd_vel" to="/cmd_vel_mux/input/navi"/-->

</node>

 <!--调用rviz -->

 <!--node pkg="rviz" type="rviz" name="rviz" args="-d $(find navigation)/rviz/nav.rviz"/-->

</launch>

move_base_params.yaml文件参数

# Move base node parameters. For full documentation of the parameters in this file, please see

#

#  http://www.ros.org/wiki/move_base

#

#启用costmap

shutdown_costmaps: false

#设置控制频率

controller_frequency: 5.0

controller_patience: 3.0

planner_frequency: 1.0

planner_patience: 5.0

oscillation_timeout: 10.0

oscillation_distance: 0.2

#选择使用dwa local planner和navfn global planner

# local planner - default is trajectory rollout

base_local_planner: "dwa_local_planner/DWAPlannerROS"

base_global_planner: "navfn/NavfnROS" #alternatives: global_planner/GlobalPlanner, carrot_planner/CarrotPlanner

#这里定义恢复行为,当机器人震荡时,会按顺序进行恢复行为,清除障碍物,这里注释了使用默认的恢复行为。

#We plan to integrate recovery behaviors for turtlebot but currently those belong to gopher and still have to be adapted.

## recovery behaviors; we avoid spinning, but we need a fall-back replanning

#recovery_behavior_enabled: true

#recovery_behaviors:

  #- name: 'super_conservative_reset1'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'conservative_reset1'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'aggressive_reset1'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'clearing_rotation1'

    #type: 'rotate_recovery/RotateRecovery'

  #- name: 'super_conservative_reset2'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'conservative_reset2'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'aggressive_reset2'

    #type: 'clear_costmap_recovery/ClearCostmapRecovery'

  #- name: 'clearing_rotation2'

    #type: 'rotate_recovery/RotateRecovery'

#super_conservative_reset1:

  #reset_distance: 3.0

#conservative_reset1:

  #reset_distance: 1.5

#aggressive_reset1:

  #reset_distance: 0.0

#super_conservative_reset2:

  #reset_distance: 3.0

#conservative_reset2:

  #reset_distance: 1.5

#aggressive_reset2:

  #reset_distance: 0.0

costmap_common_params.yaml文件参数

max_obstacle_height: 1.40 # assume something like an arm is mounted on top of the robot

# Obstacle Cost Shaping (http://wiki.ros.org/costmap_2d/hydro/inflation)

#设置机器人半径或者底盘轮廓四个点

robot_radius: 0.25  # distance a circular robot should be clear of the obstacle (kobuki: 0.18)

# footprint: [[x0, y0], [x1, y1], ... [xn, yn]]  # if the robot is not circular

map_type: voxel

voxel_layer:

  enabled: true

  max_obstacle_height:  2.2

  origin_z:             0.0

  z_resolution:         0.1

  z_voxels:             22

  unknown_threshold:    15

  mark_threshold:       0

  combination_method:   1

  track_unknown_space:  true    #true needed for disabling global path planning through unknown space

  obstacle_range: 2.5

  raytrace_range: 3.0

  publish_voxel_map: true

  observation_sources: bump   #camera scan bump

#设置检测障碍物的信息源

#  scan:

#    data_type: LaserScan

#    topic: scan

#    marking: true

#    clearing: true

#    min_obstacle_height: 0.1

#    max_obstacle_height: 0.3

#  camera:

#    data_type: PointCloud2

#    topic: camera/depth/points

#    marking: true

#    clearing: true

#    min_obstacle_height: 0.0

#    max_obstacle_height: 2.0

  bump:

     data_type: PointCloud2 #信息源的类型

     topic: /rslidar_points #信息源话题

     marking: true

     clearing: true

     min_obstacle_height: 0.0

     max_obstacle_height: 0.15

  

#cost_scaling_factor and inflation_radius were now moved to the inflation_layer ns

inflation_layer:

  enabled:              true

  cost_scaling_factor:  2.58  # exponential rate at which the obstacle cost drops off (default: 10)

#设置障碍物膨胀半径

  inflation_radius:     0.5  # max. distance from an obstacle at which costs are incurred for planning paths.

static_layer:

  enabled:     true

  

local_costmap_params.yaml  文件参数

 local_costmap:

   global_frame: odom  #/map

   robot_base_frame: base_link

   update_frequency: 3.0 #5.0

   publish_frequency: 2.0

   static_map: false #false

#局部cost_map采用滑动窗口,进行膨胀

   rolling_window: true

   width: 4.0

   height: 4.0

   resolution: 0.05

   origin_x: 5.0

   origin_y: 0

   transform_tolerance: 0.5

   plugins:

    - {name: voxel_layer,      type: "costmap_2d::VoxelLayer"}

    - {name: inflation_layer,     type: "costmap_2d::InflationLayer"}

global_costmap_params.yaml文件参数

 global_costmap:

   global_frame: map

   robot_base_frame: base_link

   update_frequency: 2.0

   publish_frequency: 0.5

   static_map: true

   rolling_window: false

   transform_tolerance: 0.5

   plugins:

     - {name: static_layer,            type: "costmap_2d::StaticLayer"}

     - {name: voxel_layer,             type: "costmap_2d::VoxelLayer"}

     - {name: inflation_layer,         type: "costmap_2d::InflationLayer"}

dwa_local_planner_params.yaml文件参数

  

DWAPlannerROS:

#设置机器人的速度和旋转速度

# Robot Configuration Parameters

  max_vel_x: 0.5

  min_vel_x: 0.0

  max_vel_y: 0.0

  min_vel_y: 0.0

  # The velocity when robot is moving in a straight line

  max_trans_vel:  0.55

  min_trans_vel:  0.1

  trans_stopped_vel: 0.1

  max_rot_vel: 5.0

  min_rot_vel: 0.8

  rot_stopped_vel: 0.8

  acc_lim_x: 1.0

  acc_lim_theta: 2.0

  acc_lim_y: 0.0

#目标点误差,如果过小会导致机器人在目标点震荡 单位为米和弧度

# Goal Tolerance Parametes

  yaw_goal_tolerance: 0.3

  xy_goal_tolerance: 0.15

  # latch_xy_goal_tolerance: false

# Forward Simulation Parameters

  sim_time: 4.0

  vx_samples: 20

  vy_samples: 0

  vtheta_samples: 40

# Trajectory Scoring Parameters

  path_distance_bias: 32.0

  goal_distance_bias: 24.0

  occdist_scale: 0.1

  forward_point_distance: 0.325

  stop_time_buffer: 0.2

  scaling_speed: 0.25

  max_scaling_factor: 0.2

# Oscillation Prevention Parameters

  oscillation_reset_dist: 0.05

# Debugging

  publish_traj_pc : true

  publish_cost_grid_pc: true

  global_frame_id: odom

navfn_global_planner_params.yaml文件参数

NavfnROS:

  visualize_potential: false    #Publish potential for rviz as pointcloud2, not really helpful, default false

  allow_unknown: true          #Specifies whether or not to allow navfn to create plans that traverse unknown space, default true

                                #Needs to have track_unknown_space: true in the obstacle / voxel layer (in costmap_commons_param) to work

  planner_window_x: 0.0         #Specifies the x size of an optional window to restrict the planner to, default 0.0

  planner_window_y: 0.0         #Specifies the y size of an optional window to restrict the planner to, default 0.0

  

  default_tolerance: 0.0        #If the goal is in an obstacle, the planer will plan to the nearest point in the radius of default_tolerance, default 0.0

                                #The area is always searched, so could be slow for big values

  • 导航命令

采用Cartographer定位和navegation stack中的move_base导航。

命令:

$>>  roslaunch rslidar_pointcloud cloud_nodelet.launch

$>>  roslaunch cartographe_ros myself_backpack_2d_localization.launch

$>>  roslaunch navigation zky_move_base.launch

$>>  rosrun cmd_to_stm cmd_to_stm

然后使用RVIZ中的2D navigation goal 选择图中的一点,可以在终端 rostopic echo /simple/goal 查看。选中的点是相对机器人坐标,非全局坐标。下面的设置自定义导航点时需要注意。

  • 发送目标点的导航路线规划

规定好路径点和达到目标点时的位姿,输入在源代码的数组中,前三位表示xyz的平移,后四位表示到达目标点时的位姿,0 0 0 1,表示不改变方向,0 0 1 0,表示180°方向,0 0 0.707 0.707 表示90°,0 0 -0.707 0.707表示270°,逆时针方向为正。

规划好目标点,程序依次喂入目标点,实现路线规划导航。

导航命令基础上运行,命令:

$>>  rosrun simple_navigation_goal simple_navigation_goal

  • 导航探索SLAM

启动雷达和建图

$>>  roslaunch rslidar_pointcloud cloud_nodelet.launch

启动建图,

(Cartographer存在问题,如何发步ros格式的map)暂时以hector SLAM作为建图

$>>  roslaunch pointcloud_to_laserscan point_to_scan.launch

$>>  roslaunch navigation hector.launch

启动导航

$>>  roslaunch navigation zky_move_base.launch

$>>  rosrun cmd_to_stm cmd_to_stm

启动目标点(更改目标点列表元素,适应场景)

$>>  rosrun navigation explor_slam.py

  • 其余功能包说明
  1. imu_pub

   根据imu通讯协议,读取imu的xyz加速度和四元数,发布/imu消息。

  1. odom_pub(未用到)

根据编码器数据或cmd_vel发布/odom

  1. cmd_vel_to_stm

$>>  rosrun cmd_vel_to_stm cmd_to_stm

程序通过监听/cmd_vel话题,将速度信息发送给下位机

$>>  rosrun cmd_vel_to_stm robot_teleop.py

程序通过键盘发布cmd_vel,配合上面的对机器人进行键盘遥控。

  1. pointcloud_to_laserscan

参数设置请参照wiki.ros.org/pointcloud_to_laserscan

$>>  roslaunch pointcloud_to_laserscan point_to_scan.launch

其中重映射了cloud_in->rslidar_points

发布/scan话题

  • 相关博客推荐

ROS移动机器人基于RRT(快速探索随机树)算法 rrt_exploration实现真实机器人自主探索建图: ROS移动机器人基于RRT(快速探索随机树)算法 rrt_exploration实现真实机器人自主探索建图_pd很不专业的博客-CSDN博客_ros rrt

PIBOT导航机器人:  PIBOT导航机器人 - 简书

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

基于Cartographer的建图与导航 的相关文章

  • ROS tf工具与消息查看命令

    TF工具坐标系统是一个基础理论 xff0c 但是涉及到多个空间的变换 xff0c 不容易进行想象所以TF工具给开发者调试提供很多方便 1 tf monitor xff1a 将当前的坐标系转换关系打印到终端控制台 rosrun tf tf m
  • melodic 打开gazebo出现[Err] [REST.cc:205] Error in REST request错误解决方法

    ROS melodic版本下打开gazebo出现 Err REST cc 205 Error in REST request错误解决方法 输入以下命令打开文件 sudo gedit ignition fuel config yaml 然后将
  • 技术资源汇总(一)

    1 Ubuntu技术论坛 xff1a https askubuntu com 2 树莓派资源 https www yahboom com study raspberry3B 密码 xff1a cf0p 汇总资料提取码 xff1a hdy7
  • docker常用命令

    1 配置docker阿里云镜像 1 打开daemon json文件 xff08 若没有此文件 xff0c 则创建 etc docker daemon json xff09 xff1a vi etc docker daemon json 2
  • 网络调试助手UDP广播问题

    用直接广播地址 xff08 192 168 xxx 255 端口 xff09 可以进行广播 xff1b 用受限广播地址 xff08 255 255 255 255 端口 xff09 显示没有指定有效的远程主机端口 xff0c 搞了好久发现是
  • “平衡小车之家”家的STM32F103最小系统源代码分享

    在网上寻找了好久 xff0c 因为他家的开发板自带有mpu6050模块 故想测试其精准度以及z轴漂移程度 发现也有很大的漂移 代码如下 main c部分 xff1a span class token macro property span
  • 使用PMW3901和VL53L1X 实现室内定点悬停

    使用PMW3901和VL53L1X 实现室内定点悬停 使用PMW3901 光流传感器进行水平方向定位Pixhawk连接PMW3901传感器PX4源代码加入PMW3901驱动后重新编译QGroundControl中的配置 使用气压计和VL53
  • 使用 QGroundControl 地面站更新 PixHawk飞控的Bootloader

    安装最新版本的PX4固件 启动QGroundControl并且使用USB连接到Pixhawk飞控 选择 Q icon gt Vehicle Setup gt Firmware sidebar 打开固件设置 安装最新版本的PX4固件 更新Bo
  • 自制DIY 机器狗 完全教程 - MIT猎豹Cheetah

    自制DIY 机器狗 完全教程 MIT猎豹Cheetah 背景结构设计模块化关节电机性能考虑关节结构 四足平台设计腿部设计身体设计脚部设计 硬件设计关节驱动器通信总线板供电系统 控制系统人工智能 背景 3年前 xff0c MIT开源了世界上跑
  • centos安装wxWidgets,erlang,RabbitMq

    centos安装wxWidgets erlang RabbitMq 默认已经安装了java环境 而安装RabbitMq需要安装erlang xff0c 安装erlang又需要安装wxWidgets 安装wxWidgets 更新系统 yum
  • 2.rabbitmq概述和helloworld

    rabbitmq概述 rabbitmq中的几个概念 BROKER 接收和分发消息的应用 xff0c RabbitMQ Server 就是 Message Broker Virtual Host 出于多租户和安全因素设计的 xff0c 把 A
  • 3.rabbitmq轮询和不公平分发

    rabbitmq轮询和不公平分发 rabbitmq轮询分发 rabbitmq默认是使用轮询来分发消息的 测试代码如下所示 生产者代码 span class token comment 生产者 task rabbitmq 轮询演示 span
  • 4.rabbitmq消息应答

    rabbitmq消息应答 概述 消息应答就是消费者在收到消息的时候 xff0c 在它接收到消息并处理完毕之后 xff0c 告诉rabbitmq它已经处理完了 xff0c rabbitmq可以删除这个消息了 消息应答的方式 channel b
  • 5.rabbitmq持久化

    rabbitmq持久化 队列的持久化 队列的持久化需要我们在声明的时候指定其持久化 使用durable 61 true来持久化队列 span class token comment 队列的持久化 span span class token
  • 关于双控阵列的实现原理的讨论

    xfeff xfeff http bbs chinaunix net forum viewthread tid 4140392 html 对于一个支持FC SAN的双控存储阵列 xff0c 对外号称active active xff0c 实
  • 6.rabbitmq中exchange的几种形式

    rabbitmq中exchange的几种形式 RabbitMQ 消息传递模型的核心思想是 生产者生产的消息从不会直接发送到队列 实际上 xff0c 通常生产 者甚至都不知道这些消息传递传递到了哪些队列中 相反 xff0c 生产者只能将消息发
  • 7.rabbitmq死信和死信队列

    rabbitmq死信和死信队列 概述 先从概念解释上搞清楚这个定义 xff0c 死信 xff0c 顾名思义就是无法被消费的消息 xff0c 字面意思可以这样理 解 xff0c 一般来说 xff0c producer 将消息投递到 broke
  • 8.rabbitmq发布确认

    rabbitmq发布确认 生产者将信道设置成 confirm 模式 xff0c 一旦信道进入 confirm 模式 xff0c 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID 从 1 开始 xff0c 一旦消息被投递到所有匹配的队
  • 9.延迟队列

    延迟队列 延迟队列的概念 延时队列 队列内部是有序的 xff0c 最重要的特性就体现在它的延时属性上 xff0c 延时队列中的元素是希望 在指定时间到了以后或之前取出和处理 xff0c 简单来说 xff0c 延时队列就是用来存放需要在指定时
  • 10.回退消息

    rabbitmq回退消息 mandatory参数 在仅开启了生产者确认机制的情况下 xff0c 交换机接收到消息后 xff0c 会直接给消息生产者发送确认消息 xff0c 如果发现该消息不可路由 xff0c 那么消息会被直接丢弃 xff0c

随机推荐

  • 11.备份交换机

    备份交换机 概念 当交换机收到一条不可路由消息时 xff0c 将会把这条消息转发到备份交换机中 xff0c 由备份交换机来进行转发和处理 xff0c 通常备份交换机的类型为fanout xff0c 这样就能把所有消息都投递到与其绑定的队列中
  • 12.优先级队列和惰性队列

    优先级队列 如何添加优先级 选择Maximum priority xff0c 指定优先级的数值 xff0c 设定范围为0 255 xff0c 如果值为10 xff0c 那么就是0 10 xff0c 最大不能超过255 代码形式 span c
  • 13.rabbitmq集群搭建

    rabbitmq集群搭建和镜像队列 集群搭建 准备三台服务器 172 16 140 133 Jan172 16 140 132 Feb172 16 140 133 Mar 修改3台机器的hosts文件 span class token fu
  • 14.haproxy+keepalived负载均衡和高可用

    haproxy 43 keepalived负载均衡和高可用 概述 多个rabbitmq服务形成集群 xff0c 由haproxy来做负载均衡 xff0c haproxy会暴露出来一个端口 xff0c 客户端可以通过haproxy所在的服务器
  • 15.federation

    federation和shovel federation exchange 问题的由来 xff1a 城市A有rabbitmqA xff0c 城市B有rabbitmqB xff0c 当城市B的应用要发消息到exchangeA的时候 xff0c
  • vue瀑布流插件vue-waterfall-easy 2.x

    不知道大家都是怎么用瀑布流的 xff0c 一开始尝试用flex布局失败 xff0c 后面找到了这个组件 xff0c 还是挺好用的 xff0c 记录一下 首先是用npm安装npm install vue waterfall easy save
  • 1.JUL

    JUL JUL全称Java util Logging是java原生的日志框架 xff0c 使用时不需要另外引用第三方类库 xff0c 相对其他日志框架使用方便 xff0c 学习简单 xff0c 能够在小型应用中灵活使用 架构介绍 Logge
  • Log4j2

    Log4j2 目前市面上最主流的日志门面就是SLF4J xff0c 虽然Log4j2也是日志门面 xff0c 因为它的日志实现功能非常强 大 xff0c 性能优越 所以大家一般还是将Log4j2看作是日志的实现 xff0c Slf4j 43
  • LOG4J

    LOG4J Log4j是Apache下的一款开源的日志框架 xff0c 通过在项目中使用 Log4J xff0c 我们可以控制日志信息输出到控 制台 文件 甚至是数据库中 我们可以控制每一条日志的输出格式 xff0c 通过定义日志的输出级别
  • Slf4j(门面)

    Slf4j 简单日志门面 Simple Logging Facade For Java SLF4J主要是为了给Java日志访问提供一套标准 规范 的API框架 xff0c 其主要意义在于提供接口 xff0c 具体的实现可以交由其他日志框架
  • Logback

    Logback Logback是由log4j创始人设计的另一个开源日志组件 xff0c 性能比log4j要好 官方网站 https logback qos ch index html Logback主要分为三个模块 logback core
  • 嵌入式-C语言常见面试/笔试题

    1 关键字类型题 常见的关键字有 sizeof static const volatile 1 sizeof xff1a 通常与strlen做比较不同 例1 xff1a char str 61 Hello char p 61 str int
  • node.js的http模块输出request参数

    xff08 只作为本人自己记录所用 xff0c 参考需谨慎 xff09 ServerResponse 服务响应 domain null 域名 events finish Function resOnFinish 项目 eventsCount
  • ATI F/T Gamma sensor( 力和力矩传感器 ) 开箱测评 + 使用说明

    型号和序列号等参数如下 xff1a Description Six Axis Force Torque Sensor Manufacturer ATI Industrial Automation Serial Number FT29352
  • 阿克曼转向原理解析

    汽车的转向过程就是阿克曼转向 其也是移动机器人的一种运动模式之一 阿克曼基本原理 xff1a 汽车在行驶过程中 xff08 直线和转弯时候 xff09 xff0c 每个车轮的运动估计必须符合他的自然运动轨迹 xff0c 从而保证轮胎与地面始
  • 通过ROS控制真实机械臂(18) --- 构建 octocmap 用于碰撞检测和避障

    师兄和同门在做SLAM的时候 xff0c 经常会用到的 octomap xff0c 也就是八叉树地图 octomap相比于点云地图来说大大减小了地图的存储空间 既然octomap可以用于导航和避障 xff0c 那么自然也可以导入moveit
  • 【实用版】卡尔曼滤波及其扩展方法的区别与定位系统中的应用

    卡尔曼滤波及其扩展方法的区别与定位系统中的应用 卡尔曼滤波卡尔曼滤波的扩展EKFSPKFEnKF 定位系统中的应用 源自于学校课题 xff0c 主要用卡尔曼滤波KF及其扩展方法 xff08 包括扩展卡尔曼滤波EKF Sigma点卡尔曼滤波S
  • CP2102 USB to UART Bridge Controller 驱动安装(windows or Ubuntu)

    CP2102是一款USB转TTL电平的USB转串口芯片 xff0c 使用时发现诸多小网站上的驱动不是病毒就是安装后无效 xff0c 经同事推荐去官网下载后成功连接 官网地址 xff1a https www silabs com produc
  • 解决罗技GHUB 安装 一直初始化 下载不了问题

    罗技的GHUB在安装时一直处于初始化状态 xff0c 可以通过修改时间解决 原地址 罗技 GHub 解决初始化无法安装教程 侵删
  • 基于Cartographer的建图与导航

    一 RoboSense 16线雷达驱动安装 2 二 Cartographer的安装 2 三 配置文件结构说明 4 四 配置文件详解 4 2D lua文件的配置 5 2D launch文件的配置 6 2D pure location lua文