ROS机器人底盘(9)-base_link、odom、map关系

ROS机器人底盘(9)-base_link、odom、map关系,第1张

官方有个教程 http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom ,

https://github.com/ros-planning/navigation_tutorials 这个包这里可以看到

可以看到多带手出一个 Frame ,并且在运动。切换 Fixed Frame 为 Odom 同时添加 Odom topic

Odom 可以理解全局一张超级大地图机器人运动返或就发布 base_link 到 Odom 的 tf ,这样就好似机器人在这张大图上运动了。

前面说到 Odom 是一张大的地图, 那 map 就可以理解为这个大的地图中的一部分。导航启动机器人漏行伍不是处于地图中的正确位置时,我们会通过

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

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

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

map_server包提供了一个**map_server

**ROS Node , 该node通过ROS Service 方式提供地图数据。 该包还提供了map_saver

命令行utility, 使用绝档该工具可将动态创建的地图保存成文件。

1 Map format

使用该包中提供的工具可以 *** 控的地图被首销存储在2个文件中。 一个是YAML格式的文件描述地图meta-data并命名image文件。另一个image文件用来编码occupancy-data。

1.1 Image format

image用不同的像素颜色描述世界中每个cell的占用状态。白色像素表示free,黑色像素表示occupied, 其它颜色像素表者宏游示unknown。 彩色图和灰度图都可以,但是多数是灰度图。在YAML文件中使用阈值来区分3种类别。

当image中像素与阈值参数比较时候,需要先按照公式occ = (255 - color_avg) / 255.0

计算占用概率, 这里color_avg是用8位数表示的来自于所有通道的平均值。例如,如果image是24-bit颜色,拥有0x0a0a0a颜色

的像素,其概率是0.96,这意味着几乎完全占用。

如果像素颜色是0xeeeeee,则占用概率是

0.07, 这意味着几乎没有被占用。

当使用ROS消息通信时候,这种占用被表示为范围[0,100]之内的一个整数, 0的意思是完全free, 100的意思是完全occupied, -1表示完全unknown。

Image data被 SDL_Image库 读取, 依赖在特定平台上SDL_Image将提供什么东西,SDL_Image相应支持格式也会有差异。一般来讲,多数常用image格式都已经被支持了。一个必须要注意的例外是PNG格式在OS X平台上不能被支持。

1.2 YAML format

以下是YAML格式的一个示例:

image: testmap.pngresolution: 0.1origin: [0.0, 0.0, 0.0]occupied_thresh: 0.65free_thresh: 0.196negate: 0

需要的字段:

image : 指定包含occupancy data的image文件路径可以是绝对路径,也可以是相对于YAML文件的对象路径

resolution : 地图分辨率,单位是meters / pixel

origin : The 2-D pose of the lower-left pixel in the map, 表示为 (x, y, yaw), 这里yaw是逆时针旋转角度(yaw=0意味着没有旋转)。目前多数系统忽略yaw值。

occupied_thresh : 像素的占用概率比该阈值大被看做完全占用

free_thresh : 像素的占用概率比该阈值小被看做完全free

negate : Whether the white/black free/occupied semantics should be reversed (interpretation of thresholds is unaffected)

2 Command-line Tools

2.1 map_server(地图服务器)

map_server

是一个 ROS node ,可以从磁盘读取地图并使用ROS service提供地图。 目前实现的map_server可将地图中的颜色值转化成三种占用值: free (0), occupied (100), and unknown (-1). 未来可用0~100之间的不同值指示占用度。

2.1.1 命令语法

map_server <map.yaml>

2.1.2 示例

rosrun map_server map_server mymap.yaml

注意:map data可以通过指定topic或者 service来提取。service的方式最后可能要被废弃。

2.1.3 发布的主题

map_metadata

( nav_msgs/MapMetaData )Receive the map metadata via this latched topic.

map

( nav_msgs/OccupancyGrid )Receive the map via this latched topic.

2.1.4 服务

static_map

( nav_msgs/GetMap )Retrieve the map via this service.

2.1.5 参数

~frame_id

(string

, default: "map"

) The frame to set in the header of the published map.

2.2 map_saver(地图保存器)

map_saver

可以把地图保存到磁盘。 例如:from a SLAM mapping service.2.2.1 命令语法

rosrun map_server map_saver [-f mapname]

map_saver

retrieves map data and writes it out to map.pgm and map.yaml . Use the -f option to provide a different base name for the output files.

2.2.2 命令示例

rosrun map_server map_saver -f mymap

2.2.3 订阅的主题

map

( nav_msgs/OccupancyGrid ) Map will be retrieved via this latched topic


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12192302.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存