Turtlebot学习指导第五篇_搭建自己的ROS机器人的核心,配置navigation包并创建基本的启动文件

来源:互联网 发布:子贡曰君子一言以为知 编辑:程序博客网 时间:2024/05/16 12:44

搭建ros机器人的核心_在机器人上运行并配置navigation


原文地址: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

创建机器人启动配置文件 .launch文件

接下来,我们将创建roslaunch文件来启动所有的硬件和坐标转换节点.打开一个编辑器编辑文档,将下面的代码复制进去,并保存这个文档为my_robot_configuration.launch
<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>


接下来,我们将更改这个launch文件,来适配我们自己的机器人

  <nodepkg="sensor_node_pkg" type="sensor_node_type"name="sensor_node_name" output="screen">
    <paramname="sensor_param" value="param_value" />
"sensor_node_pkg"替换为你自己的ros传感器驱动名称
"sensor_node_type"替换为你自己的传感器类型
"sensor_node_name"替换为你自己想要取的名称
将 ”sensor_param”用自己可能的参数类型取代
附加:如果你还有其他的传感器节点,也一并按照格式添加
剩下的其他文件也一按照这个说明并更改

Costmap地图配置文件 全局地图与局部地图配置

navigation使用两个costmap来存储障碍物信息,一个来做全局地图,另一个做局部地图.配置文件一共有三个,基本通用配置,全局配置,局部配置.详细的信息在costmap_2ddocumentation.

通用基本配置

navigation使用两个costmap来存储障碍物信息,为了正确地表示,我们应该指出costmapssensortopic话题上,需要更新的内容,我们接下来将创建一个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:/maprobot_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


第一部分速度限制,第二部分加速度限制

创建整个navigationlaunch文件

创建move_base.launch文件

<launch>
  <masterauto="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>

需要修改mapserver指向一个现有的地图, 如果你有一个差动的机器人,将"amcl_omni.launch"改为"amcl_diff.launch"buildinga map. 里有更多制作地图的信息.

启动机器人

roslaunch my_robot_configuration.launch

roslaunch robot_base.lauch


0 0