1 执行过程

  • 1.运行仿真机器人fake_turtlebot.launch:加载机器人模型——启动机器人仿真器——发布机器人状态
  • 2.运行amcl节点fake_amcl.launch:加载地图节点map_server——加载move_base节点——加载fake_localization节点(AMCL)
  • 3.运行rviz

2 机器人仿真

//fake_turtlebot.launch

<launch>
<param name="/use_sim_time" value="false" /> <!-- Load the URDF/Xacro model of our robot -->
<arg name="urdf_file" default="$(find xacro)/xacro.py '$(find rbx1_description)/urdf/turtlebot.urdf.xacro'" /> <param name="robot_description" command="$(arg urdf_file)" /> <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen" clear_params="true">
<rosparam file="$(find rbx1_bringup)/config/fake_turtlebot_arbotix.yaml" command="load" />
<param name="sim" value="true"/>
</node> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher">
<param name="publish_frequency" type="double" value="20.0" />
</node> </launch>
  • 2.1加载机器人模型turtlebot.urdf.xacro,包括:

    1.硬件模型turtlebot_hardware.urdf.xacro

    2.机器人本体模型turtlebot_body.urdf.xacro

    3.标定参数turtlebot_calibration.xacro

    4.运动学模型turtlebot_kinect.urdf.xacro

  • 2.2 加载arbotix模拟器,即arbotix节点(加载配置文件:fake_turtlebot_arbotix.yaml)  

port: /dev/ttyUSB0
baud: 115200
rate: 20
sync_write: True
sync_read: True
read_rate: 20
write_rate: 20 controllers: {
# Pololu motors: 1856 cpr = 0.3888105m travel = 4773 ticks per meter (empirical: 4100)
base_controller: {type: diff_controller, base_frame_id: base_footprint, base_width: 0.26, ticks_meter: 4100, Kp: 12, Kd: 12, Ki: 0, Ko: 50, accel_limit: 1.0 }
}

  

  • 2.3 加载robot_state_publisher节点(设置频率publish_frequency:20)

3 机器人控制

//fake_amcl.launch

<launch>

  <param name="use_sim_time" value="false" />

  <!-- Set the name of the map yaml file: can be overridden on the command line. -->
<arg name="map" default="test_map.yaml" /> <!-- Run the map server with the desired map -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find rbx1_nav)/maps/$(arg map)"/> <!-- The move_base node -->
<include file="$(find rbx1_nav)/launch/fake_move_base_amcl.launch" /> <!-- Run fake localization compatible with AMCL output -->
<node pkg="fake_localization" type="fake_localization" name="fake_localization" clear_params="true" output="screen">
<remap from="base_pose_ground_truth" to="odom" />
<param name="global_frame_id" value="map" />
<param name="base_frame_id" value="base_footprint" />
</node> </launch>

  

  • 3.1加载地图服务器节点map_server,配置地图文件:test_map.yaml
image: test_map.pgm                              //包含占用数据的图像文件的路径; 可以是绝对的,或相对于YAML文件的位置
resolution: 0.050000                              //地图的分辨率,米/像素
origin: [-13.800000, -12.200000, 0.000000]                //地图中左下像素的2-D姿态为(x,y,yaw),偏航为逆时针旋转(yaw = 0表示无旋转)。系统的许多部分目前忽略偏航。
negate: 0                                    //白/黑自由/占用语义是否应该被反转(阈值的解释不受影响)     
occupied_thresh: 0.9                             //占据概率大于该阈值的像素被认为完全占用
free_thresh: 0.196                               //占有概率小于该阈值的像素被认为是完全自由的

  

  • 3.2加载movebase节点:fake_move_base_amcl.launch——>运行成本、机器人半径、到达目标位置的距离,机器人移动的速度

    1.costmap_common_params.yaml:配置基本的参数,这些参数会被用于local_costmap和global_costmap.      

obstacle_range: 2.5                //障碍物探测,引入地图
raytrace_range: 3.0 //用于机器人运动过程中,实时清除代价地图中的障碍物
#footprint: [[0.175, 0.175], [0.175, -0.175], [-0.175, -0.175], [-0.175, 0.175]] //将机器人的几何参数告诉导航功能包集,机器人和障碍物之间保持一个合理的距离
#footprint_inflation: 0.01
robot_radius: 0.175
inflation_radius: 0.2 //机器人与障碍物之间必须要保持的最小距离
max_obstacle_height: 0.6
min_obstacle_height: 0.0
observation_sources: scan //设定导航包所使用的传感器
scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0}

  

    2.local_costmap_params.yaml;

local_costmap:
global_frame: map
robot_base_frame: base_footprint
update_frequency: 3.0 //发布信息的频率,也就是costmap可视化信息发布的频率
publish_frequency: 1.0
static_map: true
rolling_window: false //true:在机器人运动过程中,代价地图始终以机器人为中心
width: 6.0
height: 6.0
resolution: 0.01 //这三个是代价地图的的尺寸和分辨率,单位都是m
transform_tolerance: 1.0

  

    3.global_costmap_params.yaml;

global_costmap:
global_frame: map //定义机器人和地图之间的坐标变换,建立全局代价地图必须使用这个变换。
robot_base_frame: base_footprint
update_frequency: 1.0 //地图更新的频率
publish_frequency: 1.0
static_map: true //是否使用一个地图或者地图服务器来初始化全局代价地图
rolling_window: false
resolution: 0.01
transform_tolerance: 1.0
map_type: costmap

  

    4.base_local_planner_params.yaml;

controller_frequency: 3.0
recovery_behavior_enabled: false
clearing_rotation_allowed: false TrajectoryPlannerROS: //机器人的最大和最小速度限制值,也设定了加速度的限值
max_vel_x: 0.5
min_vel_x: 0.1
max_vel_y: 0.0 # zero for a differential drive robot
min_vel_y: 0.0
max_vel_theta: 1.0
min_vel_theta: -1.0
min_in_place_vel_theta: 0.4
escape_vel: -0.1
acc_lim_x: 1.5
acc_lim_y: 0.0 # zero for a differential drive robot
acc_lim_theta: 1.2 holonomic_robot: false //全向移动机器人那么此值为true
yaw_goal_tolerance: 0.1 # about 6 degrees
xy_goal_tolerance: 0.05 # 5 cm
latch_xy_goal_tolerance: false
pdist_scale: 0.4
gdist_scale: 0.8
meter_scoring: true heading_lookahead: 0.325
heading_scoring: false
heading_scoring_timestep: 0.8
occdist_scale: 0.05
oscillation_reset_dist: 0.05
publish_cost_grid_pc: false
prune_plan: true sim_time: 1.0
sim_granularity: 0.05
angular_sim_granularity: 0.1
vx_samples: 8
vy_samples: 0 # zero for a differential drive robot
vtheta_samples: 20
dwa: true
simple_attractor: false

  

    5.nav_test_params.yaml

TrajectoryPlannerROS:
yaw_goal_tolerance: 6.28 # We don't care about orientation
xy_goal_tolerance: 0.1 # 10 cm
pdist_scale: 0.8
gdist_scale: 0.4
occdist_scale: 0.1

  

  • 3.3加载fake_localization节点:ACML

3 Rviz显示

Ros学习——移动机器人Ros导航详解及源码解析的更多相关文章

  1. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  2. 详解HashMap源码解析(下)

    上文详解HashMap源码解析(上)介绍了HashMap整体介绍了一下数据结构,主要属性字段,获取数组的索引下标,以及几个构造方法.本文重点讲解元素的添加.查找.扩容等主要方法. 添加元素 put(K ...

  3. AFNetworking 3.0 使用详解 和 源码解析实现原理

    AFN原理&& AFN如何使用RunLoop来实现的: 让你介绍一下AFN源码的理解,首先要说说封装里面主要做了那些重要的事情,有那些重要的类(XY题) 一.AFN的实现步骤: NSS ...

  4. CharacterEncodingFilter详解及源码解析

    字符编码过滤器  (Spring框架对字符编码的处理) 基于函数回调,对所有请求起作用,只在容器初始化时调用一次,依赖于servlet容器. web.xml配置文件 <filter> &l ...

  5. cas客户端流程详解(源码解析)--单点登录

    博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...

  6. 六张图详解LinkedList 源码解析

    LinkedList 底层基于链表实现,增删不需要移动数据,所以效率很高.但是查询和修改数据的效率低,不能像数组那样根据下标快速的定位到数据,需要一个一个遍历数据. 基本结构 LinkedList 是 ...

  7. 详解HashMap源码解析(上)

    jdk版本:1.8 数据结构: HashMap的底层主要基于数组+链表/红黑树实现,数组优点就是查询块,HashMap通过计算hash码获取到数组的下标来查询数据.同样也可以通过hash码得到数组下标 ...

  8. 详解ConCurrentHashMap源码(jdk1.8)

    ConCurrentHashMap是一个支持高并发集合,常用的集合之一,在jdk1.8中ConCurrentHashMap的结构和操作和HashMap都很类似: 数据结构基于数组+链表/红黑树. ge ...

  9. 基于双向BiLstm神经网络的中文分词详解及源码

    基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...

随机推荐

  1. Jar包进行反编译,修改后重新打包

    在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的使用说明和源代码,有时有的却不提供源代码,使用 ...

  2. 剑指offer-第六章面试中的各项能力(扑克牌中的顺子)

    //扑克牌的顺子 //题目:在一个扑克牌中随机的抽5张牌,看是不是顺子.大小王为0,A为1,J为11,Q为12,K为13.其他数字为自己本身. //思路:大小王可以代表任意一个数字,因此我们在看是不是 ...

  3. WCF NetTcpBinding 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

    背景:WindowsService + WCF + NetTcpBinding 之前一直使用http协议模式,改为net.tcp之后隔段时间出现:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操 ...

  4. Redis 字符串(String)

    Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...

  5. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) C. Bear and Drawing

    题目链接:http://codeforces.com/contest/573/problem/C题目大意:在两行无限长的点列上面画n个点以及n-1条边使得构成一棵树,并且要求边都在同一平面上且除了节点 ...

  6. new JSONObject()报错

    如果缺少下列依赖包会报错: 1.commons-beanutils-1.7.0.jar 2.commons-collections-3.2.1.jar 3.commons-lang-2.3.jar 4 ...

  7. 深入浅出K-Means算法

    在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示. ...

  8. 【转】Jmeter常见问题

    说明:这些问答是从网上转载的,自己修改了其中的一些内容,如果大家兴趣,可以将大家在使用Jmeter的时候碰到的问题写下来,我们一起补充到这个问答里面,共同努力完善jmeter的资料. 1.  JMet ...

  9. java - 读取,导出 excel文件数据

    首先需下载poi java包,添加至构建路径, 写处理方法: import java.io.FileInputStream;import java.io.FileOutputStream;import ...

  10. Python——通过斐波那契数列来理解生成器

    一.生成器(generator) 先来看看一个简单的菲波那切数列,出第一个和第二个外,任意一个数都是由前两个数相加得到的.如:0,1,1,2,3,5,8,13...... 输入斐波那契数列前N个数: ...