原文地址:http://wiki.ros.org/navigation/Tutorials/RobotSetup#Robot_Setup
描述:在机器人身上运行navagation,基本配置有用tf发送坐标转换信息,发布odometry航迹推演信
息(包括速度信息,运行距离信息),发布传感器信息
我们应该自己实现的四个节点
Sensortransforms: 用tf发布坐标系位置 Sensorsources: 收集所有传感器并发布sensor_msgs/LaserScanorsensor_msgs/PointCloud消息 Odometrysource: 用tf发布nav_msgs/Odometry信息 Basecontroller 订阅”cmd_vel”话题 解析geometry_msgs/Twist信息,然后控制机器人. |
关于如何来写这些节点 示例
PublishingOdometry Information Over ROS
PublishingSensor Streams Over ROS
TransformConfiguration.
以上各种节点我们都做好了,然后,接下来,创建一个包,我们将存储所有的配置和启动文件.这个包将做好各种依赖.在工作空间执行以下命令
catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep |
接下来,我们将创建roslaunch文件来启动所有的硬件和坐标转换节点.打开一个编辑器编辑文档,将下面的代码复制进去,并 保存这个文档为my_robot_configuration.launch
|
接下来,我们将更改这个launch文件,来适配我们自己的机器人
|
将 "sensor_node_pkg" 替换为你自己的ros传感器驱动名称
将"sensor_node_type"
替换为你自己的传感器类型
将 "sensor_node_name"
替换为你自己想要取的名称
将 ”sensor_param”用自己可能的参数类型取代
附加:如果你还有其他的传感器节点,也一并按照格式添加
剩下的其他文件也一按照这个说明并更改
navigation使用两个costmap来存储障碍物信息,一个来做全局地图,另一个做局部地图.配置文件一共有三个,基本通用配置,全局配置,局部配置.详细的信息在costmap_2ddocumentation.
navigation使用两个costmap来存储障碍物信息,为了正确地表示,我们应该指出costmaps在sensortopic话题上,需要更新的内容,我们接下来将创建一个costmap_common_params.yaml文件.
obstacle_range:2.5 raytrace_range:3.0 footprint:[[x0, y0], [x1, y1], ... [xn, yn]] #robot_radius:ir_of_robotroslaunch my_robot_configuration.launch 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} |
接下来我们分析这个文件
obstacle_range:2.5 表示:2.5米以内的障碍物将被记录下来,超出不管. raytrace_range:3.0 表示:清除前方3米之外的传感器信息 footprint:[[x0, y0], [x1, y1], ... [xn, yn]]:表示机器人支脚的位置机器人中心为[0,0] #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} marking表示是否标记障碍物信息 clearing 表示是否清除障碍物信息 point_cloud_sensor:{sensor_frame: frame_name, data_type: PointCloud, topic:topic_name, marking: true, clearing: true} |
创建一个global_costmap_params.yaml文件,并将以下代码复制进去
global_costmap: global_frame:/map robot_base_frame:base_link update_frequency:5.0 static_map:true |
"global_frame"参数定义了costmap在什么坐标框架下运行
"robot_base_frame"参数定义了costmap应该那拿什么作为机器人的参考
"update_frequency"参数定义了地图更新的频率
"static_map" 参数定义了costmap是否应该从map_server.上获取依赖地图,如果不是,设置为false
创建一个local_costmap_params.yaml文件,并将以下代码复制进去
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.05 |
"global_frame","robot_base_frame", "update_frequency", and"static_map"这三个参数和全局规划配置参数一样.
"publish_frequency"参数定义了costmap更新显示的频率
"rolling_window" 参数定义costmap将以机器人为中心显示地图
"width,""height," and "resolution"设置costmap地图的宽度,高度还有单位.
base_local_planner 控制这向机器人发送的速度 (cmd_vel)
创建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:true |
第一部分速度限制,第二部分加速度限制
创建move_base.launch文件
需要修改mapserver指向一个现有的地图, 如果你有一个差动的机器人,将"amcl_omni.launch"改为"amcl_diff.launch".buildinga map. 里有更多制作地图的信息. |
roslaunch my_robot_configuration.launch roslaunch robot_base.lauch |