多地图导航允许多个二维地图与允许机器人在两个地图之间移动的“过渡”链接在一起。这种方法解决了大地图的问题,这些地图对于机器人的记忆来说太大,或者在一次重击中太难绘制。此外,它还可以方便地导航多层建筑。每个转换都可以通过执行“转换”操作来执行单独的程序。这允许操作开门软件或电梯管理软件。 。
1.要创建用于多地图导航的地图,应使用SLAM软件创建多个二维地图。您必须以这样的方式设计地图:当机器人完成从一个地图到下一个地图的转换时,它将准备好在第二个地图上导航。这些要求取决于您的转换软件。默认的转换只是将robot直接转储到新的映射中,因此这两个映射至少应该重叠足够让robot能够在每个转换上导航。
2.创建地图后,必须将其加载到地图存储中。使用map_store包中的add_map脚本执行此操作的一种方法。记住给它们起描述性的名字,这样它们就可以在定义转换时适当地使用。
3.加载映射后,必须定义映射之间的转换。这围绕着创建一个定义它们的YAML文件。YAML文件有两个主要部分-第一个是映射列表,第二个是转换列表。地图部分如下:
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
start_map: willow-up
maps:
- name: willow-up
north_angle: 1.5707963267948966
不管有多少地图,最后两行都是重复的。开始映射:定义初始映射。最后两行定义了一个名为willow up的地图。必须指定North_angle,并假定该角朝向北。它始终是必需的,但除非使用默认转换,否则它不必精确。如果所有地图都面向同一方向,则可以安全地将所有North_angle值设置为零。
定义地图后,必须定义以wormholes标记开头的过渡:
wormholes:
- name: hallway-door
type: normal
radius: 0.55
locations:
- map: willow-down
position: [36.071, 19.45]
- map: willow-up
position: [5.65, 22.629]
wormholes标记指定过渡列表。可以重复-name:元素来定义任意多个转换。在这种情况下,每个转换(hallway-door))的名称必须是唯一的。“type:”标记描述转换的类型,它可能是普通的,也可能是转换操作的名称(请参见下面创建自己的转换)。“radius:”标记定义了半径的限制,机器人必须进入这个圆才能通过转换-如果省略了它,那么机器人将尝试在执行转换之前一直到达该位置。除了这些参数之外,位置还可以包含其他参数,这些参数被输入到转换操作,只要它们不与转换操作编写器的“位置locations”、“名称name ”和“半径radius”冲突。
“locations:”标记开始一个位置列表,两行中的每一行定义一个位置。位置是转换的端点。大多数转换(hallway-door)有两个位置,但有些可能有更多位置(如四层楼的电梯可能有四个转换)。每个位置必须指定一个地图:这是放置该位置的地图,位置:这是该地图中的x-y坐标。若要获取这些坐标,请以可以使用rviz将目标放置在该位置的方式打开地图,然后从rviz控制台日志中读取。位置还可以指定方向:出口或方向:入口。这是单向转换(如推开门)所必需的。没有方向的位置:被认为是双向的。最后,该位置可以指定一个角度:标记,该标记指定机器人到达该位置时必须面对的角度,从而确保机器人面向执行所需操作的正确方式。除了这些参数之外,位置还可以包含其他 一些被输入到转换动作中参数,只要这些参数不与转换动作编写器的“map”、“position”、“angle”或“direction”冲突。
必须首先将map_store添加到启动文件中。要启动multi_map_navigation,请将此代码添加到启动文件中:
<node pkg="multi_map_navigation" type="multi_map_navigation" name="multi_map_navigation" output="screen">
<param name="definition_file" value="YAML" />
<param name="transition_types" value="TYPES" />
</node>
其中YAML是配置YAML的绝对路径,TYPES是映射中可能存在的转换操作的列表。如果在不触发任何操作的“正常”转换之外没有转换,则类型可以是空字符串。
也可以添加线来设置基础的初始姿势:
<param name="/amcl/initial_pose_x" value="9.116" />
<param name="/amcl/initial_pose_y" value="10.993" />
<param name="/amcl/initial_pose_a" value="1.546" />
启动多地图导航后,必须在地图中指定位置。如果未指定正确的初始位置,则必须使用rviz将机器人正确放置在地图中。还必须在正确的映射上启动,如果没有,则必须从命令行正确设置映射:
rosservice call /multi_map_navigation/set_map <map-name>
其中是机器人启动的目标。
一旦启动多地图导航,就可以为机器人设定目标。要从命令行实现此目的,请执行以下操作:
rosrun multi_map_navigation multi_map_navigation_test 12 10 willow-down
“multi_map_navigation_test”的示例说明了如何有效地执行此操作。基本上,多地图导航/移动中存在一个名为MultiMapNavigationAction的操作。来自python:
self.action_client = actionlib.SimpleActionClient("multi_map_navigation/move", MultiMapNavigationAction)
self.action_client.wait_for_server()
goal = MultiMapNavigationGoal()
goal.target_pose.header.stamp = rospy.get_rostime()
goal.target_pose.header.frame_id = "map"
goal.target_pose.pose.position.x = xp
goal.target_pose.pose.position.y = yp
goal.target_pose.pose.orientation.w = 1.0
goal.goal_map = map
self.action_client.send_goal(goal)
self.action_client.wait_for_result()
转换操作是在世界地图之间转换时运行的操作。例如门和电梯操作软件。转换只是一个实现MultiMapNavigationTransitionAction的操作服务器。我们建议对服务器名称进行硬编码,以便地图文件可以轻松访问它。转换操作将数据馈送到可能有用的代码中。第一个是字符串“wormholes”,它包含整个YAML数据作为从YAML映射配置文件转换的字符串。第二个是 "start"和 “end” ,其中包含 starting 和 ending wormholes的数字索引,这对于确定电梯应在哪个楼层退出等很有用。
multi_map_navigation
first example
second example