《鸿蒙机器人编程》实训指南_第1页
《鸿蒙机器人编程》实训指南_第2页
《鸿蒙机器人编程》实训指南_第3页
《鸿蒙机器人编程》实训指南_第4页
《鸿蒙机器人编程》实训指南_第5页
已阅读5页,还剩105页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从0到1搭建ROS环境课程内容: 本节将从安装Ubuntu开始从0到1逐步安装及搭建好ROS环境教学目标:掌握如何安装Ubuntu系统掌握如何安装及搭建ROS环境一.安装Ubuntu注意!>/etc/apt/sources.list.d/ros-latest.list'或来自国内清华的安装源:$sudosh-c'./etc/lsb-release&&echo"deb/ros/ubuntu/`lsb_release-cs`main">/etc/apt/sources.list.d/ros-latest.list'或来自国内中科大的安装源:$sudosh-c'./etc/lsb-release&&echo"deb/ros/ubuntu/`lsb_release-cs`main">/etc/apt/sources.list.d/ros-latest.list'第三步:设置Key这一步是为了确认原始的代码是正确的,并且没有人在未经所有者授权的情况下修改任何程序代码。通常情况下,当添加完软件库时,你就已经添加了软件库的密钥,并将其添加到操作系统的可信任列表中。$sudoaptinstallcurl$curl-s/ros/rosdistro/master/ros.asc|sudoapt-keyadd-现在我们能够确定代码来自授权网站并且没有被修改。第四步:安装ROS1.安装现在准备开始安装ROS。在开始之前最好先升级一下软件,避免错误的库版本或软件版本产生各种问题。输入以下命令升级该软件:$sudoapt-getupdateROS非常大,相关功能包非常多,根据不同用途,提供了三种安装方式:1)完全版安装最简单的安装方式(并且是推荐的安装方式,但你需要足够大的硬盘空间)就是桌面完整安装(desktop-full)。这将安装ROS、rqt工具箱、rviz可视化环境(3D)、通用机器人库、2D(如stage)和3D(如gazebo)仿真环境、导航工功能包集(移动、定位、地图绘制、机械臂控制),以及其他感知库,如视觉、激光雷达和RGBD摄像头(深度摄像头):$sudoaptinstallros-noetic-desktop-full2)桌面版安装如果你没有足够的硬盘空间,或更喜欢安装特定部分的功能包集,那么第一次安装可以仅安装桌面安装文件,包括ROS、rqt工具箱、rviz和其他通用机器人库。之后在需要的时候,再安装其他功能包集(使用apt命令并查找ros-noetic-*功能包集):$sudoaptinstallros-noetic-desktop3)基础版安装如果你只是想尝试一下,请安装ROS-base。ROS-base通常直接安装在机器人上,尤其是机器人没有屏幕和人机界面,只能TTY远程登录的情况下。它只安装ROS的编译和通信包,而没有任何的GUI工具。在BeagleBoneBlack(BBB)中,你将使用下面命令:$sudoaptinstallros-noetic-ros-base2.配置环境若安装过程中没有报错,那么恭喜你!说明你已经成功安装ROS!原理上,你已经可以使用ROS相关的功能了。但为了方便使用ROS相应的可执行程序或命令,即为了让系统知道可执行或二进制文件以及其他命令的位置,通常需要进行环境变量的设置。具体在终端运行如下脚本:$source/opt/ros/noetic/setup.bash如果你安装了多个ROS版本,可将上面的noetic替换成你想要使用的版本。注意:每个需要使用ROS命令的终端,都需要手动运行上面的脚本。如果你在命令行中输入roscore,那么将看到有程序启动。这是用来测试是否完成ROS安装以及是否正确安装最好的方法。.bashrc文件在用户的home文件夹下(/home/USERNAME/.bashrc)。每次用户打开终端,这个文件会加载命令行或终端的配置。所以你可以添加命令或进行配置以方便用户使用。出于这个原因,我们将在.bashrc文件结束时添加脚本,以避免我们每次打开一个新终端时都要重复输入命令。我们用下面命令:$echo"source/opt/ros/noetic/setup.bash">>~/.bashrc如果要使配置生效,你必须使用下面的命令去执行这个文件,或关闭当前终端,打开另一个新终端:$source~/.bashrc一些用户需要在他们的系统中安装不止一个ROS的发行版。由于每次调用脚本都会覆盖系统当前配置,所以~/.bashrc只能设置你正在使用的那一个版本的setup.bash。为了实现在几个发行版之间切换,你需要调用不同的setup.bash脚本。例如,在.bashrc文件下面可能有这么几行代码:…source/opt/ros/indigo/setup.bashsource/opt/ros/jade/setup.bashsource/opt/ros/kinetic/setup.bashsource/opt/ros/melodic/setup.bashsource/opt/ros/noetic/setup.bash在这种情况下,ROSMelodic版本将被执行。所以你必须确保将要运行的版本是文件中的最后一个,建议只导入单独一个setup.bash。如果你想通过终端检查使用的版本,可以非常简单地使用以下命令。$echo$ROS_DISTRO如果一切正常,你会在终端中看到以下内容。3.安装ROS指定功能包额外功能包安装无论你选择哪一个选项进行安装,你都可以独立安装特定的ROS功能包集(将PACKAGE替换成给定功能包集的名称):$sudoaptinstallros-noetic-PACKAGE4.安装rosinstall到目前为止,你已经安装了运行核心ROS包所需的内容。为了创建忽然管理自己的ROS工作区,有各种各样色工作和需求。例如:rosinstall是一个经常使用命令行工具,他使你能够轻松地从一个命令下载许多ROS包的源树。要安装这个工具和其他构建ROS包的依赖项,请运行:$sudoaptinstallpython3-rosdeppython3-rosinstallpython3-rosinstall-generatorpython3-wstoolbuild-essential5.安装rosdep在使用ROS之前,必须先安装和初始化rosdep命令行工具。这可以使你轻松地安装库和编译源代码时的系统依赖,来运行在ROS中的一些核心组件。你必须安装完ROS后再使用rosdep,因为它是一个独立的工具。现在rosdep默认安装在ROS中。你可以使用下面的命令安装和初始化rosdep:$sudoaptinstallpython3-rosdep$sudorosdepinit$rosdepupdate

运行第一个ROS程序课程内容: 本节将启动turtlesim小乌龟程序,通过本章内容,可了解启动ROS程序的命令,以及熟悉启动ROS程序的流程。教学目标:熟悉启动ROS程序流程掌握ROS常用命令掌握rqt工具的使用一.turtlesim小乌龟仿真程序这是一个经常被用来展示ROS程序特点的小例子。安装ROS通常就已经自带了turtlesim这个程序,如果没有,可通过下面的命令进行安装:$sudoapt-getinstallros-noetic-turtlesim启动ROS管理器:roscore打开一个终端,输入以下命令:$roscoreroscore将启动:aROS

MasteraROS

ParameterServera

rosout

loggingnode运行功能包:rosrun打开一个新的终端,并输入以下命令启动turtlesimdemo。$rosrunturtlesimturtlesim_node(语法:rosrun<package><executable>)turtlesim就是一个功能包,这个功能包下面会有一个可执行的程序就是这个可执行程序的名字。可执行程序的文件名就是turtlesimnode。所以这句话的意思就是rosrun就是说我要启动启动turtlesim这个包下面的node节点。查看话题:rostopiclist显示ROS节点所发布的所有话题。$rostopiclist我们把这个当前启动起来机械系统的这个话题用rostopiclist这样一个命令列出来。发送单个话题:rostopicpubpub就是要用这个工具来去发送消息,所以这个pub就是publish的缩写,就是发送消息。目的:让海龟以0.2m/s爬行。方法:发布cmd_velmessage给/turtle1/cmd_vel的x:完整命令$rostopicpub/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0}}'简化命令$rostopicpub/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2}}'速度消息分成两部分一部分是线速度,就是linear;angular是角速度。我们用xyz这三个轴上的向量来去描述速度。x这个朝向的话,就是他正前方速度是0.2米每秒。在他侧向没有速度。在z轴就是在垂直方向也是没有速度的。那么这样的话就描述了线速度。角速度同样就是说绕着这个小乌龟的哪个轴来去转动的这个角速度。通过这样一个命令就可以让这个小乌龟以0.2米每秒这个速度来去爬行了。这个命令实际上是可以简化成下面的msgs。连续自动发送给话题:rostopicpub如果我想循环的发送同样的这个消息,比如说我想让他这个持续的发送这个消息就用到了下面的这个参数。参量:-r单位Hz(defaultis10Hz)。例如让海龟连续转圈圈:$rostopicpub/turtle1/cmd_vel-r10geometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0.5}}'发送一个既有线速度也有角速度的这样一个速度,他就转圈圈了。我们速度消息的这个软件总线上发。以10赫兹的频率来发送这个消息。这个消息类型跟前面的这个消息类型一致,linear跟前面这个是一样的。这里面多了一个角速度就是绕着Z轴0.5弧度每秒这样一个速度来去做角速度,那么这样话他就会就会转圈圈了。让海龟转起来消息格式定义:rosmsg使用rosmsg工具查看geometry_msgs/Twist消息格式定义$rosmsgshowgeometry_msgs/Twist这个消息分成两部分:一部分是linear,一部分是这个angular。linear是一个向量,这个向量的每一个分量是三个浮点数;angular这个向量也是3个浮点数。记录ROSTopic:rosbagrecord记录所有topic(-a):$rosbagrecord-a-Ocmd_vel_record-a是把所有的topic都给记录下来,-O是把数据都记录下来,存储到cmd_velrecord这样一个文件里面。在同一终端按Ctrl+C结束记录。回放cmd_vel_record.bag(先Ctrl+C停止原来转圈命令的topic发布)。$rosbagplaycmd_vel_record.bag你会发现海龟会像先前的记录装态重新转起来!使用rqt_graph打开rqt_graph:$rqt_graph刚才我们说了rosrun启动个turtlesim这个程序之后,实际上就是启动了一个机器人系统。相当于启动了机械系统。那么这个机械系统他都有哪些节点,这些节点之间是通过哪些话题来去通信的。我们可以用rqtgraph可以看到数据在几个node之间的传递。用rqtgraph就可以把前面说这个计算图给呈现出来使用ROSservice可使用rosservice命令调用一只新的海龟:$rosservicecall/spawn'{x:1.0,y:1.0,theta:1.0,name:''}'也可使用rqt中的servicecaller:$rqt在rqt窗口的工具栏选择Plugins->Services->ServiceCallerService栏选中/spawn

实践课-动手编译及运行第一个ROS程序课程内容:本节将对Turtlesim功能包进行简单解读,了解功能包结构,创建及编译工作空间,了解launch文件作用及roslaunch命令使用。教学目标:了解Turtlesim功能包结构掌握工作空间运行机制掌握launch文件使用一.功能包解析1.Turtlesim功能包结构Turtlesim功能包下主要有images、include、launch、msg、srv、src、tutorials活页夹及CMakeLists.txt和package.xml文件。Images--海龟图片,用于程序加载和显示Include--功能包头文件launch--启动的配置文件msg、srv--topic和service的数据类型定义文件src--海龟绘制的源代码文件tutorials--控制海龟运动的源代码文件功能包共有四个node:turtlesim_node:用来绘制窗口及turtlesim,并通过topic和service提供了控制turtlesim的相关接口;teleop_turtle_key:利用turtlesim的相关接口用键盘控制turtlesim的运动;draw_square:利用相关接口控制turtlesim给出矩形轨迹;mimic:提供了复制海龟运动的接口。后三个node是控制turtlesim的三种方式示例,放在tutorials文件夹。2.核心代码简单解读①TurtleApp类节点turtlesim_node的入口在turtlesim.cpp中,通过QApplication的继承类TurtleApp实现QT程序的初始化,并完成了node的初始化;创建TurtleFrame对象,显示窗口;最后通过QApplication::exec()进入事件循环。node的实例化使用了boost的智能指针,因为在包含档turtle_frame.h中已经进行了对NodeHandle实例化,所以此处使用了reset(),以保证智能指针的正常自动销毁。使用智能指针保证了NodeHandle同一实例对象在TurtleFrame类中的正常使用。具体代码如下:②TurtleFrame类TurtleFrame继承自QFrame类,实现有框架的窗口部件。其主要作用是窗口部件与事件管理、海龟图片加载显示。它提供了clear、reset、spawn、kill四个service用来提供海龟的生成与销毁等操作调用接口。clearCallback通过调用clear函数,用预定的背景色重绘窗口。但并未对海龟图片作任何操作,也就是说只重置背景及清除海龟运动轨迹。实现如下:resetCallback先清空存放海龟对象的map,再重新生成海龟,最后调用clear函数。实现如下:spawnCallback通过spawnTurtle函数以服务调用请求的位置、朝向及名字参数生成海龟。此处会对海龟命名重名给出出错提示。实现如下:killCallback就是删除指定名的海龟,实际是通过key清除存放海龟对象map的相应条目,调用update()实现重绘。实现如下:QT绘制事件及ROS事件QT绘制事件通过update()手动触发或窗口变动自动触发,然后通过重写的paintEvent虚函数槽实现绘制。实现如下:ROS事件通过QT的信号槽机制以16ms为周期进行,用onupdate()函数槽实现。③Turtle类实际上海龟的运动是通过海龟图片的平移与旋转实现的。具体代码在Turtle类中,共有一个订阅的TOPIC、两个发布的TOPIC及三个SERVICE。订阅的TOPIC为:cmd_velcmd_vel:订阅海龟控制的速度信息发布的TOPIC为:pose、color_sensorpose:发布海龟的位置、朝向、及线速度和角速度color_sensor:发布海龟底层的颜色三个服务为:set_pen、teleport_relative、teleport_absoluteset_pen:为设置画笔颜色及宽度的服务接口teleport_relative:以相对位置控制海龟运动teleport_absolute:以绝对位置控制海龟运动turtle对象创建中,同时以生成的海龟名为参数对NodeHandle进行了实例化,所以上面提到的发布的TOPIC及提供的SERVICE都是有海龟名这个命名空间的。二.创建及编译工作空间$mkdir-pcatkin_ws/src在终端上,利用cd命令进入工作空间,然后用catkin_make编译。$cd~/catkin_ws

$catkin_make或$cd~/catkin_ws$catkin_make-DCATKIN_WHITELIST_PACKAGES=“turtlesim”1.将项目源代码中的turtlesim功能包复制到工作空间的src目录下2.编译turtlesim功能包$cd~/catkin_ws

$catkin_make3.新建终端,运行roscore$roscore4.动手运行ROS节点,控制小乌龟运动运行小乌龟节点$sourcedevel/setup.bash$rosrunturtlesimturtlesim_node查看发布的TOPIC及其数据和提供的服务,rostopic和rosservice工具$rostopiclist让海龟作圆周运动(可使用rqt工具):$rostopicpub-r10/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0.3}}'生成新的海龟(可使用rqt工具):$roservicecallspawn330myturtle启动键盘控制:$rosrunturtlesimturtle_teleop_key5.查看launch文件,运行roslaunch启动launch文件:$roslaunchturtlesimmultisim.launch启动launch文件后,可通过一个键盘控制两只启动的小乌龟(键盘控制其中一只小乌龟,另一只小乌龟模仿其运动)。下图示例是用键盘控制小乌龟,也可以通过其它控制方式,如TOPIC工具。此处要体验一下命名空间的作用。

建造自己机器人的3D模型课程内容: 本节主要介绍机器人仿真的相关内容,结合Rviz和Gazebo进行集成使用教学目标:掌握在Rviz中显示机器人模型掌握在Gazebo中显示机器人模型掌握如何在Gazebo中控制机器人运动一.在Rviz中显示机器人模型实现流程:第一步(准备):新建功能包,导入依赖第二步(核心):编写urdf文件第三步(核心):在launch文件集成URDF与RViz第四步(结果):在RViz中显示机器人模型1.新建功能包首先进入工作空间catkin_ws的src目录下,创建名为“spark_description”的功能包,并为其导入相关依赖$cdcatkin_ws/src/$catkin_create_pkgspark_descriptionroscpprospyurdftfgeometry_msgsstd_msgs2.编写urdf文件(用urdf构建一台极简的spark机器人模型)①进入spark_description功能包,创建urdf文件夹,用于存放urdf文件。$cdspark_description$mkdirurdf②导入机器人模型素材,在项目源代码中将meshes文件夹复制到此功能包下项目源码路径:复制到创建的功能包下:③创建urdf文件(spark_description_simple.urdf)将项目源代码中的spak_description_simple.urdf文件复制到urdf文件夹下我们首先创建一个urdf文件去描述一台极简的spark机器人,用robot标签将机器人各部分包含进来。起名为sparkbase,每部分用link标签去表示,分别用joint将各部分连接。下面是详细代码:<robotname="spark_base"> <linkname="base_footprint"/> <linkname="base_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024" rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint> <linkname="spark_stack"><visual><origin xyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint></robot>3.在launch文件集成URDF与RViz①创建launch文件夹,用于存放launch文件$mkdirlaunch$cdlaunch②创建launch文件将项目源代码中的spark_description_simple.launch文件复制到此launch文件夹中③导入Rviz环境,将项目源代码中的rviz文件夹复制到功能包下用urdf文件描述出机器人的基本信息后,我们就可以在rviz里面通过launch文件来启动它。launch文件中,根标签就是launch,然后定义几个在launch文件里面用到的参数。model就是机器人的模型描述文件;usegui表示是否使用gui;publishdefaultpositions表示是否发布这个位置信息。然后我们用一个param标签来将model上传到参数服务器,命名为robotdescription。launch文件的具体编写如下:<launch><argname="model"default="$(findspark_description)/urdf/teaching/spark_description_simple.urdf"/><argname="use_gui"default="false"/><argname="publish_default_positions"default="true"/><paramname="robot_description"command="$(findxacro)/xacro$(argmodel)"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"> <paramname="use_gui"value="$(arguse_gui)"/> <paramname="publish_default_positions"value="$(argpublish_default_positions)"/> <rosparamparam="source_list">["wheel_states"]</rosparam></node><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"/><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findurdf_demo_rviz)/config/urdf.rviz"/></launch>4.在RViz中显示机器人模型用下列命令,启动构造好的spark机器人:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_description_simple.launch下面是运行界面截图:二.在Gazebo中显示机器人模型实现流程:第一步(核心):编写urdf文件第二步(核心):编写launch文件第三步(结果):在Gazebo中显示机器人模型1.编写urdf文件将项目源代码中的spark_description_gazebo_simple.urdf文件复制到此urdf文件夹中如何修改上面的urdf文件使机器人在Gazebo中显示?必须步骤

:在每一个<link>内添加<inertia>标签。可选步骤

:在每一个<link>内添加<gazebo>标签。将外观颜色转换成Gazebo格式;将stl文件转换成dae文件,获得更好的渲染效果;添加传感器插件。在<robot>标签内添加<gazebo>。为了防止机器人陷入障碍物,我们增加了碰撞模型标签。此标签设置了碰撞模型的位置、姿态以及碰撞几何体,以便机器人能够进行碰撞检测。具体代码如下:<robotname="spark"> <linkname="base_footprint"/> <linkname="base_link"> <inertial> <origin xyz="000"rpy="000"/> <mass value="0.916261377"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </collision> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </collision> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </collision> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint><linkname="spark_stack"><inertial><origin xyz="000" rpy="000"/><massvalue="0.224592038"/><inertiaixx="0.052467491"ixy="-0.000000000"ixz="0.001956704"iyy="0.055610919"iyz="0.000000000"izz="0.012118046"/></inertial><visual><origin xyz="000" rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual><collision><originxyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></collision></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint><transmissionname="tran1"><type>transmission_interface/SimpleTransmission</type><jointname="left_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor1"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><transmissionname="tran2"><type>transmission_interface/SimpleTransmission</type><jointname="right_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor2"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>-1</mechanicalReduction></actuator></transmission><gazebo><pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so"><robotNamespace>/</robotNamespace><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType></plugin></gazebo> </robot>2.编写launch文件将项目源代码中的spark_gazebo_simple.launch文件复制到此launch文件夹中具体代码如下:<launch><!--thesearetheargumentsyoucanpassthislaunchfile,forexamplepaused:=true--><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/><!--Weresumethelogicinempty_world.launch--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arguse_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--urdfxmlrobotdescriptionloadedontheParameterServer--><paramname="robot_description"command="$(findxacro)/xacro'$(findspark_description)/urdf/teaching/spark_description_gazebo_simple.urdf'"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--Startingrobotstatepublishwhichwillpublishtf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"value="50.0"/></node><!--Runapythonscripttothesendaservicecalltogazebo_rostospawnaURDFrobot--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen" args="-urdf-modelspark-paramrobot_description"/></launch>3.在Gazebo中显示机器人模型用下列命令,将spark机器人模型加载到gazebo:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_gazebo_simple.launch下面是运行界面截图:三.在gazebo中实现spark机器人的运动仿真实现流程:第一步(核心):编写urdf文件第二步(核心):创建控制器配置文件第三步(核心):编写launch文件第四步(结果):启动Gazebo并发布spark_controller/cmd_vel消息控制机器人运动1.编写urdf文件将项目源代码中的spark_description_gazebo.urdf文件复制到此urdf文件夹中如何修改上面的urdf文件使机器人在Gazebo中实现运动控制?必须步骤

:向URDF文件中的joint添加<transmission>标签。向URDF文件中添加ros_control插件,并添加相应插件的controller配置文件。可选步骤:

在每一个<link>内添加<gazebo>标签。将外观颜色转换成Gazebo格式;将stl文件转换成dae文件,获得更好的渲染效果;添加传感器插件。在每一个<joint>内添加<gazebo>标签。设置适当的阻尼动力系数;添加执行器控制插件。在<robot>标签内添加<gazebo>。为了完成传动所描述的这种动力驱动,我们需要加载roscontrol这个插件。这里我们用到了gazebo里面的一个插件libgazeboroscontrol。首先要在这个gazebo标签里加上plugin插件的标签,连同设置了你的插件的名字、文件名。这里面还允许你设置机器人的命名空间,还有这个机器人的仿真的类型。具体代码如下:<robotname="spark"> <linkname="base_footprint"/> <linkname="base_link"> <inertial> <origin xyz="000"rpy="000"/> <mass value="0.916261377"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </collision> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </collision> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </collision> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint><linkname="spark_stack"><inertial><origin xyz="000" rpy="000"/><massvalue="0.224592038"/><inertiaixx="0.052467491"ixy="-0.000000000"ixz="0.001956704"iyy="0.055610919"iyz="0.000000000"izz="0.012118046"/></inertial><visual><origin xyz="000" rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual><collision><originxyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></collision></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint><transmissionname="tran1"><type>transmission_interface/SimpleTransmission</type><jointname="left_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor1"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><transmissionname="tran2"><type>transmission_interface/SimpleTransmission</type><jointname="right_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor2"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>-1</mechanicalReduction></actuator></transmission><gazebo><pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so"><robotNamespace>/</robotNamespace><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType></plugin></gazebo> </robot>2.创建控制器配置文件控制器的一些参数,我们通常把它写成一个配置文件。命名为controller.yaml①在功能包下创建config文件夹,用于存放配置文件$mkdirconfig$cdconfig②将项目源代码中的controller.yaml文件复制到此config文件夹中具体代码如下:joint_state_controller:type:joint_state_controller/JointStateControllerpublish_rate:20spark_controller:type:"diff_drive_controller/DiffDriveController"left_wheel:"left_wheel_joint"right_wheel:"right_wheel_joint"wheel_separation:0.11wheel_radius:0.04publish_rate:50.0#defaultsto50pose_covariance_diagonal:[0.001,0.001,1000000.0,1000000.0,1000000.0,1000.0]twist_covariance_diagonal:[0.001,0.001,1000000.0,1000000.0,1000000.0,1000.0]cmd_vel_timeout:20.0#wetestthisseparately,giveplentyfortheothertests我们这里面将控制器的这个参数写到controller.yaml,然后我们用rosparam来将这些配置参数加载到参数服务器上。这里面控制器包括jointstatecontroller和sparkcontroller。3.创建launch文件将项目源代码中的spark_gazebo.launch文件复制到此launch文件夹中具体代码如下:<launch><!--urdfxmlrobotdescriptionloadedontheParameterServer--><paramname="robot_description"command="$(findxacro)/xacro'$(findspark_description)/urdf/teaching/spark_description_gazebo.urdf'"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--Startingrobotstatepublishwhichwillpublishtf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"value="50.0"/></node><!--thesearetheargumentsyoucanpassthislaunchfile,forexamplepaused:=true--><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/><!--Weresumethelogicinempty_world.launch--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arguse_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--Runapythonscripttothesendaservicecalltogazebo_rostospawnaURDFrobot--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen" args="-urdf-modelspark-paramrobot_description"/><!--LoadjointcontrollerconfigurationsfromYAMLfiletoparameterserver--><rosparamfile="$(findspark_description)/config/controller.yaml"command="load"/><!--loadthecontrollers--><nodename="controller_spawner"pkg="controller_manager"type="spawner"respawn="false" output="screen"args="joint_state_controllerspark_controller"/></launch>4.启动Gazebo并发布spark_controller/cmd_vel消息控制机器人运动用下列命令,将spark机器人模型加载到gazebo:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_gazebo.launch当我们把机器人的urdf上传到服务器上,并且把它加载到gazebo。这时,我们就可以通过/spark_controller/cmd_vel话题控制spark在gazebo中运动了。当然也可以添加更多功能,例如视觉传感器等。 通过发布话题命令,控制Spark在gazebo中运动:$rostopicpub-r10/spark_controller/cmd_velgeometry_msgs/Twist'{linear:{x:1,y:0,z:0},angular:{x:0,y:0,z:0}}'

实践课-创建仿真机器人与实体机器人同步课程内容: 本节主要介绍Arbotix控制机器人模型运动的功能,以及操控实体机器人和仿真机器人的同步运动。教学目标:掌握Arbotix控制机器人模型运动掌握启动实体机器人运动的demo掌握操作实体机器人及仿真机器人进行同步运动一.控制仿真机器人运动1.准备工作先去github下载Spark的代码:$cd~$gitclone/NXROBO/spark_noetic.git在Spark的开发包里,已经包含了Spark的仿真启动环境,我们先从启动脚本入手来了解下Spark的仿真启动内容。launch文件路径: spark_noetic/src/spark/spark_description/launch/spark_description_rviz.launch2.加载模型下图是launch文件的具体内容。<!--sparkdescriptionwithrviz--><launch><argname="camera_type_tel"default="astrapro"doc="cameratypes[asatra,astrapro,d435...]"/><argname="lidar_type_tel"defaul

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论