slam小车实现——ROS篇:基于move_base和amcl实现导航功能

前篇回顾

在之前的一篇文章中(slam建图方法)我们已经实现了slam,并将地图保存在了/home/kiltto/develop/mapSave目录下,本次我们将利用这个地图实现定位和导航规划的功能(小车底层驱动还没实现好,暂时还开不了。。。)

move_base和amcl是干嘛的

1、move_base:负责完成全局路径规划和本地实时规划;

为什么需要两种规划方式?
因为单靠全局路径规划是无法克服小车在行进过程中多变的外部环境对行进路径的干扰的,有的时候因为障碍物的遮挡等原因,小车必须要重新规划路线,这个时候就需要本地实时规划功能。

2、amcl:一种自适应的蒙特卡罗定位方法,使用了粒子滤波器,在rviz调试的过程中可以看到粒子的分布状态,具体实现随着往后理解的深入再补充。

launch文件编写

参考《ROS机器人开发实践》中nav_demo的launch文件,把启动过程分为三个重要的步骤:加载地图、启动move_base节点、启动amcl节点

1,入口launch启动文件

<launch>

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

    <!-- 设置地图的配置文件 -->
    <arg name="map" default="test.yaml" />

    <!-- 运行地图服务器,并且加载设置的地图-->
    <node name="map_server" pkg="map_server" type="map_server" args="/home/kiltto/develop/mapSave/$(arg map)"/>

    <!-- 运行move_base节点 -->
    <include file="$(find mrobot_navigation)/launch/move_base.launch" />

    <!-- 启动AMCL节点 -->
    <include file="$(find mrobot_navigation)/launch/amcl.launch" />

    <!-- 设置一个/odom与/map之间的静态坐标变换 -->
    <node pkg="tf" type="static_transform_publisher" name="map_odom_broadcaster" args="0 0 0 0 0 0 /map /odom 100" />

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

</launch>

2,调用的move_base.launch

  • move_base启动过程需要配置代价地图(constmap)的相关参数:
    (1)通用配置文件:配置全局和本地的代价地图的通用配置;
    (2)全局规划配置文件(local_costmap_params.yaml):配置全局代价地图参数;
    (3)本地地图配置文件(global_costmap_params.yaml):配置本地代价地图参数;
  • 然后还需要配置本地规划器(base_local_planner_params.yaml)的配置参数,本地规划器是用来根据全局规划的路径计算发布给小车的速度控制指令(/cmd_vel)
<launch>

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
    
    <!-- 通用配置文件(全局) -->
    <rosparam file="$(find mrobot_navigation)/config/mrobot/costmap_common_params.yaml" command="load" ns="global_costmap" />
    
    <!-- 通用配置文件(本地) -->
	<rosparam file="$(find mrobot_navigation)/config/mrobot/costmap_common_params.yaml" command="load" ns="local_costmap" />
    
    <!-- 本地代价地图参数 -->
    <rosparam file="$(find mrobot_navigation)/config/mrobot/local_costmap_params.yaml" command="load" />
    
    <!-- 全局代价地图参数 -->
    <rosparam file="$(find mrobot_navigation)/config/mrobot/global_costmap_params.yaml" command="load" />
    
    <!-- 本地规划器 -->
    <rosparam file="$(find mrobot_navigation)/config/mrobot/base_local_planner_params.yaml" command="load" />
  </node>
  
</launch>

3,调用的amcl.launch

<launch>
    <arg name="use_map_topic" default="false"/>
    <arg name="scan_topic" default="scan"/>

    <node pkg="amcl" type="amcl" name="amcl" clear_params="true">
        <param name="use_map_topic" value="$(arg use_map_topic)"/>
        <!-- Publish scans from best pose at a max of 10 Hz -->
        <param name="odom_model_type" value="diff"/>
        <param name="odom_alpha5" value="0.1"/>
        <param name="gui_publish_rate" value="10.0"/>
        <param name="laser_max_beams" value="60"/>
        <param name="laser_max_range" value="12.0"/>
        <param name="min_particles" value="500"/>
        <param name="max_particles" value="2000"/>
        <param name="kld_err" value="0.05"/>
        <param name="kld_z" value="0.99"/>
        <param name="odom_alpha1" value="0.2"/>
        <param name="odom_alpha2" value="0.2"/>
        <!-- translation std dev, m -->
        <param name="odom_alpha3" value="0.2"/>
        <param name="odom_alpha4" value="0.2"/>
        <param name="laser_z_hit" value="0.5"/>
        <param name="laser_z_short" value="0.05"/>
        <param name="laser_z_max" value="0.05"/>
        <param name="laser_z_rand" value="0.5"/>
        <param name="laser_sigma_hit" value="0.2"/>
        <param name="laser_lambda_short" value="0.1"/>
        <param name="laser_model_type" value="likelihood_field"/>
        <!-- <param name="laser_model_type" value="beam"/> -->
        <param name="laser_likelihood_max_dist" value="2.0"/>
        <param name="update_min_d" value="0.25"/>
        <param name="update_min_a" value="0.2"/>
        <param name="odom_frame_id" value="odom"/>
        <param name="resample_interval" value="1"/>
        <!-- Increase tolerance because the computer can get quite busy -->
        <param name="transform_tolerance" value="1.0"/>
        <param name="recovery_alpha_slow" value="0.0"/>
        <param name="recovery_alpha_fast" value="0.0"/>
        <remap from="scan" to="$(arg scan_topic)"/>
    </node>
</launch>

开始(模拟:假设小车没在运动)

1、模拟发布odom

rostopic pub -r 10 /odom nav_msgs/Odometry '{pose: {pose: {position: {x: 0, y: 0, z: 0}, orientation: {x: 0, y: 0, z: 0, w: 0}}}, twist: {twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}}'

2、模拟发布cmd_vel

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x:, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'

3、发布tf:

1、base_link:机器人位置为原点的坐标系
2、odom:里程计安装位置为原点的坐标系
3、map:地图坐标系

由于我们使用了amcl,因此tf树必须满足:bask_link—>odom—>map,如图所示
在这里插入图片描述
4、启动launch脚本

roslaunch mrobot_navigation nav_demo.launch

由图可见已经实现了对当前位置的定位,绿色箭头为以初始位置为中心分布的粒子
在这里插入图片描述

5、在rviz上发布导航点
在这里插入图片描述
在这里插入图片描述
可见,路径已经生成,实现了我们想要的导航功能

<think>好的,我现在需要帮助用户解决在Ubuntu 18.04上配置move_base以加载自定义地图进行机器人导航的问题。首先,我得理清用户的需求现有的信息。用户提到了引用中的几个资源,包括安装map_server、创建工作区、使用cartographer生成地图以及husky机器人的仿真导航。这些引用内容应该整合到回答中。 首先,用户需要配置move_base,这意味着需要处理导航所需的参数文件地图数据。根据引用[3],move_base需要二维栅格地图,通常是使用cartographer生成,但用户可能已经有自定义地图。因此,步骤可能包括安装必要的包,如map_server(引用[1]),创建ROS工作区(引用[2]),然后配置move_baselaunch文件参数。 接下来,我需要分步骤来写教程。第一步可能是安装依赖,比如map_server必要的导航包。这里要引用到引用[1][3]。然后,创建工作区,这部分参考引用[2]。接着,用户需要将自定义地图转换为ROS需要的格式,即PGMYAML,可能需要用到map_server的保存功能,如引用[1]中的命令。然后配置move_base的参数文件,比如costmap的配置,引用[3]中提到move_base需要二维地图,所以需要确保地图路径正确。然后编写launch文件,启动节点,可能参考引用[4]中的launch命令结构。最后是测试调试,可能会遇到地图路径错误或参数配置问题,需要提示用户检查这些部分。 同时,用户可能遇到的问题包括地图路径不正确、坐标系设置错误或参数调整不当。需要指出这些常见问题,并给出解决建议。比如,确保map_server加载的地图路径正确,检查YAML文件中的路径是否为绝对路径,或者调整costmap的参数以适应实际环境。 另外,生成的相关问题需要考虑用户可能的后续需求,比如如何优化导航路径、处理动态障碍物或与其他传感器融合,如引用[3]中的hdl_localization引用[4]的GPS数据融合。这些问题可以帮助用户进一步深入配置优化导航系统。 在组织回答时,需要保持结构清晰,分步骤说明,并自然地插入引用标记。确保所有LaTeX格式正确,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不上太多数学公式,除非涉及到算法参数的解释。不过根据用户提供的示例,可能不需要,所以主要关注代码块步骤的结构。 最后,检查是否所有引用都正确对应,比如引用[1]关于map_server的安装保存地图,引用[2]创建工作区,引用[3]关于move_base地图生成,引用[4]的launch文件示例。确保每个引用出现在合适的位置,比如在安装步骤引用[1],创建工作区引用[2],配置地图部分引用[3]等。</think>### Ubuntu 18.04配置move_base加载自定义地图导航教程 #### 一、环境准备 1. **安装ROS Melodic** 确保已安装Ubuntu 18.04ROS Melodic,参考基础环境配置[^2]。 2. **安装导航相关包** 包括地图服务器导航栈: ```bash sudo apt-get install ros-melodic-map-server ros-melodic-move-base ros-melodic-amcl ``` #### 二、地图处理 1. **生成自定义地图** 使用SLAM算法(如Cartographer[^3])构建地图,保存为PGM+ YAML格式: ```bash rosrun map_server map_saver -f ~/catkin_ws/src/your_pkg/maps/custom_map ``` 2. **验证地图格式** 确保地图文件包含`custom_map.pgm`(图像数据)`custom_map.yaml`(元数据),YAML文件需指定绝对路径[^1]。 #### 三、配置move_base参数 1. **创建参数文件** 在功能包的`config`目录中添加以下文件: - **costmap_common_params.yaml** 定义通用代价地图参数,例如: ```yaml footprint: [[-0.2,-0.2], [0.2,-0.2], [0.2,0.2], [-0.2,0.2]] inflation_radius: 0.3 ``` - **local_costmap_params.yaml** 与 **global_costmap_params.yaml** 配置全局/局部地图参数,指定地图主题: ```yaml global_frame: map static_map: true ``` 2. **设置base_local_planner** 在`base_local_planner_params.yaml`中调整路径规划参数,例如: ```yaml max_vel_x: 0.5 acc_lim_theta: 1.0 ``` #### 四、编写launch文件 在功能包的`launch`目录中创建导航启动文件`custom_nav.launch`: ```xml <launch> <!-- 加载地图 --> <node name="map_server" pkg="map_server" type="map_server" args="$(find your_pkg)/maps/custom_map.yaml"/> <!-- 启动move_base --> <node pkg="move_base" type="move_base" name="move_base"> <rosparam file="$(find your_pkg)/config/costmap_common_params.yaml" command="load" ns="global_costmap"/> <rosparam file="$(find your_pkg)/config/costmap_common_params.yaml" command="load" ns="local_costmap"/> <rosparam file="$(find your_pkg)/config/local_costmap_params.yaml" command="load"/> <rosparam file="$(find your_pkg)/config/global_costmap_params.yaml" command="load"/> <rosparam file="$(find your_pkg)/config/base_local_planner_params.yaml" command="load"/> </node> <!-- 启动AMCL定位 --> <include file="$(find amcl)/examples/amcl_diff.launch"/> </launch> ``` #### 五、运行与测试 1. **启动导航系统** ```bash roslaunch your_pkg custom_nav.launch ``` 2. **发送目标点** 通过RViz的`2D Nav Goal`工具指定目标位置,观察路径规划结果。 #### 六、常见问题排查 - **地图未加载** 检查YAML文件路径是否正确,建议使用绝对路径。 - **坐标偏移** 确保所有节点的`global_frame`(如`map``odom`)定义一致[^3]。 - **路径规划失败** 调整`inflation_radius`或`cost_scaling_factor`参数以优化障碍物避让。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值