




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器人操作系统(ROS)机器人操作系统(ROS)机器人模型构建与仿真10.1机器人操作系统(ROS)10.1.1URDF介绍URDF(UnifiedRobotDescriptionFormat,统一机器人描述格式)是一个XML语法框架下用来描述机器人的语言格式,主要用于存储模型的形状、尺寸、颜色等基本属性。在构建机器人模型之前,我们需要了解URDF的语法和常用的标签。(1)URDF语法在URDF中编辑文件需要一定的编写语法,语言要求包含本体、关节、节点的定义以及节点间各关节的连接关系。下面将详细介绍URDF中几种常用的标签。(2)常用标签<link>标签<link>标签描述机器人某个刚体部分的外观和物理属性,包括连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertialmatrix)、碰撞属性(collisionproperties)等。机器人中每个link都会成为一个坐标系。link结构机器人操作系统(ROS)10.1.1URDF介绍一个典型的link标签如下:<linkname="my_link"><inertial><originxyz="000.5"rpy="000"/><massvalue="1"/><inertiaixx="100"ixy="0"xz="0"iyy="100"iyz="0"izz="100"/></inertial><visual><originxyz="000"rpy="000"/><geometry><boxsize="111"/></geometry><materialname="Cyan"><colorrgba="01.01.01.0"/></material></visual><collision><originxyz="000"rpy="000"/><geometry><cylinderradius="1"length="0.5"/></geometry></collision></link>首先,定义该link的名字(linkname),<inertial>标签用于描述link部分的惯性参数,这个标签是可选的,如果未指定,则默认为零质量和零惯性。originxyz和rpy分别为为惯性参考系相对于link参考系的位置和姿态,rpy以弧度表示固定轴滚动、俯仰和偏航角。此外,还可以设置质量(massvalue)、惯性矩阵(inertia)。<visual>标签用于描述link的外观参数,<visual>标签用于描述link的外观参数(可选),<collision>标签用于描述link的碰撞属性(可选),同一个link可以存在多个<collision>标签。它们所定义的几何图形的并集构成了link的碰撞描述。通常,使用更简单的碰撞模型来减少计算时间。机器人操作系统(ROS)10.1.1URDF介绍<joint>标签与人的关节相似,<joint>标签用于描述机器人关节,包括关节运动的位置和速度限制。joint结构一个典型的<joint>标签如下:<jointname="my_joint"type="floating"><originxyz="001"rpy="003.1416"/><parentlink="link1"/><childlink="link2"/><calibrationrising="0.0"/><dynamicsdamping="0.0"friction="0.0"/><limiteffort="30"velocity="1.0"lower="-2.2"upper="0.7"/></joint>每一个joint连接两个link,其中的origin是从parentlink到childlink的转换。接头位于parentlink的原点,是相对于上一个joint的origin描述的,而上面的<link>标签中的origin是相对于joint坐标系表达的。除了必须指定的两个link,关节的其他属性为可选属性,如<calibration>,作用是设置joint的参考位置,用于校准joint的绝对位置;<dynamics>的作用是描述关节的物理属性,如阻尼值、物理静摩擦力等。<dynamics>用于描述运动极限值,仅用于revolute(旋转关节)prismatic(滑动关节)的joint类型。机器人操作系统(ROS)<robot>标签<robot>是URDF中机器人描述文件的根标签,所有其他元素必须封装在其中。一个完整的机器人模型由一系列的<link>和<joint>等标签组成,典型的robot结构如图。在<robot>标签里可以设置该机器人的名称。robot结构10.1.1URDF介绍机器人操作系统(ROS)10.1.2创建URDF模型并校验创建模型(本书配套的机器人模型放在myrobot_description功能包下)创建模型文件myrobot_description/urdf/myrobot.urdf:<?xmlversion="1.0"encoding="utf-8"?><robotname="myrobot_description"><linkname="base_link"><inertial><originxyz="000"rpy="000"/><inertiaixx="0.0029446"ixy="-1.0694E-05"ixz="8.6442E-05"iyy="0.0086395"iyz="-7.9718E-07"izz="0.0097467"/></inertial><visual><originxyz="000"rpy="000"/>……该机器人底盘模型包括6个link和5个joint。6个link包括1个机器人底板、一个与底盘连接的放置激光雷达的台架和4个驱动轮,4个joint负责将驱动轮安装到机器人底板上,并设计了fixed和continuous类型的连接方式,fixed是固定关节,continuous类型的关节围绕单轴无限旋转。这样,一个比较基本的四轮实验小车模型就建立好了。机器人操作系统(ROS)URDF文件校验编程创建URDF文件后,必须进行文件校验,查看是否存在语法错误。对于我们这次创建的机器人模型,可以使用简单的命令工具来分析建立的结构是否存在语法错误,输入以下命令在终端安装工具:$sudoapt-getinstallliburdfdom-tools进入myrobot_description/urdf目录下,然后运行如下命令对myrobot.urdf文件进行检查:$check_urdfmyrobot.urdfcheck_urdf命令将解析myrobot.urdf文件,并显示在解析过程中检查出的错误。如果文件没有错误,终端将打印如图所示的信息。终端信息10.1.2创建URDF模型并校验机器人操作系统(ROS)准备工作在终端运行如下命令,显示所构建的URDF结构关系:$urdf_to_graphizmy_robot.Urdf终端执行完毕后会得到一个PDF文件,展示了编程构建的机器人模型的URDF关系文件:
机器人模型的URDF关系10.1.2创建URDF模型并校验机器人操作系统(ROS)10.1.3在rviz中显示模型可以使用rviz将已创建的机器人模型可视化显示出来,用来检查构建你的模型是否符合设计预期。启动文件目录为myrobot_description/launch/display_urdf.launch,launch文件详细内容如下:<launch><paramname="robot_description"textfile="$(findlingao_description)/urdf/myrobot.urdf"/><!—设置GUI参数,显示关节控制插件--><paramname="use_gui"value="true"/><!—设置joint_state_publisher节点,发布机器人的关节状态--><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"><paramname="rate"value="20.0"/></node><!—设置robot_state_publisher节点,发布TF转换--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"> <paramname="rate"value="20.0"/></node><!--运行rviz可视化界面--><nodename="rviz"pkg="rviz"type="rviz"args="/></launch>创建启动文件机器人操作系统(ROS)运行启动文件在终端输入以下命令运行该启动文件:$roslaunchmyrobot_descriptiondisplay_urdf.launch若出现如下报错:CouldnotfindtheGUI,installthe‘joint_state_publisher_gui’package则使用下面命令进行安装:$sudoapt-getinstallros-melodic-joint-state-publisher-gui若运行成功,则会出现如下界面:10.1.3在rviz中显示模型rviz界面机器人操作系统(ROS)10.1.3在rviz中显示模型在rviz界面中点击Add,添加RobotModel和TF,如图所示,并将FixedFrame修改为base_link,此时将会在rviz中显示之前构建好的机器人模型。添加机器人模型添加TF机器人操作系统(ROS)10.1.3在rviz中显示模型rviz界面中的机器人模型机器人操作系统(ROS)10.1.4在仿真环境中控制小车运动在本节中,我们使用rviz界面来实现机器人运动的仿真控制。需要安装软件包rbx1和ArbotiX功能包。rbx1软件包(来源于《ROSbyExample》),包括路径规划,视觉,语音识别和其他功能的一些程序包。ArbotiX是一款控制电机、舵机的控制板,提供相应的ROS功能包arbotix_ros,该功能包不仅可以驱动真实的驱动板,还提供了一个控制器,通过接收速度控制指令更新机器人的joint状态,从而帮助我们实现仿真机器人的运动控制。机器人操作系统(ROS)首先安装rbx1的软件包,通过执行如下命令将rbx1克隆到本地或拷贝本书配套的源码到工作空间:$gitclone/pirobot/rbx1.git$cdrbx1$gitcheckoutmelodic-devel通过以下命令下载arbotix_ros的源码或复制本书源码至工作空间中:$gitclone/vanadiumlabs/arbotix_ros.git下载完成后编译功能包。软件基础10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)接下来,需要将虚拟机器人启动文件(fake_turtlebot.launch)中修改成自己的urdf文件,修改后的文件如下所示:<launch><paramname="/use_sim_time"value="false"/><!--LoadtheURDF/Xacromodelofourrobot--><!--argname="urdf_file"default="$(findxacro)/xacro.py'$(findrbx1_description)/urdf/turtlebot.urdf.xacro'"/--><argname="urdf_file"default="$(findxacro)/xacro.py'$(findmyrobot_description)/urdf/myrobot.urdf'"/><paramname="robot_description"command="$(argurdf_file)"/><nodename="arbotix"pkg="arbotix_python"type="arbotix_driver"output="screen"clear_params="true"><rosparamfile="$(findrbx1_bringup)/config/fake_turtlebot_arbotix.yaml"command="load"/><paramname="sim"value="true"/></node><nodename="robot_state_publisher"pkg="robot_state_publisher"type="state_publisher"><paramname="publish_frequency"type="double"value="20.0"/></node><!--Weneedastatictransformsforthewheels--><nodepkg="tf"type="static_transform_publisher"name="base_link_to_footprint"args="000000/base_footprint/base_link100"/></launch>软件基础10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)运行如下指令启动仿真机器人和rviz:$roslaunchrbx1_bringupfake_turtlebot.launch$rosrunrvizrviz-d`rospackfindrbx1_nav`/sim.rviz在rviz界面中点击Add,添加RobotModel,将FixedFrame修改为odom,会出现如图界面。rviz界面中的机器人模型10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)使用以下指令通过命令行发送机器人控制命令:$rostopicpub-r10/cmd_velgeometry_msgs/Twist{linear:{x:0.1,y:0,z:0},angular:{x:0,y:0,z:-0.5}}”若想可视化机器人的运动,点击Add,添加Odometry,将Topic修改为/odom。这时,可以看到机器人在做圆周运动。发送机器人控制命令可视化机器人圆周运动10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)除了命令行的方式外,我们还可以通过编写脚本的方式控制机器人移动。创建Python脚本文件timed_out_and_back.py,该节点实现的功能是让小车模型先前进1米,再旋转180度,重复两次。部分内容如下:#-*-coding:utf-8-*-#!/usr/bin/envpythonimportrospyfromgeometry_msgs.msgimportTwistfrommathimportpiclassOutAndBack():def__init__(self):rospy.init_node('out_and_back',anonymous=False)#节点的名字为out_and_backrospy.on_shutdown(self.shutdown)#设置rospy在程序退出时执行的关机函数
self.cmd_vel=rospy.Publisher('/cmd_vel',Twist,queue_size=5)#发布机器人运动的速度
rate=50#以50hz的频率更新控制机器人运动的命令
r=rospy.Rate(rate)#设定相同的值给rospy.Rate()……10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)输入以下命令启动虚拟机器人和仿真环境:$roslaunchrbx1_bringupfake_turtlebot.launch$rosrunrvizrviz-d`rospackfindrbx1_nav`/sim.rviz在rviz界面中点击Add,添加RobotModel,将FixedFrame修改为odom,点击Add,添加Odometry,将Topic修改为/odom。运行如下命令启动控制节点:$rosrunrbx1_navtimed_out_and_back.py机器人仿真运行10.1.4在仿真环境中控制小车运动机器人操作系统(ROS)10.1.5本节小结本节学习了如何使用URDF创建一个真实的机器人模型,并通过rviz可视化工具和Arbotix仿真平台对构建好的机器人模型进行显示,最后建立机器人控制节点控制机器人移动。通过本章的学习,读者可以动手搭建自己的机器人平台,为后续机器人的开发提供更好的基础。机器人操作系统(ROS)机器人操作系统(ROS)MoveIt!的使用10.2机器人操作系统(ROS)10.2.1MoveIt!系统架构MoveIt!系统架构如图所示,内容参考官方文档概念说明。move_group是MoveIt!的核心节点,能够将其他的功能组件综合在一起为用户提供ROS中的动作指令和服务,其本身并不具备强大丰富的功能,依靠各种功能包和插件的集成,通过服务或消息的方式接收机器人发出的消息和机器人的TF坐标变换。MoveIt!系统架构机器人操作系统(ROS)10.2.1MoveIt!系统架构
用户可以通过如下三种方式访问move_group提供的操作和服务:基于move_group_interface的C++接口,基于moveit_commander的Python接口和使用rviz插件的GUI接口。move_group需要使用ROS参数服务器来获取以下三种信息:URDF:在ROS参数服务器上查找robot_description参数,以获取机器人模型的描述信息。SRDF:在ROS参数服务器上查找robot_description_semantic参数,以获取机器人模型的配置信息,配置信息通常由用户使用MoveIt!SetupAssistant创建。Config:机器人的其他配置信息,包括关节限制、运动学、运动规划、感知和其他信息。机器人操作系统(ROS)10.2.1MoveIt!系统架构运动规划(Motionplanning)就是在将机器人从初始姿态和位置移动到目标姿态和位置的过程中,避开环境中的障碍物并防止自身碰撞的一种算法MoveIt!通过插件机制(plugininterface)与运动规划器(motionplanner)进行交互,可以使用多个库的不同运动规划器,使得MoveIt!扩展性更强。MoveIt!中包含有多种运动规划器,包括基于采样的运动规划器OMPL(move_group默认使用),基于搜索的运动规划器SBPL和基于最优化的运动规划器CHOMP等。运动规划器结构如图所示,运动规划请求需要根据实际情况设置一些约束条件:①位置约束:限制link的空间区域。②方向约束:限制link的运动方向(滚转、俯仰和偏航)。③可见性约束:限制link上的某个点在某个区域的可见性。④关节约束:限制关节的运动范围。⑤用户指定约束:用户通过回调函数定义约束条件。运动规划器结构机器人操作系统(ROS)10.2.1MoveIt!系统架构规划场景用于重现机器人的周围状态以及机器人的自身姿态。这一功能主要由规划场景监听器(PlanningSceneMonitor)实现,如图所示:规划场景框图机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂运行如下命令安装MoveIt!,如图所示:$sudoapt-getinstallros-melodic-moveit*安装MoveIt!机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂
MoveIt!配置助手(SetupAssistant)是一个使用MoveIt!配置机器人的图形界面,主要功能是产生机器人的SRDF文件,另外还产生其他配置文件,从而创建一个MoveIt!配置的功能包,完成机器人的配置、可视化和仿真等工作。运行如下命令,启动设置助手,如图所示:$roslaunchmoveit_setup_assistantsetup_assistant.launchMoveIt!配置助手其中,按键“CreateNewMoveItConfigurationPackage”功能为新建配置功能包,按键“EditExistingMoveItConfigurationPackage”功能为使用已有的配置功能包。机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击按键“CreateNewMoveItConfigurationPackage”后,点击“Browse”按钮,加入相关模型,模型位置:robot_arm/robot_arm_description/urdf(需将本书对应代码拷贝至工作空间并进行编译),点击“LoadFiles”完成模型加载,如图所示。加载机械臂模型机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“Self-Collisions”,配置自碰撞矩阵,如图所示。默认的自碰撞矩阵生成器搜索机械臂所有关节,这个碰撞免检矩阵是可以安全地关闭检查,从而减少行动规划的处理时间。采样密度指定了多少个随机机械臂位置来检查碰撞,默认10000个碰撞检查。可点击“GenerateCollisionMatrix”自动完成设置。配置自碰撞矩阵机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“VirtualJoints”,分配机械臂的虚拟关节,如图所示。这里定义机械臂与世界坐标系的关系,把机械臂关节固定到某个物体上,例如机械臂有一个滑动底座,可以将机械臂的底座与里程计(odom)通过一个关节连接,此时机械臂就可以在二维平面滑动。这里用不上,直接跳过。分配机械臂虚拟关节机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“PlanningGroups”,配置机械臂的规划群组,如图所示。规划组可以将机械臂划分为不同的组,例如机械臂本身和夹爪部分。运动规划会针对这一个组完成运动规划,在配置过程中还可以选择运动学解析器。配置机械臂的规划群组机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“AddGroup”,按照图所示内容进行配置,其中:GroupName:规划组的名称。KinematicSolver:配置针对运动规划的运动学求解器,选择的是kdl的运动规划器插件。Kin.SearchResolution:关节空间的采样密度。Kin.SearchTimeout(sec):超时时间。创建机械臂arm组机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“AddKin.Chain”,设置运动学计算中需包含的link,如图所示。具体设置如下:BaseLink:base_linkTipLink:grasping_frame添加运动学工具链机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“AddGroup”,为机械臂夹爪创建如图所示的的gripper组。
创建机械臂夹爪的gripper组机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂将“finger_joint1”和“finger_joint2”加入到右侧的列表中,如图所示。选中“gripper”目录下的“Joints”,点击“EditSelected”,如图所示。进入gripper组中的joint进行配置设置gripper组中的joint机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂配置完成后,主配置界面如图所示。点击“RobotPoses”,定义机械臂的位姿。点击“AddPose”,首先设置机械臂的初始位姿,如图所示。主配置界面设置机械臂位姿机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂位姿设置完成后会出现如图所示的界面。通过更改相关的joint参数,设置机械臂的第二个位姿,如图所示。设置机械臂第二个位姿机械臂位姿配置完成机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“EndEffectors”,配置机械臂的夹爪,如图所示。机械臂夹爪配置
点击“PassiveJoints”,如图所示,这里是配置不能驱动的关节,这些关节不需要MoveIt!对其进行规划和控制。由于本实验没有类似关节,所以无需配置。PassiveJoints配置机器人操作系统(ROS)10.2.2如何使用MoveIt!配置助手配置机械臂点击“AuthorInformation”,设置作者信息。点击“ConfigurationFiles”,生成配置文件。选择一个保存路径,配置助手将所有配置的文件打包成一个功能包(自行命名)进行保存,保存成功后点击“ExitSetupAssistant”即可退出配置助手,如图10-36所示。生成配置文件机器人操作系统(ROS)10.2.3启动MoveIt!
使用MoveIt!配置助手配置完成后,会在相应的路径下生成名为“robot_arm_config”的功能包,包含了大部分控制机械臂所需的启动和配置文件。运行如下命令,测试配置是否成功,如图所示:
$roslaunchrobot_arm_configdemo.launch运行demo.launch通过运动规划面板可以控制机械臂完成拖动规划、随机目标规划等功能。机器人操作系统(ROS)10.2.3启动MoveIt!
拖动机械臂的前端改变机械臂的姿态,点击“Planning”下的“Plan&Execute”,Moveit!开始规划路径,控制机械臂向目标位置移动,如图所示。拖动规划机器人操作系统(ROS)10.2.3启动MoveIt!
点击“Query”下的“GoalState”的下拉选项,选择“randomvalid”,在机械臂的工作范围内随机出现一个目标位姿,点击“Plan&Execute”,机械臂将从当前位姿开始运动,直至达到目标位姿,如图所示。
随机目标规划机器人操作系统(ROS)10.2.4本节小结
本节介绍了MoveIt!的系统架构,并学习了如何使用MoveIt!配置助手生成配置文件,最终配置了一个机械臂,并能通过MoveIt!实现了机械臂的运动规划。机械臂还可实现自主避障、抓取放置等功能,读者可自行学习感兴趣的部分。机器人操作系统(ROS)机器人操作系统(ROS)Hector四旋翼无人机仿真10.3机器人操作系统(ROS)10.3Hector四旋翼无人机仿真四旋翼无人机是一种非共轴式碟形飞行器,在平面上呈十字对称结构并均匀分布有4个旋翼。通过调节四个旋翼旋转产生的升力来控制6个自由度方向的动作。它除了具有一般无人机的优点,如不惧伤亡、制造成本低廉、隐蔽性好、操作灵活等,还具有多旋翼无人机的独特优势:(1)能够在狭小的空间内实现垂直升降、定点悬停、低速飞行、旋转、侧飞及倒飞等,机动灵活,可控性较强;(2)结构简单,拆卸方便,且易于维护;(3)四个旋翼同时旋转提供升力,相对一般无人机,可以使用较小的旋翼和较低的转速,安全性提高。机器人操作系统(ROS)10.3.1四旋翼无人机简介四旋翼无人机是无人飞行器(UAV)的一种,其旋翼对称分布在机体的前后、左右四个方向,四个旋翼处于同一高度平面,且四个旋翼的结构和半径都相同,四个电机对称的安装在飞行器的支架端,支架中间部分安放飞行控制计算机和外部设备。结构形式如图所示。四旋翼无人机的结构形式四旋翼飞行器通过调节四个电机转速来改变旋翼转速,实现升力的变化,从而控制飞行器的姿态和位置。四旋翼飞行器是一种六自由度的垂直升降机,有四个输入力,同时有六个状态输出。机器人操作系统(ROS)10.3.1四旋翼无人机简介如图所示,无人机绕三个坐标轴旋转的角度分别由滚转角(roll)、俯仰角(pitch)和偏航角(yaw)表示。滚转角是飞机对称平面与通过飞机机体纵轴的铅垂平面间的夹角,右滚为正。俯仰角是机体轴与地平面(水平面)之间的夹角,飞机抬头为正。偏航角是机体轴在水平面上的投影与地轴之间的夹角,以机头右偏为正。飞机滚转角、俯仰角和偏航角机器人操作系统(ROS)10.3.2Hector四旋翼无人机仿真本实验采用的是塔姆斯塔特工业大学的HectorDarmstadt团队开源的hector仿真旋翼UAV项目,其开源代码网站为:/tu-darmstadt-ros-pkg/hector_quadrotor。该功能包包含了UAV的URDF描述建模、飞行控制及在Gazebo中运行四旋翼无人机的启动文件等。https://www.teamhector.de/open-source机器人操作系统(ROS)10.3.2Hector四旋翼无人机仿真hector_quadrotorhector_quadrotor_description包含了基础四旋翼及搭载各种传感器的urdf文件;hector_quadrotor_gazebo包含了四旋翼在gazebo仿真中的驱动、插件;hector_quadrotor_teleop包含了四旋翼遥控器接口文件;hector_quadrotor_gazebo_plugins包含了gazebo仿真中气动、推力、控制等模拟文件;hector_quadrotor_demo包含了官网例程的启动文件;hector_quadrotor_actions包含了支持的action(起飞、降落、航点)文件;hector_quadrotor_controller_gazebo包含了gazebo仿真中的控制器接口插件;hector_quadrotor_controllers包含了姿态、位置、速度控制器文件;hector_quadrotor_interface包含了四旋翼的接口文件;hector_quadrotor_model包含了四旋翼的动力学模型文件;hector_quadrotor_pose_estimation包含了四旋翼的位姿解算文件;hector_uav_msgs包含了四旋翼的消息、动作、服务汇总;hector_quadrotor包含了hector_quadrotor功能包的管理文件;整个tu-darmstadt-ros-pkg功能包的各个子功能包的结构如下所示机器人操作系统(ROS)10.3.2Hector四旋翼无人机仿真hector_modelshector_sensors_description包含了sonar/laser/camera/rgb-camera等xacro宏文件及gazeboplugin;hector_xacro_tools包含了转动惯量计算、关节驱动、传感器安装的xacro宏文件;hector_components_description包含了一些例程中采用的传感器搭配xacro文件;hector_model包含了hector_model功能包的管理文件;hector_gazebohector_gazebo_plugins包含了GPS/IMU/MAG/SONAR的gazebo插件(噪声、飘移、频率);hector_gazebo_thermal_camera包含了热成像相机的gazebo插件;hector_gazebo_worlds包含了例程中应用的gazebo场景和启动文件;hector_sensors_gazebo关联hector_sensors_description包;hector_gazebo包含了hector_gazebo功能包的管理文件;hector_localizationhector_pose_estimation包含了传感器数据汇总、位姿估计发布文件;hector_pose_estimation_core包含了EKF核心算法文件;message_to_tf包含了传感器信息的坐标转换文件;hector_localization包含了hector_localization功能包的管理文件;机器人操作系统(ROS)10.3.2Hector四旋翼无人机仿真hector_slamhector_mapping包含了建图、定位节点文件;hector_geotiff包含了存储二位栅格地图及机器人轨迹的节点文件;hector_trajectory_server包含了存储tf轨迹的节点文件;hector_compressed_map_transport包含了地图转换成图片的节点文件;hector_geotiff_plugins包含了扩展栅格地图的插件;hector_imu_attitude_to_tf包含了将姿态角发布到tf的节点文件;hector_imu_tools包含了IMU的位姿方向角解算;hector_map_server包含了地图检索及障碍物检测文件;hector_map_tools包含了一个地图构建的头文件;hector_marker_drawing包含了可视化标记的函数文件;hector_nav_msgs包含了hector_slam包用到的消息、服务文件;hector_slam_launch包含了例程中关于不同配置hector_slam的启动文件;hector_slam包含了hector_slam功能包的管理文件;机器人操作系统(ROS)10.3.3Hector仿真环境搭建为了方便读者调试,我们提供了HectorDarmstadt的源码。本实验使用到的功能包有:hector_quadrotor、hector_models、hector_gazebo、hector_localization、hector_slam、gazebo_ros_pkgs、geographic_info,其中前五个是源码,其余为依赖安装包。首先我们需要对功能包进行编译:$cd~/catkin_ws$catkin_make可能会出现“Couldnotfindxxxpackage”的报错,这是因为缺少相关的依赖,运行以下命令安装相应的依赖包,其中xxx代表所缺少依赖的名称,如图所示:$sudoapt-getinstallros-melodic-xxx此外还可以通过rosdep指令安装所需依赖:$rosdepinstall--from-pathssrc--ignore-src-r-y依赖安装完成后,重新编译功能包。编译运行截图机器人操作系统(ROS)10.3.4启动Hector仿真实验(2)室内飞行同样在hector_quradrotor功能包包含四旋翼飞行器的室内模拟飞行例程。运行以下命令启动节点:$roslaunchhector_quadrotor_demoindoor_slam_gazebo.launch节点启动后,Gazebo中将显示WillowGarage室内办公室的模拟环境,若没有加载出环境,需要将Gazebo的官方模型库(/osrf/gazebo_models)拷贝到路径为~/.gazebo(如若不行,放置在/share/gazebo-9/models)的文件夹里,可以通过以下命令查看是否装好Gazebo的库结果如图所示:$roslaunchgazebo_roswillowgarage_world.launch运行指令可以调出Gazebo窗口并加载模拟办公室的环境。成功配置Gazebo库后,运行如下命令启动室内时SLAM节点,运行结果如图所示:$roslaunchgazebo_rosindoor_slam_gazebo.launch机器人操作系统(ROS)10.3.4启动Hector仿真实验Hector无人机室内Gazebo图像Hector无人机室内Rviz图像机器人操作系统(ROS)10.3.4启动Hector仿真实验调用使能电机的服务,控制无人机起飞,命令如下:$rosservicecall/enable_motors"enable:true"运行如下命令启动Xbox手柄控制节点:$roslaunchhector_quadrotor_teleopxbox_controller.launch通过手柄控制无人机移动,并实时建立环境地图,如图所示。使用rqt_graph工具查看节点通信关系图,其结果如图所示。Hector在室内环境进行地图构建的Rviz图Hectorquadrotor室内SLAM的节点通信关系图机器人操作系统(ROS)10.3.5本节小结本节介绍了无人机飞行原理及相关概念,并通过搭建Hector无人机仿真环境进行室内外SLAM仿真,向读者展示了无人机的控制过程。同时Hector无人机仿真项目提供了较为完善的功能,方便读者进行导航和路径规划的进一步研究。机器人操作系统(ROS)机器人操作系统(ROS)机器人SLAM及自主导航10.4机器人操作系统(ROS)10.4机器人SLAM及自主导航
根据机器人所使用的传感器不同,可以将SLAM(SimultaneousLocalizationandMapping,同步定位与建图)分为激光SLAM和视觉SLAM。激光SLAM是使用激光雷达进行环境感知进而定位建图;视觉SLAM通过视觉传感器进行定位建图。本章我们将使用单线激光雷达实现环境地图的构建,并在已构建完成的地图中实现自主导航。自主导航机器人操作系统(ROS)10.4.1使用gmapping构建地图gmapping原理gmapping算法是基于RBPF(Rao-BlackwellisedParticleFilter)的激光2DSLAM算法。该算法将机器人的里程计位姿信息和激光雷达的点云数据进行结合。RBPFSLAM的核心是通过激光雷达感知环境信息,并在RBPF的基础上引入了改进的建议分布(Proposaldistribution)和自适应重采样技术,在估计粒子分布时,同时考虑里程计位姿信息和最新的激光雷达观测值,从而一定程度上减少了粒子数目和计算量,保证了建图的准确性,有效改善了RBPF的粒子耗散和计算量大的劣势。gmapping算法流程图机器人操作系统(ROS)10.4.1使用gmapping构建地图gmapping原理当节点获取到激光雷达和里程计的数据时,将最新时刻获取的激光雷达观测数据与之前构建的点云地图扫描匹配,确定当前机器人的位置。同时,算法会根据匹配的程度来计算得分,若得分在设定值的范围内,则匹配成功,采用改进的建议分布(即观测模型)进行粒子采样。若失败,则粒子采样使用运动模型x_t^((i))∼p(x_t∣x_(t-1),u_t),其中x_t、x_(t-1)、u_t分别是当前时刻的机器人位姿,上一时刻机器人位姿,当前时刻里程计信息。通过当前时刻里程计数据和上一时刻机器人位姿推算当前时刻位姿并计算粒子权值。根据机器人当前位置和已构建的地图,通过计算来构建下一时刻地图。改进前的RBPF使用运动学模型作为粒子采样的建议分布,由于方差较大,只有少数粒子符合真实分布,因此必须进行重采样来使粒子数符合实际分布。改进后的建议分布在运动学模型的基础上根据观测值和上一时刻地图信息对采样的粒子进行加权,选用权重大的粒子进而更新地图,改进建议分布如下式所示:机器人操作系统(ROS)10.4.1使用gmapping构建地图gmapping原理
机器人操作系统(ROS)10.4.1使用gmapping构建地图PLICP模拟里程计mapping是一个依赖里程计的算法,除了激光扫描数据,也需要有里程计信息(Odometry)输入作为运算的前提,比如轮式里程计,视觉里程计等。laser_scan_matcher功能包是基于ROS的增量式激光扫描配准工具,可以通过扫描连续的两帧sensor_msgs/LaserScan消息之间匹配完成位姿估计,并将估计完成的位姿信息以geometry_msgs/Pose2D类型的话题进行发布。在仅有激光雷达传感器的情况下,该功能包可以作为单独的里程计估计器来使用。laser_scan_matcher功能包的核心是PLICP(点对线迭代最近点)扫描匹配算法。PLICP算法流程和ICP流程基本一样,不同之处在于ICP是找最近邻的一点,以点到点之间的距离作为误差,而PLICP是找到最近邻的两点,两点连线,是以点到线的距离作为误差,因此PLICP的匹配误差比ICP的匹配误差要小的多。机器人操作系统(ROS)安装步骤首先,运行如下命令,安装本次实验相关依赖库:$sudoapt-getinstalllibsdl1.2-dev$sudoaptinstalllibsdl-image1.2-devROS中已经集成了gmapping相关功能包的二进制文件,可以使用如下命令进行安装:$sudoapt-getinstallros-melodic-slam-gmapping下面通过源码安装scan_tools功能包,作用是使用激光数据为gmapping提供里程计。首先,进入工作空间的src文件夹下:$cd~/catkin_ws/src/使用如下命令克隆源码:$gitclone/ccny-ros-pkg/scan_tools.git10.4.1使用gmapping构建地图机器人操作系统(ROS)源码下载完成后,运行如下命令进行编译,也可将本书提供的功能包(scan_tools)拷贝至工作空间并进行编译:$cd~/catkin_ws/$catkin_make本次实验使用的激光雷达为镭神LS01B,这是一款价格低廉的二维雷达,能够实现在25米范围内360度的二维平面扫描。将本书配套代码中的激光雷达驱动功能包(ls01b_v2)复制到当前工作空间的src文件夹下,并进行编译。LS01B激光雷达安装步骤10.4.1使用gmapping构建地图机器人操作系统(ROS)如果在编译过程中出现无法找到csm功能包的错误时,运行如下命令安装csm功能包,并重新编译:$sudoapt-getinstallros-melodic-csm无法找到csm功能包10.4.1使用gmapping构建地图机器人操作系统(ROS)编译成功后,修改scan_tools/laser_scan_matcher/demo文件夹中的demo_gmapping.launch文件,其中<paramname=“serial_port”value=“/dev/ttyUSB0”/>,ttyUSB0为激光雷达端口号,读者根据实际情况修改,修改后的文件如下(部分):<launch>##setupleishenlidar#################<nodename="ls01b_v2"pkg="ls01b_v2"type="ls01b_v2"output="screen"><paramname="scan_topic"value="scan"/><paramname="frame_id"value="laser_link"/><paramname="serial_port"value="/dev/ttyUSB0"/>……10.4.1使用gmapping构建地图机器人操作系统(ROS)配置参数讲解map_udpate_interval:每次更新地图的时间间隔(数据类型:float,默认值:5.0,单位:秒)。该值越小,节点将更频繁的更新地图,代价是计算负荷变大。maxUrange:激光的最大可用范围。光束被裁剪为该值(数据类型:float,默认值:80.0,单位:米)。sigma:扫描匹配过程中cell的标准差(数据类型:float,默认值:0.05)。kernelSize:扫描匹配过程的搜索窗口大小(数据类型:int,默认值:1)。lstep和astep分别是扫描匹配的初始距离步长和扫描匹配的初始角度步长(数据类型:float,默认值:0.05)。iterations:扫描匹配器的迭代次数(数据类型:int,默认值:5)。lsigma:扫描匹配过程中单个激光扫描束的标准差(数据类型:float,,默认值:0.075)。ogain:似然估计时使用的增益,用于平滑重采样效果(数据类型:默认值::3.0)。lskip:每个n+1次扫描进行一次扫描匹配,取值为0时表示每次扫描之后都进行一次匹配(数据类型:int,默认值:0)。srr:位置的噪声项(数据类型:float,默认值:0.1)。srt:方位角的噪声项(数据类型:float,默认值:0.2)。str:位置到方位角的协方差项(数据类型:float,默认值:0.1)。stt:方位角到位置的协方差项(数据类型:float,默认值:0.2)。10.4.1使用gmapping构建地图机器人操作系统(ROS)linearUpdate:只有当机器人至少运动了linearUpdate的距离之后才进行一次新的测量(数据类型:float,默认值:1.0)angularUpdate:只有当机器人至少转动了angularUpdate的角度之后才进行一次新的测量(数据类型:float,默认值:0.5)temporalUpdate:如果上次扫描处理的时间早于更新时间(秒),则处理扫描。小于零的值将关闭基于时间的更新(数据类型:float,默认值:-1.0)。resampleThreshold:粒子重采样的阈值。只有当评价粒子相似度的指标Neff小于该阈值时才进行重采样,所以降低该值意味着提高重采样的频率(数据类型:float,默认值:0.5)。particles:滤波器中的粒子数,粒子数越多,定位精度越高,计算代价越大(数据类型:int,默认值:30)。xmin、ymin、xmax和ymax分别是初始地图大小中X的最小值(数据类型:float,默认值:-100.0)、Y的最小值(数据类型:float,默认值:-100.0)、X的最大值(数据类型:float,默认值:100.0)以及Y的最大值(数据类型:float,默认值:100.0)。delta:地图的分辨率(数据类型:float,默认值:0.05)。llsamplerange:似然估计的距离采样范围(数据类型:float,default:0.01)。llsamplestep似然估计的距离采样步长(数据类型:float,默认值:0.01)。lasamplerange:似然估计的旋转采样范围。(数据类型:float,默认值:0.005)。lasamplestep:似然估计的旋转采样步长(数据类型:float,默认值:0.005)。occ_thresh:占用概率阈值(数据类型:float,默认值:default:0.25)。10.4.1使用gmapping构建地图机器人操作系统(ROS)实验测试首先,将激光雷达接入工控机,通过以下命令查看设备是否正常接入:$ls/dev若出现ttyUSB*(*代表0-9中的某个数,本节中激光雷达的设备是dev/ttyUSB0),则激光雷达驱动成功。通过以下命令更改相应串口权限,允许串口进行数据读写:$sudochmod777/dev/ttyUSB0运行如下命令启动SLAM节点,并移动实验小车进行地图构建,实验结果如图。$roslaunchlaser_scan_matcherdemo_gmapping.launch实验结果10.4.1使用gmapping构建地图机器人操作系统(ROS)在工作空间目录下创建一个map文件夹,通过如下命令保存当前构建的地图,保存后的地图如图所示:$rosrunmap_servermap_saver-f~/catkin_ws/map/mymap保存地图若未安装map_server,可运行如下命令安装功能包:$sudo
apt-get
install
ros-melodic-map-server保存后的地图10.4.1使用gmapping构建地图机器人操作系统(ROS)10.4.2基于地图的定位与自主导航介绍导航框架(1)amclamcl的英文全称是adaptiveMonteCarlolocalization,是在蒙特卡洛定位的基础上,使用自适应的KLD(kullback-leiblerdivergence)方法来更新粒子。蒙特卡洛定位使用粒子滤波的方法进行定位,粒子滤波用通俗的话说就是一开始在地图空间均匀的撒一把粒子,然后通过获取机器人的移动位姿来移动粒子,比如机器人向前移动了一米,所有的粒子也就向前移动一米,不管现在这个粒子的位置对不对,使用每个粒子所处位置模拟一个传感器信息与观察到的传感器信息(一般是激光信息)作对比,从而赋给每个粒子一个权重。之后根据生成的权重来重新生成粒子,权重越高的生成的概率越大。这样的迭代之后,所有的粒子会慢慢地收敛到一起,机器人在地图上的确切位置也就被推算出来了。(2)move_basemove_base功能包的作用是将全局路径规划和局部路径规划结合,从而使机器人完成基于地图的导航任务中的最优路径规划,全局路径规划用于生成地图上机器人的起始点到设置的目标点的路径,局部路径规划用于生成到近距离目标和为了临时躲避障碍物的路径。机器人操作系统(ROS)ROS中的导航框架10.4.2基于地图的定位与自主导航机器人操作系统(ROS)在机器人的导航任务中,首先,机器人需要发布必要的传感器话题(sensortopic),消息类型为sensor_msgs/LaserScan或sensor_msgs/PointCloud,导航目标位置信息(move_base_simle/goal),消息类型为geometry_msgs/PoseStamped。其次,要求机器人发布里程计信息及相应的TF变换。导航功能包用tf功能包来确定机器人在世界坐标系中的位置和相对于静态地图的相关传感器信息,但是tf功能包不提供与机器人速度相关的任何信息,所以导航功能包要求里程计源程序发布一个变换和一个包含速度信息的nav_msgs/Odometry消息。最后,该导航功能包输出控制机器人移动的指令(cmd_vel),并通过geometry_msgs/Twist类型的消息来和底层驱动板通信,从而控制电机运转,使机器人完成相应的移动。ROS中的导航框架10.4.2基于地图的定位与自主导航机器人操作系统(ROS)在导航框架中,机器人的路径规划包括全局路径规划(globalplanner)和局部实时规划(localplanner)。前者根据给定的目标位置进行总体路径规划,后者根据所在位置附近的障碍物进行躲避规划。全局路径规划器使用了A*算法,A*算法是一种高效的路径搜索算法,采用启发函数来估计地图上机器人当前的位置到目标位置之间的距离,并以此选择最优的方向进行搜索,如果失败会选择其他路径继续搜索直到得到最优路径。局部路径实时规划是利用base_local_plann包实现的,该包使用DWA(DynamicWindowapproaches,规划推理和动态窗口)算法,计算机器人每个周期内应该行驶的速度和角度(dx,dy,dthetavelocities)。DWA算法中先离散采样机器人控制空间(dx,dy,dtheta),再对于每个采样速度,从机器人当前的状态,进行模拟预测。ROS中的导航框架10.4.2基于地图的定位与自主导航机器人操作系统(ROS)(3)costmap_2d代价地图(costmap)是机器人收集传感器信息建立和更新的二维或三维地图。在move_base的框架下,costmap_2d为全局路径规划和局部路径规划提供了2D的代价地图。costmap_2d使用的是占用栅格地图,通过多个图层描述环境信息。每个图层描述了一种类型的信息,最终的代价是这些图层叠加的结果。比如说静态地图层(staticmaplayer)描述的是导航的地图信息,障碍物层(obstaclelayer)则记录了环境中的障碍物,膨胀层(inflationlayer)根据用户指定的参数和机器人的尺寸将障碍物的占用栅格区域放大一部分,以防止碰撞。根据导航类型,代价地图又被分成两部分。一个是全局地图(global_costmap),在全局移动路径规划中以整个区域为对象建立移动计划。而另一个被称为局部地图(local_costmap),这是在局部移动路径规划中,在以机器人为中心的部分限定区域中规划移动路径时,或在躲避障碍物时用到的地图。然而,尽管两种地图的目的不同,但表示方法是相同的。costmap用0到255之间的值来表示。简单地说,根据该值可以知道机器人是位于可移动区域还是位于可能与障碍物碰撞的区域。000:机器人可以自由移动的freearea(自由区域)001~127:碰撞概率低的区域128~252:碰撞概率高的区域253~254:碰撞区域255:机器人不能移动的占用区域(occupiedarea)10.4.2基于地图的定位与自主导航机器人操作系统(ROS)障碍距离与costmap值的关系10.4.2基于地图的定位与自主导航机器人操作系统(ROS)10.4.3安装步骤导航框架中包含amcl、move_base等很多功能包,可以通过源码安装,也可以使用如下命令安装:$sudoapt-getinstallros-melodic-navigation用源码安装的方法如下,在工作空间的src文件夹下克隆源码:$gitclone/ros-planning/navigation进入navigation功能包查看版本:$cdnavigation
$gitbranch选择melodic版本的navigation:$gitcheckoutmelodic-devel回到工作空间下进行编译:$cdcatkin_ws/
$catkin_make若编译出现如图所示的问题,说明缺少相应功能包,运行如下命令安装相应功能包:$sudoapt-getinstallros-melodic-tf2-sensor-msgs编译报错机器人操作系统(ROS)10.4.4参数配置文件讲解代价地图配置障碍物信息通过两种代价地图储存:一种是global_costmap,用于全局路径规划;一种是local_costmap,用于本地路径规划和实时避障。两种代价地图的正常使用需要三个配置文件,分别是通用配置文件(CommonConfiguration)、全局规划配置文件(GlobalConfiguration)和局部规划配置文件(LocalConfiguration)。1.通用配置文件obstacle_range:2.5#设置地图中检测障碍物的最大范围(m)。raytrace_range:3.0#设置机器人检测自由空间的最大范围(m)。footprint:[[0.165,0.165],[-0.165,0.165],[-0.165,-0.165],[0.165,-0.165]]#设置机器人在地图上的占用面积,以机器人的中心作为原点。若机器人外形为圆形,则设置robot_radius(圆形半径)。这里我们设置机器人外形为矩形。#robot_radius:0.165inflation_radius:0.1#机器人的膨胀参数(m),参数为0.1表示机器人规划的路径应与障碍物保持大于0.1m的安全距离。max_obstacle_height:0.6#障碍物的最大高度(m)。min_obstacle_height:0.0#障碍物的最小高度(m)。observation_sources:scan#代价地图需要关注的传感器信息scan:{data_type:LaserScan,topic:/scan,marking:true,clearing:true,expected_update_rate:0}#分别为传感器的消息类型、话题、是否使用传感器的实时信息来添加或清除代价地图的障碍物信息以及根据传感器实际发布的速率为每个观测源设置预期更新速率,当传感器低于预期速率时,会在终端中发出警告。地图的更新,来源于机器人发布的传感器消息,代价地图储存由传感器获取的障碍物信息。配置文件名为costmap_common_params.yaml,文件内容与解释如下:机器人操作系统(ROS)全局规划配置文件用于全局代价地图参数的配置,配置文件名为global_costmap_params.yaml,文件内容及解释如下:2.全局规划配置文件global_costmap:global_frame:/map#表示全局代价地图在哪个坐标系下运行,这里选择map参考系。robot_base_frame:/base_footprint#表示全局地图参考的机器人坐标系。update_frequency:1.0#设置全局地图信息更新的频率(HZ)。publish_frequency:1.0#设置全局地图信息发布的频率(HZ)。static_map:true#用来决定代价地图是否需要根据map_server提供的地图信息进行初始化,若不需要已知地图或map_server,将该参数设为false。rolling_window:false#用来设置机器人移动过程中是否需要滚动窗口来保持机器人处于中心位置。resolution:0.01#
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通运输与物流行业智能调度与优化方案
- 全新工作人员聘用合同
- 家居行业智能家居系统整合方案
- 临时变压器安装合同
- 医疗行业质量管理与安全指南
- 游戏电竞行业发展现状及未来趋势分析报告
- 木塑地板安装施工方案
- 地胶净化施工方案
- 微型钢管桩施工方案
- 东莞清溪防水施工方案
- 人教版(2024)八年级下册物理第九章《压强》第4节 跨学科实践:制作简易活塞式抽水机 教案
- 《餐饮业概述》课件 - 探索美食与服务之道
- 2024年黑龙江生态工程职业学院高职单招语文历年参考题库含答案解析
- 某房屋建筑工程施工组织设计
- 2024重庆市招聘社区工作者考试题库带答案
- 东软云医院管理信息系统
- 临床试验入组经验分享
- 第01课 身边的算法 课件
- 中国养老产业发展报告
- 【MOOC】中国传统艺术-篆刻、书法、水墨画体验与欣赏-哈尔滨工业大学 中国大学慕课MOOC答案
- 宁德新能源verify测试题库
评论
0/150
提交评论