半岛·BOB官方网站 智能车仿真之机器人建图、定位、导航三部曲(一)
前言
ROS 中的控制器插件
让我们运行上一篇博客中设计的移动机器人
使用博客中设计的移动机器人绘制我们搭建的凉亭环境的地图
利用AMCL在已知地图上对机器人进行定位,为后续的自主导航做准备
利用move_base实现机器人在已知地图上的自主导航
实现机器人自主测绘
在这篇博客中,我们将首先介绍1-3
ROS 中的控制器插件
为什么要使用控制器插件?
原因1(原理角度)。我们肯定希望我们操纵的机构能够快速、稳定、无误差地达到我们期望的状态。以智能车为例,当给定智能车的期望角速度和线速度时,我们希望智能车能够快速、准确地达到我们的速度目标。
这里强调了我们需要给真正驱动小车移动的机构(电机、伺服)适当的信号。如何根据输入量(期望角速度和线速度)得到执行机构(电机、伺服)的控制量呢?这就需要串联一个控制器。值得一提的是,我们大部分都使用PID控制器。
原因2(应用程序角度)。ROS中的控制器插件不仅为我们提供了简单的控制器,在官方文档中还有如下描述:
为了成功地向机器人底盘发送速度命令,需要以下部分:
1. 直接控制电机的基本速度控制器
2. 基本里程计控制器
3. 发送速度命令的高级程序
我们来逐一分析一下这三个部分,第一个速度控制器可以由PID控制器来实现,第三个高级程序可以由键盘控制指令、rostopic pub指令等来实现,那么第二个是谁提供的呢?
答案很简单,我们的差速控制器插件集成了里程表控制器,因此为了成功使我们的汽车移动,我们必须包含一个控制器插件。
两个差分控制器插件
在上一个系列中大家可以看到我们的小车有两个驱动轮和两个万向驱动轮,所以我们的小车应该采用差速驱动。
同时细心的朋友可以发现,在上一篇博客(URDF与Rviz整合)的launch文件中半岛·BOB官方网站,我们包含了arbotix节点,也就是我们介绍的第一个差速控制器;同样在这篇博客中,在Xacro文件夹下的move.xacro文件中,可以看到我们包含了differential_drive_controller插件,也就是我们要介绍的第二个差速控制器。
Rviz 中的 Arbotix
它用于Rviz(机器人的感知世界),与Gazebo软件相比,无法模拟物理现象,没有传感器反馈,本系列移动机器人采用差分控制方式,需要调整的参数包含在control.yaml中,如下:
controllers: {
# 单控制器设置
base_controller: {
#类型: 差速控制器
type: diff_controller,
#参考坐标
base_frame_id: base_footprint,
#两个轮子之间的间距
base_width: 0.2,
#控制频率
ticks_meter: 2000,
#PID控制参数,使机器人车轮快速达到预期速度
Kp: 12,
Kd: 12,
Ki: 0,
Ko: 50,
#加速限制
accel_limit: 1.0
}
}
通过查看yaml文件,我们可以从另一个角度验证设计base_footprint的重要性,在这个机器人中,base_width的值为base_link(矩形)的长度(0.2)。
我的博客里没有专门针对arbotix控制器的实验,有兴趣的可以看看:
一般情况下arbotix会订阅/cmd_vel,并会做出相应操作驱动小车移动,然后根据Tf变换将小车的运动姿态实时显示在rviz中。
值得一提的是,提供TF变换的功能主要是由robot_state_publisher函数包提供的,这里简单介绍一下robot_state_publisher的应用:
1.在之前的机器人建模系列博客中我们其实主要模拟了两个系统,一个是机器人对世界的感知RvizBOB半岛·体育在线登录,一个是机器人对物理世界的模拟Gazebo。
细心的小伙伴会发现,在查看我们编写的launch文件时不难发现,只与gazebo相关的launch文件可以不需要包含这个功能包,但是包含Rviz的launch文件必须提供这个功能包。
这是我们要介绍的第一个功能——为Rviz显示提供机器人系统各个坐标系(TF树)的状态
2、在后续会介绍的一些机器人上层应用层(AMCL、move_base、slam等)的博客中,这些功能包的实现都需要获取传感器之间的坐标系关系以及关节之间的坐标系关系,从而实现数据坐标转换的功能。robot_state_publish负责提供机器人系统的坐标系关系(TF tree),作为这些应用程序的输入之一。
3.joint_state_publisher经常和robot_state_publisher一起出现,其功能以及和robot_state_publisher的关系可以查看这篇博客:
更多详细信息请参考官方文档:
gazebo 中的 Differential_drive_controller
Gazebo 本身提供了差速控制器插件,该控制器功能和 Arbotix 一样BOB半岛·体育在线登录,订阅 /cmd_vel 即可驱动小车移动。区别在于,在 Gazebo 中设计差速控制器插件之前,需要指定哪些关节是驱动关节,是什么类型的驱动。具体可以参见以下文档:
官方文档已经比较详细了,我就不重复介绍了,官方文档地址为:
#PlanarMove插件
值得一提的是,这份官方文档详细介绍了上一篇博客中提到的各种传感器插件,感兴趣的小伙伴可以看一下
或者你可以阅读这个博客,它也很详细
让机器人动起来
运动控制器安装完成后,我们可以发布速度信息到/cmd_vel主题,实现机器人电机驱动,也就是机器人移动。这里我们可以使用ROS提供的键盘控制节点
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
类似地,我们也可以使用rostopic命令向/cmd_vel发送速度信息来使机器人移动
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
地图构建(SLAM)
在这个过程中,我们选择了官方提供的gmapping节点,并微调了一些参数。
roslaunch hw_car_gazebo.launch所在绝对路径
"use_sim_time" value="true"/>
"gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
"scan" to="scan"/>"base_frame" value="base_footprint"/>
"odom_frame" value="odom"/>
"map_update_interval" value="5.0"/>
"maxUrange" value="16.0"/>
"sigma" value="0.05"/>
"kernelSize" value="1"/>
"lstep" value="0.05"/>
"astep" value="0.05"/>
"iterations" value="5"/>
"lsigma" value="0.075"/>
"ogain" value="3.0"/>
"lskip" value="0"/>
"srr" value="0.1"/>
"srt" value="0.2"/>
"str" value="0.1"/>
"stt" value="0.2"/>
"linearUpdate" value="1.0"/>
"angularUpdate" value="0.5"/>
"temporalUpdate" value="3.0"/>
"resampleThreshold" value="0.5"/>
"particles" value="30"/>
"xmin" value="-50.0"/>
"ymin" value="-50.0"/>
"xmax" value="50.0"/>
"ymax" value="50.0"/>
"delta" value="0.05"/>
"llsamplerange" value="0.01"/>
"llsamplestep" value="0.01"/>
"lasamplerange" value="0.005"/>
"lasamplestep" value="0.005"/>
"joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
"robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />
说明如下:
roslaunch slam_my.launch所在的绝对路径
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
roslaunch map_save.launch所在绝对路径
文件位置并不重要,如下所示:
"filename" value="$(find myNav)/map/map03" />
"map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
filename参数对应构建的地图的存储位置,读取地图时需要输入此参数。
可以使用命令rosrun rqt_gragh rqt_gragh观察slam进程节点的状态
最终得到的地图如下:
最后的想法
SLAM的全称是simultaneous localization and mining,意思是同时定位和建图,可以看出它有定位里程计的功能。在下一篇博客中,我会先单独介绍一下AMCL定位节点。
然后利用move_base节点订阅AMCL的tf消息,供机器人进行自主导航。最后将amcl、move_base节点以及本博客介绍的gmapping节点串联起来,实现机器人的自主环境建图。
基于网格的机器人路径规划算法指南
机器人是集感知、规划、控制技术于一体的智能体,其中路径规划起着承上启下的关键作用,高效、实时性强的路径规划算法对于提高机器人的机动能力具有重要意义。
(扫描二维码查看课程详情)
上一篇:半岛·体育中国官方网 电动车品牌大洗牌!雅迪跌出前三,新龙头是谁?现实太残酷
下一篇:半岛·体育中国官方网 经常用美团app买电影票,不禁对它的推荐选座功能产生了好奇,于是打算自己实现一个类似的算法,美团app的推荐选座界面如下
我要评论