自学ROS完成智能小车路径规划(二)--完成建图

本文介绍了如何在Gazebo环境中使用Cartographer创建地图,包括创建功能包、配置传感器、启动节点、实时建图并可视化。步骤包括安装Cartographer、配置lidar_info.lua、启动小车建图,以及保存和优化地图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建建图功能包

cd xunfei_path_planning/src		   //打开该路径终端

catkin_create_pkg gazebo_map      //功能包创建完毕

cd ..

catkin_make                                      //编译功能包

在这里插入图片描述

在gazebo_map文件夹下创建cfg,launch,map,rviz,srcipts五个文件

cd ~/xunfei_path_planning/src/gazebo_map/
mkdir cfg launch map rviz scripts

cfg文件夹--------存储传感器与算法配置文件
launch文件夹—存储节点启动文件
map---------------存储建图完成后的图片和配置文件(yaml)
rviz----------------存储rviz可视化模型
scripts----------- 存储小车运动导航工具文件

利用cartographer建图

安装cartographer

sudo apt-get install ros-melodic-cartographer-ros

在gazebo_map/launch中创建cartographer_demo.launch文件

<launch>
  <param name="/use_sim_time" value="true" />

  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find gazebo_map)/cfg
          -configuration_basename revo_lds.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" />

 <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find gazebo_map)/cfg/demo.rviz" />

</launch>

在gazebo_map/cfg中创建lidar_info.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",                            --一般为“map”.用来发布submap的ROS帧ID.
  tracking_frame = "base_link",                 --SLAM算法要跟踪的ROS 帧ID
	published_frame = "base_link",                --用来发布pose的帧ID
  odom_frame = "odom",                          --只要当有里程计信息的时候才会使用。即provide_odom_frame=true
  provide_odom_frame = true,                    --如果为true,the local, non-loop-closed, continuous pose将会在map_frame里以odom_frame发布
  publish_frame_projected_to_2d = false,        --如果为true,则已经发布的pose将会被完全成2D的pose,没有roll,pitch或者z-offset
  use_odometry = true,                          --如果为true,需要提供里程计信息,并话题/odom会订阅nav_msgs/Odometry类型的消息,在SLAM过程中也会使用这个消息进行建图
  use_nav_sat = false,                          --如果为true,会在话题/fix上订阅sensor_msgs/NavSatFix类型的消息,并且在globalSLAM中会用到
  use_landmarks = false,                        --如果为true,会在话题/landmarks上订阅cartographer_ros_msgs/LandmarkList类型的消息,并且在SLAM过程中会用到
  num_laser_scans = 1,                          --SLAM可以输入的/scan话题数目的最大值
  num_multi_echo_laser_scans = 0,               --SLAM可以输入sensor_msgs/MultiEchoLaserScan话题数目的最大值
  num_subdivisions_per_laser_scan = 1,          --将每个接收到的(multi_echo)激光scan分割成的点云数。 细分scam可以在扫描仪移动时取消scanner获取的scan。 
                                                --有一个相应的trajectory builder option可将细分扫描累积到将用于scan_matching的点云中
  num_point_clouds = 0,                         --SLAM可以输入的sensor_msgs/PointCloud2话题数目的最大值
  lookup_transform_timeout_sec = 0.2,           --使用tf2查找transform的超时时间(秒)
  submap_publish_period_sec = 0.3,              --发布submap的时间间隔(秒)
  pose_publish_period_sec = 5e-3,               --发布pose的时间间隔,值为5e-3的时候为200HZ
  trajectory_publish_period_sec = 30e-3,        --发布trajectory markers(trajectory的节点)的时间间隔,值为30e-3为30ms
  rangefinder_sampling_ratio = 1.,              --测距仪的固定采样ratio
  odometry_sampling_ratio = 0.1,                --里程计的固定采样ratio
  fixed_frame_pose_sampling_ratio = 1.,         --****采样频率
  imu_sampling_ratio = 1.,                      --IMU message的固定采样ratio
  landmarks_sampling_ratio = 1.,                --landmarks message的固定采样ratio
}   

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

启动小车建图

roslaunch gazebo_pkg race.launch

roslaunch gazebo_map cartographer_demo.launch

执行第二条代码时若遇到cartographer包没有安装现象,执行命令

sudo apt-get install ros-melodic-cartographer*

等待安装完毕(若其中还遇到其他功能包缺失现象按照error提示安装即可),重新执行三条指令。
rviz启动后点击左下角add
在topic中选择laserscan, map
在display中选择robotmodel
添加完毕后,点击左上角file—>save config as 文件命名为demo.rviz存储在gazebo_map/rviz目录下

roslaunch gazebo_pkg race.launch

roslaunch gazebo_map cartographer_demo.launch

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

控制小车跑一圈地图,实现建图完成

保存地图

rosrun map_server map_saver -f race

若所建地图不够好,请自行调整阈值参数。–occ为无法通行的阈值,–free为可通行的阈值。

若–occ过高,则可能出现墙体边缘出现灰色未探索地块;若–occ过低,则无墙体部分可能会被凭空建墙。

若–free过高,则可能出现墙体被认为是自由区域;若–free过低,则自由区域可能出现灰色未探索地块。

以上情况皆可能影响定位效果,请选手们核对所建地图中墙体(黑)、自由区域(白)、未探索区域(灰)是否正确,若不正确,请自行调整阈值重新建图。

rosrun map_server map_saver --occ 70 --free 30 -f mapname

若无法执行则是map_server没有安装,执行

sudo apt-get install ros-melodic-map-server
source ~/.bashrc

重启终端,执行保存建图指令完成建图,保存的地图(xxx.pgm与xxx.yaml文件)一般是保存在根目录下,手动移动至gazebo_map/map目录下,完成建图操作。
建图如下
在这里插入图片描述

### ROS小车路径规划与导航算法实现 #### 全局路径规划算法 在ROS环境中,全局路径规划通常采用搜索方法来寻找从起始位置到目标位置的最佳路径。两种常用的全局路径规划算法分别是Dijkstra算法和A*算法。 - **Dijkstra算法** Dijkstra算法是一种经典的单源最短路径算法,适用于加权无向或有向。此算法通过逐步扩展距离最近的节点并更新相邻节点的距离来进行工作。尽管能够找到最优解,但由于其需要探索每一个可能到达的位置,在大规模地上效率较低[^3]。 - **A* (A-Star) 算法** A* 是一种启发式的搜索算法,它不仅考虑了实际成本(即当前点到下一个点的成本),还加入了估计成本(通常是曼哈顿距离或欧几里得距离)。这使得A*能够在更少的时间内找到接近最优甚至是最优的解决方案。因此,在许多情况下,A*比Dijkstra更快且更适合用于实时应用中[^1]。 ```python def a_star_search(graph, start, goal): frontier = PriorityQueue() frontier.put(start, 0) came_from = {} cost_so_far = {} came_from[start] = None cost_so_far[start] = 0 while not frontier.empty(): current = frontier.get() if current == goal: break for next in graph.neighbors(current): new_cost = cost_so_far[current] + graph.cost(current, next) if next not in cost_so_far or new_cost < cost_so_far[next]: cost_so_far[next] = new_cost priority = new_cost + heuristic(goal, next) frontier.put(next, priority) came_from[next] = current return came_from, cost_so_far ``` #### 局部路径规划算法 局部路径规划负责处理动态障碍物避障以及微调车辆轨迹以适应环境变化。常见的局部路径规划器包括: - **Dynamic Window Approach (DWA)** 动态窗口方法(DWA)是一个基于速度空间的方法,旨在快速响应周围环境的变化。该技术会预测未来一段时间内的运动状态,并从中挑选出既安全又能满足动力学约束的速度组合作为下一步行动方案。这种方法特别适合于高精度控制需求的应用场景下使用。 - **Timed-Elastic Band (TEB)** 时间弹性带(TEB)优化了一条给定的初始路径,使其更加平滑流畅的同时避开任何检测到的新出现的障碍物。这种策略允许机器人即使面对复杂多变的情况也能保持良好的行驶性能。此外,TEB还可以与其他类型的传感器数据相结合,进一步提高系统的鲁棒性和灵活性。 #### 自定义路径规划算法集成 对于希望引入特定领域知识或者实验新型路径规划逻辑的研究人员来说,可以通过修改`navigation`包下的相应模块来自定义路径规划行为。例如,一篇文献描述了一个案例研究,其中作者成功地将随机树状采样(RRT*)算法融入到了ROS框架之中。为了做到这一点,开发者们往往需要熟悉C++编程语言以及掌握如何编译和链接第三方库文件等技能[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值