如何建立Navigation Stack

 我来答
若以下回答无法解决问题,邀请你更新回答
歪_听得到吗
2017-10-15 · TA获得超过4004个赞
知道大有可为答主
回答量:1887
采纳率:44%
帮助的人:989万
展开全部
前言
本文一步步的介绍如何在实现机器人上运行导航。包含的主题包括:发送坐标转换的tf,发布里程计信息,通过ROS发布激光传感器数据和基本的导航包配置。
1.建立机器人

导航包假设已经以某种特殊的方式配置好用于运行。上面的图解展示了这个配置。白色的组件是必须的组件,并且已经实现了;灰色的组件是可选的组件,并且也已经实现了;蓝色的组件是必须为每一个具体的机器人平台创建的。导航包的预需求部分(以及说明如何满足每一个需求)在下文中提供。
1.1ROS
导航包默认机器人安装了ROS,关于如何安装在机器人上安装ROS需要查找相关的ROS文档。
1.2.转换配置 (其他平台)
导航包需要机器人发布使用tf转换后的坐标系之间关系的信息。关于如何建立这种配置的详细教程参考:建立TF
也可以查看我的tf tree:配置好的tf链接
1.3.传感器信息 (源自传感器)
导航包使用传感器收集的信息进行避障,假设这些传感器通过ROS发布sensor_msgs/LaserScan或者sensor_msgs/PointCloud信息。关于通过ROS发布的这些信息,参考:链接。当然了,已经有一部分传感器已经有了ROS驱动包含了这一步骤。已支持的传感器和相关的驱动链接如下:
[SCIP2.2-compliant Hokuyo Laser Devices as well as the Hokuyo Model 04LX, 30LX - urg_node](http://wiki.ros.org/urg_node
[SICK LMS2xx Lasers - sicktoolbox_wrapper](http://wiki.ros.org/sicktoolbox_wrapper
1.4.里程信息 (来自里程计)
导航包需要使用tf和nav_msgs/Odometry信息发布的里程计信息。关于通过ROS发布里程计信息的教程参考:链接。支持里程计的平台和链接参考:
Videre Erratic: erratic_player(http://wiki.ros.org/erratic_player
PR2: pr2_mechanism_controllers(http://wiki.ros.org/pr2_mechanism_controllers
1.5.底盘控制
导航包假设它在”cmd_vel”主题上发布geometry_msgs/Twist格式消息,这个消息是在底盘坐标系上的速度命令。这意味着必须有一个节点订阅“cmd_vel”主题,这个节点能够完成(vx, vy, vtheta) <==> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z)速度之间的转换并转换他们为运动命令发送到移动底盘。支持底盘控制平台以及相关驱动的链接如下:
Videre Erratic: erratic_player
PR2: pr2_mechanism_controllers
1.6.建图(map_server)
导航包需要地图用来操作,但是在本教程假设已经有了一个地图。关于详细的如何在具体环境中创建地图参考:链接。
2.导航包的建立
本节描述如何在机器人上建立和配置导航栈。假设上文描述的建立机器人的需求已经得到满足。特别地,这也意味着机器人必须使用tf发布坐标系信息,接收的所有传感器发布的sensor_msgs/LaserScan 或者 sensor_msgs/PointCloud消息将被导航包使用,使用tf和nav_msgs/Odometry消息发布的里程计信息同样通过速度命令发送到底盘。如果机器人不满足这些需求,查看上文的说明并完善。
2.1创建package
本教程的第一步就是创建一个package,我们将用它来保存导航包的所有的配置和launch文件。这个包将依赖一些其他的包,这些包用来满足上面创建机器人部分的需求,比如move_base包一样,它包含了实现导航包的高等级的接口。接下来,选择包的保存路径,运行如下命令:
catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep1

2.2.创建launch配置文件
既然我们已经有了保存配置和launch文件的工作空间,我们将创建一个roslaunch文件用来启动所有硬件和机器人需要的转换分布器。打开偏好的编辑器,把下面的片段复制到my_robot_configuration.launch文件中,这里可以将具体的机器人平台名字替换掉my_robot。同样的,下面也有一些类似的改变。
<launch>
<node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
<param name="sensor_param" value="param_value" />
</node>

<node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
<param name="odom_param" value="param_value" />
</node>

<node pkg="transform_configuration_pkg" type="transform_configuration_type" name="transform_configuration_name" output="screen">
<param name="transform_configuration_param" value="param_value" />
</node>
</launch>12345678910111213

好了,现在已经有了一个launch文件的模板,现在我们需要根据具体的机器人进行填充。下文将介绍具体介绍每一个区域需要更改的内容。
<launch>
<node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
<param name="sensor_param" value="param_value" />123

在本区域中,我们将创建任何机器人需要导航用到的传感器。用实际使用的传感器package名替换掉”sensor_node_pkg”,”sensor_node_type”是传感器驱动的类型,”sensor_node_name”是给传感器节点取的名字,”sensor_param”是给节点设置的参数。注意,如果有多传感器数据需要发送到导航包,那么必须为所有传感器建立节点。
<node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
<param name="odom_param" value="param_value" />
</node>123

上述代码建立了底盘的里程计节点。代码中的pkg、type、name、param等参数根据具体的机器人平台相关。如果使用的是turtlebot地盘,则不需要写.
<node pkg="transform_configuration_pkg" type="transform_configuration_type" name="transform_configuration_name" output="screen">
<param name="transform_configuration_param" value="param_value" />
</node>123

上述代码创建了机器人的转换配置。代码中的参数根据具体的参数进行修改。比如在使用gmapping建图的时候就需要如下的tf tree:
<node pkg="tf" type="static_transform_publisher" name="link1_broadcaster" args="0.1 0 0.05 0 0 0 base_link laser 100" /> 1

2.3.(local_costmap) & (global_costmap)文件的配置
导航包使用2个costmap记录世界参考系中的障碍信息。一个用来全局路径规划,同时创建整体环境的长期规划,另一个用来局部规划和避障。有部分是两个costmap共同的配置选项,也有部分是单独的。因此,下文将有3个部分来介绍相关配置:公共配置选项,全局配置选项,局部配置选项。
注意:下文只是介绍了一些基本的配置选项,关于更多的配置选项,参考:链接。
2.3.1.Common Configuration (local_costmap) & (global_costmap)
导航包使用costmap保存世界参考系中的障碍物信息。为了正确的完成这个目标,我们需要将costmap指向传感器主题用来监听更新。下面我们创建costmap_common_params.yaml文件然后复制下面的内容:
obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55

observation_sources: laser_scan_sensor point_cloud_sensor

laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}

point_cloud_sensor: {sensor_frame: frame_name, data_type: PointCloud, topic: topic_name, marking: true, clearing: true}1234567891011

接下来将详细的解析上述代码;
obstacle_range: 2.5
raytrace_range: 3.012

这个参数集合给定了加进costmap中的障碍信息的阈值。”obstacle_range”决定范围传感器读取到的最大数据导致在costmap中加入障碍。这里,我们设置的是2.5米,这意味着机器人将仅仅更新costmap中的底盘2.5米内的障碍信息。”raytrace_range”参数决定传感器读到光线扫描到的自由空间的范围。设置它为3米表示机器人通过给定的传感器读取的数据将尝试清除它面前的空间到3米外。
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55123

这里我们设置机器人的footprint和机器人的半径(如果是圆的话)。如果要指定footprint,机器人的中心假定为(0,0,0,0)以及指定顺时针和逆时针方向都能被支持。我们同样也指定了costmap的膨胀距离.膨胀距离指的是计算时需要保持离障碍物的最大距离.比如说.设置膨胀半径为0.55米表示机器人将保持所有的路径与障碍物保持0.55米的距离.
observation_sources: laser_scan_sensor point_cloud_sensor1

“observation_sources”参数定义指令了一个传感器列表,这些由空间分隔的传感器将传递信息给costmap。每一个传感器在下面的一行代码定义。
laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}1

上述的一行设置observation_sources中传感器关注的参数,本示例定义了laser_scan_sensor作为示例。
“frame_name”是传感器的坐标系的名字,”data_type”必须被设置为LaserScan或者PointCloud,取决于使用了哪种消息的的主题,”topic_name”必须设置为传感器发布数据的主题的名字。”marking” 和 “clearing”决定传感器是否被用来增加障碍信息到costmap中,从costmap清除障碍信息或者清除障碍信息或者两者都是。
2.3.2.Global配置(global_costmap)
我们将创建global_costmap_params.yaml文件保存全局costmap的具体配置选项。
global_costmap:
global_frame: /map
robot_base_frame: base_link
update_frequency: 5.0
static_map: true12345

“global_frame”参数定义costmap运行在哪一个坐标系,这里设置的是/map参考系.”robot_base_frame” 参数定义了costmap与底盘关联的坐标系。”update_frequency”参数定义costmap更新的频率,单位是HZ。 “static_map”参数决定costmap是否以map server提供的mao为基础初始化自身。如果不是使用已有的地图或者map server,设置这个参数为false。
2.3.3.Local配置 (local_costmap)
创建local_costmap_params.yaml文件保存局部costmap的具体配置选项:
local_costmap:
global_frame: odom
robot_base_frame: base_link
update_frequency: 5.0
publish_frequency: 2.0
static_map: false
rolling_window: true
width: 6.0
height: 6.0
resolution: 0.0512345678910

“global_frame”, “robot_base_frame”, “update_frequency”,以及 “static_map” 的含义与上文的全局配置参数含义相同.”publish_frequency”定义了costmap发布可视化信息的速率,单位是HZ。”rolling_window”参数为true表示costmap保持围绕着机器人,当机器人在世界中移动的时候。”width,” “height,” 和”resolution”设置costmap的宽度(米)、长度(米)、分辨率(米/格)。值得注意的是最好设置grid的分辨率和static map的分辨率不同,但是大多数的时候还是倾向于设置成一样。
2.3.4.全部配置项
最小配置就能能启动和运行机器人,对于costmap的更多的可用配置选项参考:链接。
2.4.Base Local Planner Configuration
base_local_planner负责计算速度命令并发送到机器人移动底盘用于高级别的规划。我们需要根据机器人的规则去设置一些配置参数。新建base_local_planner_params.yaml文件然后复制下面的内容:
注意:这里这配置了一些基本的路径规划配置参数。更多的参考:链接。
TrajectoryPlannerROS:
max_vel_x: 0.45
min_vel_x: 0.1
max_vel_theta: 1.0
min_in_place_vel_theta: 0.4

acc_lim_theta: 3.2
acc_lim_x: 2.5
acc_lim_y: 2.5

holonomic_robot: true1234567891011

上述的第一部分参数定义了机器人的速度限制。第二部分定义了机器人的加速度限制。
2.5.Creating a Launch File for the Navigation Stack
现在我们已经创建并编写好了所有需要的配置文件,现在需要把所有的文件在一个launch文件里面配置好。新建move_base.launch文件,然后复制以下内容:
<launch>
<master auto="start"/>

<!-- Run the map server -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find my_map_package)/my_map.pgm my_map_resolution"/>

<!--- Run AMCL -->
<include file="$(find amcl)/examples/amcl_omni.launch" />

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find my_robot_name_2dnav)/local_costmap_params.yaml" command="load" />
<rosparam file="$(find my_robot_name_2dnav)/global_costmap_params.yaml" command="load" />
<rosparam file="$(find my_robot_name_2dnav)/base_local_planner_params.yaml" command="load" />
</node>
</launch>1234567891011121314151617

仅需要的改变就是需要将map server指向你创建的地图,改变”amcl_omni.launch” 为 “amcl_diff.launch”,如果你有不同的机器人驱动。关于如何创建地图,参考:链接。
2.6.AMCL Configuration (amcl)
AMCL有多个配置选项会影响定位的性能.更多的关于amcl的信息参考链接.
3.运行导航栈
现在我们已经创建好了一切,现在可以运行导航包了。执行:
终端 1:
roslaunch my_robot_configuration.launch1

终端 2:
roslaunch move_base.launch1

可以看到导航包已经运行起来了。
关于通过图像化界面查看发送到导航包的信息查看:链接。如果要用代码替代发送信息,参看:链接。
4.问题答疑
关于导航包使用中遇到的问题,参考:链接.
用于搜索的关键字:mobile platform setup, robot setup, setup robot, getting started with mobile robot
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式