ros中如何根据map.yaml和tf数据确定地图中机器人的位置

本文介绍了如何将地图中的origin坐标转换为实际地图位置的方法,包括确定坐标系、解析origin坐标并转换为像素位置;同时讲解了如何通过tf变换实时显示机器人在导航中的位置。

地图的yaml格式中有


其中origin是建图时机器人的初始位置,单位是米m

问题1:如何将orgin转换成实际地图中的位置?

1.确定地图的坐标系,为最右上角的像素为坐标(0,0)

整副地图都处于坐标系的第三像限


2.解析origin x=-2.5m y=-1.6m,将x,y的值除以分辨率resolution(米/像素)

得出x=-50个像素,y为-32个像素

从地图的最右上角像素数,往左数第50个像素,再往下数第32个像素,就是orgin所代表的机器人初始位置。


问题2:如何在导航中实时显示机器人的位置

1.确定机器人本身的坐标系,一般是base_footprint或者base_link,在2d的地图上这两者基本没有区别,可选取其中一个

2.获取从map到base_footprint的tf变换,代表机器人以orgin位置为原点的坐标系上位置。

3.orgin中的x,y(减去/加上)tf变换中的x,y,就是当前机器人的当前位置,再除以resolution,就是地图中机器人位置所在的像素。

### 创建自定义功能包并配置costmap_2d插件 在ROS1中,创建一个自定义功能包以配置`costmap_2d`插件(如`StaticLayer`、`ObstacleLayer``InflationLayer`),需要按照以下方法进行操作。以下是详细的说明,涵盖功能包的创建、配置文件的编写以及如何在导航栈中使用这些配置。 #### 1. 创建自定义功能包 首先,创建一个新的ROS功能包来存放与代价地图相关的配置文件其他资源。可以使用以下命令创建功能包: ```bash catkin_create_pkg my_costmap_config rospy std_msgs costmap_2d nav_core tf geometry_msgs ``` 此命令将创建一个名为`my_costmap_config`的功能包,并依赖于`rospy`、`std_msgs`、`costmap_2d`等必要的包[^1]。 #### 2. 配置`costmap_common_params.yaml` 在`my_costmap_config/config`目录下创建一个`costmap_common_params.yaml`文件,用于定义通用参数。以下是示例配置: ```yaml obstacle_range: 2.5 raytrace_range: 3.0 footprint: [[-0.3, -0.3], [-0.3, 0.3], [0.3, 0.3], [0.3, -0.3]] # 根据机器人尺寸调整 inflation_radius: 0.55 observation_sources: laser_scan_sensor point_cloud_sensor laser_scan_sensor: {sensor_frame: base_laser, data_type: LaserScan, topic: /scan, marking: true, clearing: true} point_cloud_sensor: {sensor_frame: base_lidar, data_type: PointCloud, topic: /point_cloud, marking: true, clearing: true} ``` 上述配置中,`obstacle_range``raytrace_range`分别定义了障碍物检测范围激光雷达回溯范围。`footprint`定义了机器人的轮廓,`inflation_radius`定义了膨胀半径[^3]。 #### 3. 配置`global_costmap_params.yaml` 接下来,在同一目录下创建`global_costmap_params.yaml`文件,用于全局代价地图的配置: ```yaml global_costmap: global_frame: map robot_base_frame: base_link update_frequency: 5.0 publish_frequency: 2.0 static_map: true plugins: - {name: static_layer, type: "costmap_2d::StaticLayer"} # 静态层 - {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"} # 障碍物层 - {name: inflation_layer, type: "costmap_2d::InflationLayer"} # 膨胀层 ``` 此配置中,`static_map`设置为`true`表示使用静态地图作为全局代价地图的基础[^1]。 #### 4. 配置`local_costmap_params.yaml` 同样地,创建`local_costmap_params.yaml`文件,用于局部代价地图的配置: ```yaml local_costmap: global_frame: odom robot_base_frame: base_link update_frequency: 10.0 publish_frequency: 5.0 rolling_window: true width: 6.0 height: 6.0 resolution: 0.05 plugins: - {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"} - {name: inflation_layer, type: "costmap_2d::InflationLayer"} ``` 在此配置中,`rolling_window`设置为`true`表示使用滚动窗口模式,`width``height`定义了局部代价地图的大小,`resolution`定义了分辨率[^2]。 #### 5.导航启动文件中加载配置 最后,在导航启动文件(如`navigation.launch`)中加载这些配置文件。例如: ```xml <launch> <node pkg="move_base" type="move_base" name="move_base" output="screen"> <rosparam file="$(find my_costmap_config)/config/costmap_common_params.yaml" command="load" ns="global_costmap"/> <rosparam file="$(find my_costmap_config)/config/costmap_common_params.yaml" command="load" ns="local_costmap"/> <rosparam file="$(find my_costmap_config)/config/global_costmap_params.yaml" command="load"/> <rosparam file="$(find my_costmap_config)/config/local_costmap_params.yaml" command="load"/> </node> </launch> ``` 通过以上步骤,可以在ROS1中成功创建一个自定义功能包,并配置`costmap_2d`插件以实现机器人导航中的障碍物感知成本地图构建[^1]。 ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值