【ROS机器人】 --- 2-3. 定位_AMCL

本节目标:加载一张地图,在地图中放置一个机器人实现对机器人的定位。
实现:

  1. 打开gazebo和模型文件(car_move.launch)
  2. 加载地图
  3. 启动机器人(gazebo)
  4. 启动rviz,完成rviz配置

前期准备

  1. 延用工作空间test2_ws;
  2. 功能包demo5_navigation存放代码;
  3. amcl和rviz代码在demo5_navigation/launch/nav2_test.launch;
  4. amcl代码demo5_navigation/launch/nav2_amcl.launch;
  5. rviz配置在demo5_navigation/config/rviz/nav2.rviz;

简单介绍

SLAM中的定位是指全局定位用于地图。这里的定位是指当前定位,用于导航。在ROS的导航功能包集中的AMCL就是一种提供给机器人定位的功能包。被集成到了navigation中。核心节点AMCL。在amcl功能包下,有差分diff和全向移动omni的例子,本节选用差速为例修改:

roscd amcl
cd examples
gedit  amcl_diff.launch 

I、 ACML文件

对照ACML的例子编写launch/nav2_amcl.launch,主要修改三个坐标系:

<param name="odom_frame_id" value="odom"/><!-- 里程计坐标系 -->
<param name="base_frame_id" value="base_footprint"/><!-- 添加机器人基坐标系 -->
<param name="global_frame_id" value="map"/><!-- 添加地图坐标系 -->

II、汇总launch文件

launch/nav2_test.launch
实现打开rviz,加载地图,执行acml的过程。

III、执行查看

  1. 加载机器人模型(gazebo)
roslaunch demo4_urdf_gazebo car_move.launch 

在这里插入图片描述

  1. 执行AMCL算法
roslaunch demo5_navigation/launch/nav2_test.launch 

2

  1. 配置rviz并保存,本节重要的主要是pasearray

3

  1. 键入控制机器人运动:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py 

4

可以看到线束最多的地方就是概率最大的位置。

源码

nav2_amcl.launch

<launch>
        <node pkg="amcl" type="amcl" name="amcl" output="screen">
                <!-- 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="transform_tolerance" value="0.2" />
                <param name="gui_publish_rate" value="10.0"/>
                <param name="laser_max_beams" value="30"/>
                <param name="min_particles" value="500"/>
                <param name="max_particles" value="5000"/>
                <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.8"/>
                <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_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.2"/>
                <param name="update_min_a" value="0.5"/>

                <param name="odom_frame_id" value="odom"/><!-- 里程计坐标系 -->
                <param name="base_frame_id" value="base_footprint"/><!-- 添加机器人基坐标系 -->
                <param name="global_frame_id" value="map"/><!-- 添加地图坐标系 -->

                <param name="resample_interval" value="1"/>
                <param name="transform_tolerance" value="0.1"/>
                <param name="recovery_alpha_slow" value="0.0"/>
                <param name="recovery_alpha_fast" value="0.0"/>
        </node>
</launch>

nav2_test.launch

这里已经保存了rviz的配置为nav2.rviz并读取。

<launch>
        <!-- 启动 rviz -->
        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
        <node pkg="rviz" type="rviz" name="rviz" args="-d $(find demo5_navigation)/config/rviz/nav2.rviz"  />

        <!-- 加载地图服务 -->
        <include file="$(find demo5_navigation)/launch/nav1_pub_map.launch" />

        <!-- AMCL文件 -->
        <include file="$(find demo5_navigation)/launch/nav2_amcl.launch" />

</launch>
### 使用AMCL进行重定位 AMCL(Adaptive Monte Carlo Localization)是一种用于机器人在二维环境中实现概率定位的技术[^1]。当机器人需要重新获得其在全球地图中的位置,这一过程被称为重定位。 #### 启动AMCL节点并配置参数 为了使AMCL能够执行重定位操作,首先需启动AMCL ROS包下的`amcl`节点,并设置必要的参数以优化性能: ```bash roslaunch amcl.launch ``` 在此过程中,可以通过编辑launch文件调整一些关键参数,比如粒子数量(`min_particles`)、最大线性和角速度更新条件(`update_min_d`, `update_min_a`)等,这些都会影响到重定位的效果和效率[^3]。 #### 发布初始猜测姿态 为了让AMCL更快更准地完成重定位,在可能的情况下提供一个接近真实的起始估计是非常有帮助的。这通常是在用户手动输入或通过其他传感器数据辅助下完成的。可以利用`initialpose`话题发送消息给AMCL: ```python import rospy from geometry_msgs.msg import PoseWithCovarianceStamped def set_initial_pose(): pub = rospy.Publisher(&#39;initialpose&#39;, PoseWithCovarianceStamped, queue_size=10) rospy.init_node(&#39;set_init_pose&#39;) pose_msg = PoseWithCovarianceStamped() # 设置header信息 pose_msg.header.frame_id = "map" pose_msg.header.stamp = rospy.Time.now() # 填充位姿信息 (x,y,z,w分别为位置坐标和平移四元数分量) pose_msg.pose.pose.position.x = 0.0 pose_msg.pose.pose.position.y = 0.0 pose_msg.pose.pose.orientation.w = 1.0 # 可选:增加协方差矩阵来表达不确定性程度 cov_matrix = [0.25, 0., 0., 0., 0., 0., 0., 0.25, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.06853892326654787] pose_msg.pose.covariance[:] = cov_matrix rate = rospy.Rate(1) while not rospy.is_shutdown() and pub.get_num_connections() == 0: rate.sleep() pub.publish(pose_msg) if __name__ == &#39;__main__&#39;: try: set_initial_pose() except rospy.ROSInterruptException as e: pass ``` 这段Python脚本展示了如何向AMCL传递一个带有不确定性的初始猜测量[^2]。 #### 监控与验证 一旦上述步骤完成后,就可以让机器人开始运行并在RViz可视化工具中观察机器人的实际表现情况。如果一切正常工作,则可以看到代表机器人的图标逐渐稳定在一个固定的位置上,表明它已经成功完成了自我校正的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值