参考网址: 1 MooreRobots 2 Richard Wang 3 Shawn Chen
部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg
http://i.youku.com/i/UMTg1NDE4MDM2/videos
注意下面是机器翻译结果~
博客文章
学习打造自主机器人真的很难,尤其是当刚开始关闭。这源于机器人的独特性,它是非常有必要了解一个广泛的跨硬件和软件的概念。
1.模拟启动
ROS仿真是一个很好的起点,以帮助我们从架构的角度获得接触到机器人。我们将能够看到的测距和激光传感器数据能以某种方式变成导致执行有意义的行动机器人运动指令。不幸的是,它可以是很难找到了最新的教程,不是简单地递给我们一个全功能的机器人。
我们分享我们的工作,展示了如何构建从地上爬了凉亭和ROS模拟机器人。我们希望这将节省您的时间。我们已经创建了一个代码库,一个简短的一系列写起坐,和视频演示我们的模拟机器人。
我们的代码模拟了在ROS中自主导航差分驱动机器人。写窗口被分成三个部分:
2.将物理机器人
上的物理机器人运行的代码带来由于硬件变化额外的挑战,环境的不确定性,以及在物理设备上测试的乏味性质。
考虑到这些困难,我们开始用通用的学习硬件现成的机器人,它方便地附带了固件电机驱动器和编码器。请记住,这个机器人缺乏必要的传感器和计算能力运用先进的算法,如SLAM。尽管如此,它仍然是非常有趣的,以了解如何适当控制发送到电动机,以在期望的轨迹移动机器人(即直线移动,圆形,方形等)。
希望你现在更好地理解都使自主式机器人工作所需的部件。祝你好运!
ROS的软件仿真可以帮助您了解如何使机器人“思考”。毕竟,这是一个大的飞跃,从线去以下机器人自动驾驶汽车。可以说,在建设有用的机器人的最大挑战之一就是软件。通过ROS,你就能了解如何使用传感器来确定机器人的根本性的挑战(感应),制定计划,计算出机器人应该做的(计划),然后计算命令机器人执行(表演)。
在本教程中,我们将从头开始开发一个仿真机器人(嗯......相对于turtlebot模拟)。有几个原因,您可能希望走这条路线。
- 通过编辑URDF模型(这样你就不会与turtlebot卡)模拟你自己定制的机器人
- 启用了可开发的算法插入软件和硬件机器人(因为硬件的过度发展容易磨损和撕裂)
- 暴露于ROS机器人架构(这样就可以避免重复从已经了解到的设计错误等)
概述:仿真模型
目标:创建在凉亭模拟器是由ROS访问的URDF模型。
参考文献:有许多有用的教程。他们没有完美地工作对我来说开箱。我怀疑他们是不是跟上时代的,但它也有可能是我没能正确地按照说明进行操作:
结果:从头开始建立一个简单的差分驱动模型,模拟在凉亭和rviz可视化的
库代码
GIT中克隆-b基https://github.com/richardw05/mybot_ws.git
视频演练
兼容性
本教程将过时随着时间的推移毫无悬念地成为。这是用于此的书面记录的硬件和软件:
软件
- ROS:动力学
- 操作系统:Ubuntu的16.04
- OS:7.0.0凉亭
- 内存:8GB DDR4
- SSD:三星EVO
- CPU:英特尔酷睿i5
- GPU:GTX 750ti
目录结构
大多数教程会聚到以下工作空间结构:
- mybot_ws
- SRC
- mybot_control
- 配置
- mybot_control.yaml
- 发射
- mybot_control.launch
- 的CMakeLists.txt
- package.xml中
- 配置
- mybot_description
- 发射
- mybot_rviz.launch
- urdf
- macros.xacro
- materials.xacro
- mybot.gazebo
- mybot.xacro
- 的CMakeLists.txt
- package.xml中
- 发射
- mybot_gazebo
- 发射
- mybot_world.launch
- 世界
- mybot.world
- 的CMakeLists.txt
- package.xml中
- 发射
- mybot_control
- SRC
简要说明:
- mybot_description指定整个机器人结构为链接和关节,并且可以在启动rviz模型。
- mybot_gazebo推出在凉亭环境中的模型,包含不同的仿真世界。
- mybot_control(未使用)能在我们的模型中的关节控制,以便它可以左右移动。
要了解更多关于创建工作区/包,看看这个YouTube上的教程。
创建目录结构的基本骨架,我们开始与工作空间{WORKSPACE} _ws,这里我们设{WORKSPACE} = mybot。
CD〜 MKDIR mybot_ws CD mybot_ws 柳絮INIT MKDIR SRC 柳絮构建 回声 “源〜/ mybot_ws / devel的/ setup.bash” >>的〜/ .bashrc#添加的工作区进行搜索路径
src文件夹中有三个主要的包,{} MODEL _Control,{} MODEL _description,{}模型_gazebo。我们设定{}模型 = mybot。要创建一个包:catkin_create_pkg {程序包名称} {} PKG_DEPENDENCIES。在这种情况下,我们没有{} PKG_DEPENDENCIES =“”。
CD〜/ mybot_ws / src目录/ catkin_create_pkg mybot_control catkin_create_pkg mybot_description catkin_create_pkg mybot_gazebo
创建机器人模型(URDF)
在〜/ mybot_ws / src目录/ mybot_description / urdf,有四个文件:
- mybot.xacro:主文件加载其他三个文件,仅包含URDF项目,如关节和链接
- mybot.gazebo:包含特定凉亭的标签,包裹内嘎斯
- materials.xacro:地图串色
- macros.xacro:宏来帮助简化
运行模式
加载在单独的终端凉亭模拟器和rviz
roslaunch mybot_gazebo mybot_world.launch roslaunch mybot_description mybot_rviz.launch
发送一基本控制器命令,并确保在两个凉亭和rviz机器人移动
rostopic酒吧/ cmd_vel geometry_msgs /扭转“线性: X:0.2 Y:0.0 有:0.0 角度: X:0.0 Y:0.0 Z:0.1"
杂项
如果无法找到凉亭插件,安装ROS运动控制器
命令和apt-get安装ROS动能-ROS控制 命令和apt-get安装ROS动能-ROS控制器 命令和apt-get安装ROS-动能凉亭封邮件 命令和apt-get安装ROS-动能凉亭-ROS
如果机器人不rviz移动,检查TF改造树
rosrun TF view_frames 了Evince frames.pdf
如果你想运行在mybot_controller自己的控制器,看看这个教程
有效地与周围环境交互的机器人需要三个基本组成部分:
- 传感器揭示周围环境
- 规划要弄清楚该怎么做
- 执行器,使机器人移动
我们将展示如何传感器加入到我们的基本差分驱动模式。一旦配有传感器,我们的机器人将有足够的准备使用ROS导航堆栈,这将使它能够自行移动!
概述:模拟传感器
目标:外感受性的传感器添加到我们的模拟差分驱动机器人
用途:启用依赖于感知周围环境的算法(又名自主导航!!)。
参考文献:
库代码
混帐克隆-b base_sensors https://github.com/richardw05/mybot_ws.git
视频演练
模拟摄像机
我们只需要添加的代码两个街区。
- mybot_description / urdf / mybot.xacro - 添加相机型号
- mybot_description / urdf / mybot.gazebo - 添加摄像头插件
启动在凉亭模型。
roslaunch mybot_gazebo mybot_world.launch
运行一个节点,以查看相机数据。
rosrun image_view image_view图像:= / mybot /摄像机1 / image_raw
在凉亭模拟器插入的对象,以确保它在相机视图显示出来。
启动rviz。
roslaunch mybot_description mybot_rviz.launch
/ mybot /摄像机1 / image_raw:确保相机数据可以rviz与主题阅读
模拟激光
再次,代码只有两个上下的块:
- mybot_description / urdf / mybot.xacro - 添加激光模型
- mybot_description / urdf / mybot.gazebo - 添加激光插件
- mybot_description /网格/ hokuyo.dae(可选) - 花式HOKUYO激光模型
启动在凉亭和rviz检查
注意:许多报告中指出,激光扫描未发现任何问题。在mybot.gazebo,考虑切换到libgazebo_ros_gpu_laser.so libgazebo_ros_laser.so
在这一点上,我们已经创建了满足必要的先决条件自主导航模拟差分驱动器型号:变换树,测距,激光扫描仪,和基本控制器。现在,我们可以使我们的仿真机器人使用ROS的导航堆栈走动自身。在本教程中,我们要:
正如你所看到的,这些步骤都是有据可查的,所以我们只是把他们放在一起为我们的机器人。
概述:使用ROS导航堆栈
目标:整合ROS导航堆栈为我们的模拟机器人
用途:启用自主导航,所以我们并不需要远程控制我们的机器人
资源
- 利用ROS导航堆栈启动文件示例
- 提示组织大型项目
- 众多机器人项目的启动文件示例
- roscd turtlebot_navigation /启动/包括更多的启动文件的例子
库代码
混帐克隆-b导航https://github.com/richardw05/mybot_ws.git
视频演练
地图和导航:Turtlebot(可选)
学做自主的Turtlebot此举有助于建立在期待什么样的行为的基线。基本上有三个步骤:创建地图,保存地图,和加载地图。
- 创建地图
下面运行下面的命令。使用teleop四处移动机器人,建立一个准确和全面的地图。
在1号航站楼,推出世界凉亭
roslaunch turtlebot_gazebo turtlebot_world.launch
在2号航站楼,启动地图构建
roslaunch turtlebot_gazebo gmapping_demo.launch
在3号航站楼,推出rviz并设置以下参数:Localmap / Costmap /主题为/图办事处一览/ Costmap /主题为/图
roslaunch turtlebot_rviz_launchers view_navigation.launch
在第4航站楼,开始teleop
roslaunch turtlebot_teleop keyboard_teleop.launch
- 保存地图
在5号航站楼,地图保存一些文件路径
rosrun map_server map_saver -f〜/ mybot_ws / test_map
- 载入地图
关闭所有之前的终端和运行下面的下面的命令。一旦加载,使用rviz设置导航航路点和机器人应该自主地移动。
在1号航站楼,推出世界凉亭
roslaunch turtlebot_gazebo turtlebot_world.launch
在2号航站楼,启动地图构建
roslaunch turtlebot_gazebo amcl_demo.launch MAP_FILE:=〜/ mybot_ws / test_map.yaml
在3号航站楼,启动rviz
roslaunch turtlebot_rviz_launchers view_navigation.launch
地图和导航:我们的机器人
我们遵循我们自己的差分驱动机器人相同的步骤。
- 创建地图
下面运行下面的命令。使用teleop四处移动机器人,建立一个准确和全面的地图。
在1号航站楼,推出世界凉亭
roslaunch mybot_gazebo mybot_world.launch
在2号航站楼,启动地图构建
roslaunch mybot_navigation gmapping_demo.launch
在3号航站楼,推出rviz并设置以下参数:
roslaunch mybot_description mybot_rviz_gmapping.launch
在第4航站楼,开始teleop
roslaunch mybot_navigation mybot_teleop.launch
- 保存地图
在5号航站楼,地图保存一些文件路径
rosrun map_server map_saver -f〜/ mybot_ws / src目录/ mybot_navigation /地图/ test_map
- 载入地图
关闭所有之前的终端和运行下面的下面的命令。一旦加载,使用rviz设置导航航路点和机器人应该自主地移动。
在1号航站楼,推出世界凉亭
roslaunch mybot_gazebo mybot_world.launch
在2号航站楼,启动地图构建
roslaunch mybot_navigation amcl_demo.launch
在3号航站楼,启动rviz
roslaunch mybot_description mybot_rviz_amcl.launch
杂项
- (可选)安装Turtlebot一个很好的参考
命令和apt-get安装ROS-动能turtlebot ROS-动能turtlebot-ROS的应用程序,动能turtlebot- 相互作用ROS-动能turtlebot模拟器ROS-动能kobuki-FTDI ROS动能-AR-径迹 阿尔瓦 - 封邮件
如果ROS找不到turtlebot_gazebo
rosdep更新
- 无法建立一个适当的地图吗?
考虑降低你的贴图的分辨率。改变增量值从1.05至.01:
/opt/ros/kinetic/share/turtlebot_navigation/launch/includes/gmapping.launch.xml
- 自主移动时纺纱很多吗?
设置这些参数,以抑制发送到基站控制器的命令。加
<PARAM NAME = “move_base / DWAPlannerROS / max_rot_vel” 值= “1.0”/> <名称= “move_base / DWAPlannerROS / acc_lim_theta” 值= “10.0”/>
在
/opt/ros/kinetic/share/turtlebot_gazebo/launch/amcl_demo.launch
- AMCL不加载地图是否正确?
当您保存的地图文件,该文件YAML包含对PGM文件的路径; 因此,你不能移动地图文件。如果你这样做,重定向在YAML文件的路径。
我们以一个实际的机器人运行ROS我们的第一个步骤。我们将改变线性和旋转目标速度命令转换为将我们的差分驱动机器人的左右轮执行的运动指令。我们使用不使用传感器数据(如编码器)作为反馈的开环控制系统。
概述:机器人的开环控制
目标:通过速度指令的机器人通过WiFi的开环控制
目的:学习差分驱动机器人的开环控制,使用ROS的消息传递接口通过WiFi,和物理机器人的电机控制。
概述:
我们有两台机器:一台主机运行Ubuntu,并通过树莓派控制的机器人。这些器件通过ROS消息通过网络在一起,以共享相同的ROS主通信。为树莓裨ROS节点控制所述马达(左+右)和发布机器人的编码器的读数。ROS为电机主机计算速度目标节点并更新机器人的里程计。
大纲:
- 安装软件为机器人的树莓派
- 主机和树莓派之间建立联网
- 用于发送电机命令给机器人创建ROS节点
- 测试机器人正确地如下控制命令
库代码
混帐克隆-b的开环https://github.com/richardw05/gopigo_ws.git
视频演练
兼容性:
软件
- ROS:动力学
- 操作系统:Ubuntu的16.04
- 差分驱动机器人:GoPiGo
- 无线USB棒:树莓派USB无线适配器
其它差分驱动机器人会工作,但可能需要修改代码来控制电机。
如果订购一个新的USB加密狗的WiFi,考虑到支持802.11交流,如果你最终打算在未来的流摄像机数据的WiFi设备。
0(GoPiGo)软件安装
机器人的覆盆子裨将与GoPiGo板控制并与各种外围设备进行通信(如马达,IR传感器等)接口。我们将安装ROS并在树莓派的GoPiGo库。
- 在树莓派安装ROS的树莓派使用自定义ROS的安装过程。请按照这里的教程:wiki.ros.org/ROSberryPi/Installing ROS动力学的树莓派。
- 在树莓派安装GoPiGo 有关安装GoPiGo库可以在这里找到:http://www.dexterindustries.com/GoPiGo/programming/python-programming-for-the-raspberry-pi-gopigo/installing-gopigo-python -图书馆
1.(可选)与ROS网络通过WiFi
WiFi联网将允许主机和机器人通过ROS消息进行通信。我们首先要设置Wi-Fi网络,然后配置ROS网络。
- 无线网络设置。
如果你已经可以机器之间的SSH,你可以跳过this.Make确保两台设备都连接到同一子网(或简单地连接到同一个路由器)。我们希望从主机SSH到树莓派。
如果您不知道设备的IP地址,使用NMAP搜索设备的子网。
NMAP -sN 192.168.1.0/24
您现在应该能够通过SSH进入树莓派。
SSH PI @ {IPADDRESS}
如果你有麻烦SSH'ing到树莓派,你可能需要您的主机的SSH公钥添加到树莓派的的〜/ .ssh / authorized_keys中。
作为可选步骤,IP地址是很难记住,改变定期所以请考虑使用主机名代替
主机名-I
- ROS在无线网络
我们设置两个设备通过WiFi与ROS,使它们共享相同的ROS主沟通。我们选择在主机上运行的ROS主machine.On主机,启动ROS主
roscore
在树莓派,其配置为使用主机的ROS主人。
对于一个临时解决方案,
出口ROS_MASTER_URI = HTTP:// IP_ADDRESS:11311
对于一个永久的解决方案,加上线以上到你的.bashrc文件。
试验表明,该工程。在树莓派:
rostopic酒馆/测试std_msgs /浮点32 5.0
在主机上:
rostopic回声/测试
- wiki.ros.org/ROS/Tutorials/MultipleMachines
- nootrix.com/software/ros-networking
- wiki.ros.org/turtlebot/Tutorials/indigo/NetworkConfiguration
2.体系结构
在这个项目中,我们的主机将在高级别目标速度指令读取机器人的身体是转化为机器人执行个人左右轮的命令。如下所示,我们有两个关键ROS节点:diffdrive_controller其被在机器人上运行主机和gopigo_controller上运行。这种分离将让我们通过重新编写GoPiGo具体ROS节点替代其他机器人硬件的未来。
![鉴于机器人主体一些目标速度,我们将其转化为个别左和右轮马达的命令](http://moorerobots.com/api/blog/images/2016/10/Architecture.png)
从的结构借用ROS导航堆栈,我们基本上实现基本控制器。下面显示的是一个更精细的粒面折纹ROS节点之间传输的核心信息的向下。
![跨ROS节点ROS消息的流向。](http://moorerobots.com/api/blog/images/2016/10/Messages.png)
在操作上,我们采取目标线性和旋转速度,并使用逆运动学来生成用于左眼和右轮的切向车轮速度。机器人变换这些切向速度目标纳入角速度目标。然后这些转化到电动机指令并发送至电动机。详情如下实施进一步讨论。
![给定的目标的线性和对机器人本体旋转速度,我们计算相应的左和右车轮的角速度,然后计算相应的电机的命令。](http://moorerobots.com/api/blog/images/2016/10/Operation.png)
3.实施
我们实行从地上爬起来这个项目。我们通过初始化工作空间开始。然后,我们创建了GoPiGo控制器与电机接口。在此之上,我们所建立的差分驱动器控制器将控制速度目标为每个车轮。
- 初始化一个新的工作区
我们创建了一个名为gopigo_ws工作区。回忆柳絮命令:
MKDIR gopigo_ws 柳絮INIT CD gopigo_ws MKDIR SRC 柳絮构建
- GoPiGo控制器
所述GoPiGo控制器接收目标速度,并将它们转换成电机命令使机器人执行。对于每个车轮,我们取目标切向速度(如何快速向前或向后移动),其转换为角速度(如何快速旋转的车轮),然后将其转化为电机命令(马达的方向和速度) 。
定义如下:
- v:切向速度
- 瓦特:角速度
- [R :车轮半径
为涉及切向速度与角速度,
用于马达,我们可以指定电动机方向(0向后1个向前)和电机速度(0最慢; 255最快)。鉴于电机速度是无单位的,我们将创建从目标角速度到电机的命令的映射。
有几个因素需要考虑:有低于该轮根本就没有移动最小电动机速度指令,有一个最大的电机速度指令上面我们不能进一步增加,我们必须谨慎指定在电机旋转方向。
映射角速度车轮的目标(弧度/秒)到电机的命令(0,255) 如以上所描述的,我们创建从角速度的简单分段线性映射到电动机指令为如下所示。当给定的最小和最大电动机速度我们内插的角速度。进一步校准可以帮助创造未来的更细粒度的映射。
资源: - 差分驱动器
差动驱动控制器采取/ cmd_vel消息并计算左右车轮的切向速度。我们如何从线性和机器人的身体各个车轮的速度转动速度(V,W)走这并不完全是显而易见的。幸运的是,这是被称为逆运动在充分研究的问题。
定义以下输入:
:机器人本体的目标线速度
:机器人本体的目标旋转速度
- 大号:机器人轮之间距离
定义以下输出:
:右轮的切向速度
:左车轮的切向速度
我们知道下面的等式成立(请参阅下面的进一步的解释资源)。基本的直觉是,上面公式反映当机器人直线前进运动,而底部方程反映了机器人代替旋转的情况:
有趣的是,我们能够解决这些方程得到:
我鼓励你去尝试和解决车轮速度。结果意义,如果你考虑的边缘情况。试想,如果我们只想机器人直线前进运动,从而
和
。你会得到意料之中相同的切向车轮速度使该机器人直线前进:
试想,如果我们只设定的角度旋转,方便
和
。您还将获得意料之中相反的切向车轮速度使机器人到位旋转。
- 正运动学介绍:MotionAndSensing.pptx
- 正运动学数学:http://www8.cs.umu.se/kurser/5DV122/HT13/material/Hellstrom-ForwardKinematics.pdf
- 全机器人实现教程:http://apprize.info/programming/ros/10.html
- 碱控制器示例:http://wiki.ros.org/pr2_controllers/Tutorials/Using机器人基座控制器,以驱动机器人
- Turtlebot控制代码示例:https://github.com/markwsilliman/turtlebot
- 差分驱动运动学:https://chess.eecs.berkeley.edu/eecs149/documentation/differentialDrive.pdf
- 差分驱动带脚轮:http://robotics.stackexchange.com/questions/8911/how-to-find-kinematics-of-differential-drive-caster-robot
- 运动学优秀篇章:http://www.cs.cmu.edu/~rasc/Download/AMRobots3.pdf
随着gopigo_controller和diffdrive_controller,我们现在有机器人的开环控制。通过发布/ cmd_vel的消息,我们将能够控制机器人的运动。
4.启动
我们引入托管多个方便的启动文件的两个ROS节点:nav_behaviors和gopigo_description。要启动我们的实际机器人的开环控制,在主机上:
roslaunch nav_behaviors nav_behaviors.launch
在树莓派:
roslaunch gopigo_description gopigo_interface.launch
现在,我们的ROS节点监听速度指令,运行在〜/ gopigo_ws /这两个shell脚本之一:
./nav_forward.py ./nav_rotate.py
结果应该是机器人分别向前移动或代替旋转,。如果发生这种情况,您已成功创建一个开环控制器为你的机器人!
如果您没有访问GoPiGo机器人,你仍然可以测试代码:
不同的硬件
如果你有一个不同类型的机器人,那么你将需要编辑gopigo_controller / src目录/ gopigo_controller.py。搜索gopigo_on标志和编辑对传输指令您电机。您可能需要编辑gopigo_description /启动/ gopigo_interface.launch的参数值
无硬件
您仍然可以测试模拟控制器。转到gopigo_description /启动/ gopigo_interface.launch和gopigo_on标志设置为false。这将消除发送到电机的任何命令。然后,您可以检查以下ROS消息意义:
rostopic回声/ cmd_vel rostopic回声/ lwheel_tangent_vel_target rostopic回声/ rwheel_tangent_vel_target rostopic回声/ lwheel_angular_vel_control rostopic回声/ rwheel_angular_vel_control rostopic回声/ lwheel_angular_vel_motor rostopic回声/ rwheel_angular_vel_motor
如果执行nav_forward.py,那么将会看到相应的车轮匹配值。
如果执行nav_rotate.py,然后期望看到对面的值对应的车轮。
在本节中,我们侧重于使用轮编码器的传感器数据有两个目的:
- 闭环PID控制
虽然开环控制实现起来很简单,它并不总是可靠地在实际的机器人运行时,由于工作环境(即从地面摩擦)及内在因素(即左,右马达之间的差异)的组合发挥作用。
闭环控制使用传感器数据(即轮编码器),以调节通过反馈电机控制(即误差作为目标和测量之间的差)。PID控制是一种流行的闭环控制器,实现起来很简单。
- 测距W /惯性导航
测距是有价值的,因为它是:1)在未来使用ROS导航堆栈一个必要的输入和2)让我们看到了机器人的轨迹
我们结合车轮编码器的读数从两个轮子(推算)估计随着时间的推移(测距)机器人的位置。
概述:机器人的闭环控制
目标:用于闭环PID控制和估计机器人测距轮编码器的传感器数据的使用
目的:学习从传感器数据结合反馈来改进机器人控制和状态估计
大纲:
- 阅读机器人轮编码器
- 两个轮子的PID控制
- 航位推算估计机器人里程计
库代码
混帐克隆-b闭环https://github.com/richardw05/gopigo_ws.git
视频演练
建筑
再次,我们有一个主机和通过WiFi连接的机器人。如下图所示,我们添加两个ROS节点。gopigo_state_updater是在机器人上运行,并变换轮编码数据转换成角速度车轮速度的估计。我们扩大gopigo_controller使用PID控制这些编码器的读数。diffdrive_odom是在主机上运行,并使用编码器测算进行航位推算。
![轮编码器的读数被变换成角速度车轮速度,这是用于两个PID控制和航位推算](http://moorerobots.com/api/blog/images/2016/10/Architecture-1.png)
下面显示的是这些ROS节点之间传送的ROS消息。
![从轮编码ROS消息的流向,以里程计](http://moorerobots.com/api/blog/images/2016/10/Messages-1.png)
在操作上,我们首先估计从轮编码器的读数角速度车轮速度。这些都是用于PID控制器,这将减少目标和测量速度之间的误差。下一步,我们通过使用正向运动学来恢复机器人的线性和旋转速度,其被用来估计机器人测距执行航位推算。
![由于车轮编码器的读数,我们可以计算PID控制和航位推算角速度](http://moorerobots.com/api/blog/images/2016/10/Operation-1.png)
履行
我们将通过创建一个新gopigo_state_updater节点和编辑gopigo_controller节点把我们的开环控制到闭环控制。然后,我们在新diffdrive_odom节点进行航位推算。
- GoPiGo状态更新
车轮编码器测量每个车轮实际上多少转过身来,估计其实际的角速度。后来,我们的PID控制器将修正目标和实际车轮速度之间的不匹配。首先,gopigo_state_updater节点必须变换轮编码读数角速度。
有趣的是,GoPiGo的车轮编码器返回走过的厘米数; 相比之下,大多数编码器返回经过蜱虫的数量。任一测量类型可以转化为角速度。对于我们的车轮编码器数据,我们可以计算横移为经过编码器距离的比例弧度。然后我们计算除以在拍摄的时候anuglar速度。
定义如下:
- ð:在距离变化的编码器
- [R :机器人车轮半径
:时间移动的距离编码器读取
- 瓦特:车轮的角速度
为了计算角速度,我们首先使用编码器的距离,以计算所述车轮的圆周穿过的比例。我们用总弧度为一个旋转(显然2 PI)乘以此。最后,我们除以移动的距离所需要的时间。
该方程可以进一步简化导致车轮的角速度。所述gopigo_state_updater节点的这个主要目的是发布这些角度车轮速度。
- GoPiGo控制器瓦特/ PID控制
一旦我们有了一个测量的角车轮速度,我们可以应用PID控制器来校正误差(目标角速度车轮速度 - 测量的角车轮速度)。回想一下,每个车轮的目标角速度车轮速度由diffdrive_controller节点给出。直观地说,这个想法是,如果我们的电机没有在我们的目标速度移动(过慢或过快),那么我们就应该调整我们的电机控制命令(快或慢)来纠正这些差异。例如,如果地板摩擦导致车轮旋转速度低于预期,那么我们需要给予较高的电机控制命令以进行补偿。
PID控制器充分研究所以让我们只提供一点直觉。它往往是容易想象像汽车的巡航控制一维的例子。的状态的系统的是机器人的当前速度。巡航控制设定的目标速度。的控制命令来调整油门踏板。如果移动速度太慢,然后推更难对油门踏板反之亦然。该测量是告诉我们车辆的速度里程表。的错误是测量和目标之间的差。调整误差为0,意味着我们将实现我们的目标速度。在大多数的物理系统,我们不想立即跳到0至100英里每小时,所以我们需要计算的控制命令是逐步调整车速。PID控制器基本上覆盖不同的情况三个单独的控制调整技术的总和:
- (P)roportional -控制命令是一个比例的电流误差(例如,在油门踏板推足够缓慢斜坡上升到目标速度)
- (I)ntegral -控制指令的比例过去的错误(例如更多的天然气,如果我们有很大的误差了一会儿)
- (D)。微分 -控制命令是一个比例未来在误差变化(例如快速反应以在错误的变化)
请注意,关键的区别是考虑(过去,现在和将来)的时间框架。它实际上是没有必要使用所有这三个控制调整,以便随时根据需要进行调整。请看看这些资源,了解更多详情。
资源:除了概念上理解PID控制,我们还需要实现它。尽管方程在连续表示给定的,我们的计算平台必须以离散表示抗衡。对于比例控制,我们只考虑电流测量所以它仅仅是当前误差(目标减计)的比例。对于积分控制,我们可以计算错误的滚动总和。对于差分控制,我们只计算当前和以前的错误之间的区别。
我们希望,pid_control功能表明它是如何实现简单的PID控制器。当然,密钥将试验来确定合适的增益(KP,KI,KD)使用。
- 差分驱动里程计
通过航位推算,我们可以从两个车轮结合轮编码器的传感器数据,不仅恢复机器人的线性和旋转速度(在一个完美的系统中,我们将恢复输入/ cmd_vel),而且还估计其随时间的位置。正向运动学指方程的序列(基于物理系统如何响应给定的输入模式)到传感器的数据转换成机器人测距。我们的运动学方程不承担任何车轮打滑,拖,而本质上是难以准确预测在现实环境中如此测距估计往往不会完全符合实际等因素的影响。
让我们定义以下输入:
- 大号:机器人的轮子之间的距离
- W_L:左车轮的角速度
- w_r:右轮的角速度
:及时更新变化
- X:机器人的前面x位置
- Ÿ:机器人的前一个y位置
:机器人前的姿态
定义以下输出:
- [R :曲率瞬时中心的半径
- V_L:左车轮的切向速度
- V_R:右轮的切向速度
- V_C:机器人的线速度
- w_c:机器人的旋转速度
:机器人的X位置
:机器人的当前y位置
:机器人的当前方向
我们使用假设两种情况之一时,我们的差动驱动机器人正在移动简单正向运动学方程:要么机器人正在移动直线前进或绕“曲率(ICC)的瞬时中心”移动。
我们前进的运动学模型考虑两个瞬时速度情景:直线向前或沿一些循环转变。
- 移动直线前进
如果在前进,动力很简单。注意,机器人的角速度是0,因为两个车轮以相同的速度移动:
当然,我们可以更新机器人的姿势(全球位置和方向)为:
- 旋转一圈
我们首先计算其周围的机器人以下(在这个时刻)的圆的半径。这使我们能够计算出机器人的旋转速度。
然后,我们可以计算出这个圈子的中心。
我们遵循通过更新机器人的姿势。
我们发布了计算机器人的全球姿态在世界上机器人的TF变换和里程计信息两者。测距消息还包括速度信息,这当然意味着,测距消息包括关于机器人的状态的详细信息(位置,方向,线速度,旋转速度)。
资源:
发射
我们将使用车轮编码器传感器数据用于1)PID反馈控制和2)来估计机器人的测距。
我们使用相同的启动文件nav_behaviors.launch和gopigo_interface.launch。我们编辑它们运行额外的ROS节点(diffdrive_odom为nav_behaviors.launch和gopigo_state_updater为gopigo_interface.launch)。尝试运行以下场景。
- 测距的仿真
作为一个基本的完整性检查,我们要确保我们的前进运动转换通过展示,我们可以恢复原来的cmd_vel消息正确。
在gopigo_interface.launch,为所有的以下内容:
<PARAM NAME = “gopigo_on” 值= “假”/>
现在运行的启动文件。在主机上:
roslaunch nav_behaviors nav_behaviors.launch
在树莓派:
roslaunch gopigo_description gopigo_interface.launch
打印以下消息来验证我们的计算是正确的:
rostopic回声/ cmd_vel rostopic回声/ lwheel_tangent_vel_target rostopic回声/ rwheel_tangent_vel_target rostopic回声/ lwheel_angular_vel_target rostopic回声/ rwheel_angular_vel_target rostopic回声/ lwheel_angular_vel_control rostopic回声/ rwheel_angular_vel_control rostopic回声/ lwheel_angular_vel_motor rostopic回声/ rwheel_angular_vel_motor rostopic回声/ lwheel_angular_vel_enc rostopic回声/ rwheel_angular_vel_enc rostopic回声/ lwheel_tangent_vel_enc rostopic回声/ rwheel_tangent_vel_enc rostopic回声/ cmd_vel_enc
发送目标/ cmd_vel消息,并看到这些消息如何变化。
./nav_forward.sh ./nav_rotate.sh
当我们设置gopigo_on为False,gopigo_state_updater节点基本上都会在目标角速度复制(在本质上,模拟仿佛编码器读数完全匹配我们给定的模型)。检查/ cmd_vel和/ cmd_vel_enc匹配。
- 测程的GoPiGo
让我们用实际车轮编码器传感器数据计算测距。
在gopigo_interface.launch,为所有的以下内容:
<PARAM NAME = “gopigo_on” 值= “真”/>
运行上面列出的相同的启动文件。同时打印出同样的ROS消息。
验证/ cmd_vel和/ cmd_vel_enc是相似的。这应该告诉你,以及如何现实我们预期的模式相匹配。
- PID控制在GoPiGo
PID控制应该确保车轮在预期的速度旋转。
在gopigo_interface.launch,设置
<PARAM NAME = “PID_ON” 值= “真”/>
尝试不同的摩擦运行上表面上的机器人,并验证该机器人更可靠地行进相同的距离时,PID控制被接通。