赞
踩
参考链接:https://github.com/bunchofcoders/basic_bocbot
本文为使用ROS 2和Gazebo9搭建仿真机器人详细指南。
确保已按如下说明安装ROS和Gazebo:
尽管此项目基于Ubuntu 18.04说明,但如果是其他安装了ROS 2和Gazebo 9的系统,这些说明同样适用,比如Windows 10、Mac OS等,同时通过学习和实践,将会了解到它们的API、命令和过程大致相同。
本文假定已经具备以下基础:
为什么要学习机器人技术?
机器人应用已经越来越普遍。除了在制造过程中很常见之外,近年来,儿童玩具、智能吸尘器、自动驾驶汽车、无人驾驶飞机等不胜枚举。这些只是几个例子,将来还会有更多例子。不感兴趣,不愿学习,没关系,它们一样会进入到你的生活中,无处不在……
怎么学呢?
在搭建实际的机器人之前,可能需要先使用模拟器来测试新想法。对模拟机器人满意之后,就可以继续搭建实际的机器人了。
ROS提供了搭建机器人各种组件并在它们之间建立安全通信的框架,Gazebo提供了仿真工具,可以使用实际场景测试算法和机器人设计。
本文能学到什么?
学习如何将ROS2和Gazebo9组合在一起,创建具有四轮(差动模型)、摄像头和激光扫描传感器的机器人,并在模拟的环境中测试其操作。
先熟悉一些基本概念。
无论要搭建哪种类型的机器人,机器人都需要执行感知、决策和行动的三个步骤,属于输入-控制-输出这类结构。
就像我们人类通过眼睛、耳朵、鼻子和触摸感知或感知周围的环境一样,机器人使用一个或多个传感器感知周围的环境。可能已经知道的一些传感器如雷达、激光扫描、照相机、激光雷达、温度传感器、声纳、化学检测传感器等。
根据来自传感器的输入和机器人的当前状态,机器人可以执行一些决策。决策可以简单地回答是或否的天气问题,也可以简单地在不同星球上未知地形的路径上行驶。
机器人可以根据使用输入做出的决定执行各种动作。例如,从一个地方移动到另一个地方,移动机器人手臂等各种部件,将消息发送到另一机器人,加快、减速、停止等。
本文中将了解ROS2如何提供执行这三个基本过程的框架。
机器人操作系统不是如Linux或Windows那样的操作系统,而是一个位于操作系统之上的框架,可为开发和运行机器人的各种组件提供便利。
就像Microsoft基础类(MFC)是用于Windows中C++开发和运行桌面应用程序的框架一样,ASP.Net也是用于开发和运行网站的框架。同样,ROS是一个框架,并提供使用C++和Python等开发和运行机器人的工具和库。
ROS 2是ROS 1的下一个版本。大多数概念在ROS 2中仍然相同,与ROS 1保持一致,但是各个组件之间的设计和通信有了显着改进。ROS 2使用DDS。
学习ROS 1会有所帮助,但不是必需的。由于一些概念文档仍在ROS 1维基中。如下是一些了解ROS的有用链接。
Gazebo是ROS使用最广泛的模拟器。在线上有许多非常好的教程。如下是一些入门指南。
假设现在已经熟悉ROS和Gazebo,那么将它们融合应用。
目标是根据从传感器收集的输入执行一些操作(驱动机器人)。将按照以下步骤进行操作。
1 在Gazebo模拟器中搭建简单的室内环境(请参见下图)
2 搭建机器人(mobot)
- 底盘(蓝色)
- 4个轮子(灰色)
- 相机(红色)
- 激光雷达(黑色)
3 编写C++节点处理相机和激光雷达扫描输入
4 编写C++节点将命令发送到轮子以驱动机器人
机器人
世界环境 (室内)
具体步骤如下。
打开一个新的终端并更新ROS 2安装配置,这样ROS2命令可以使用。
relaybot@TPS2:~$ source /opt/ros/dashing/setup.bash
relaybot@TPS2:~$ echo $ROS_DISTRO
dashing
创建工作区
relaybot@TPS2:~$ mkdir -p mobot/src
relaybot@TPS2:~$ cd mobot/src/
1.在Gazebo模拟器中搭建室内环境
创建mobot包
relaybot@TPS2:~/mobot/src$ ros2 pkg create --build-type ament_cmake mobot
going to create a new package
package name: mobot
destination directory: /home/relaybot/mobot/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['relaybot <zhangrelay@sohu.com>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
creating folder ./mobot
creating ./mobot/package.xml
creating source and include folder
creating folder ./mobot/src
creating folder ./mobot/include/mobot
creating ./mobot/CMakeLists.txt
relaybot@TPS2:~/mobot/src$ cd mobot/
relaybot@TPS2:~/mobot/src/mobot$
为室内环境的world文件新建文件夹:
relaybot@TPS2:~/mobot/src/mobot$ mkdir worlds
relaybot@TPS2:~/mobot/src/mobot$ cd worlds/
relaybot@TPS2:~/mobot/src/mobot/worlds$ gedit mobot_room.world
Gazebo中的世界文件包含模拟环境中的所有对象。这些对象是机器人模型、环境、照明、传感器和其他对象等。
Gazebo使用SDF xml文件格式来保存模拟配置。世界文件通常具有.world扩展名。
mobot_room.world代码(补充):
此时,运行如下命令在Gazebo中启动世界环境:
relaybot@TPS2:~/mobot/src/mobot/worlds$ gazebo mobot_room.world
另外,可以按照以下教程创建自定义世界环境。
请确保在世界环境的文件保存为mobot_room.world在mobot/src/mobot/worlds文件中。
2.搭建机器人
现在,已熟悉用来描述仿真对象的SDF文件。ROS使用通用机器人描述格式(URDF)对机器人进行建模,该机器人在xml中描述了各种动态和运动学特性。可以点击此处了解更多信息简单的URDF如下:
- <?xml version="1.0"?>
-
- <robot name="two_link_robot">
-
- <!--Links-->
-
-
-
- <link name="link_1">
-
- <visual>
-
- <geometry>
-
- <cylinder length="0.5" radius="0.2"/>
-
- </geometry>
-
- </visual>
-
- </link>
-
-
-
- <link name="link_2">
-
- <visual>
-
- <geometry>
-
- <box size="0.6 0.1 0.2"/>
-
- </geometry>
-
- </visual>
-
- </link>
-
-
-
- <!--Joints-->
-
- <joint name="joint_1" type="continuous">
-
- <parent link="link_1"/>
-
- <child link="link_2"/>
-
- </joint>
-
- </robot>
在URDF中定义各种机器人元素时,功能很丰富。为了单独管理各种xacro组件并重用它们,ROS提供了一个名为(XML Macro)的程序包,可以将不同的URDF文件组合到一个文件中。它还提供了模板工具来定义这些文件中的变量。使用.xacro扩展名保存这些文件。可以点击此处了解有关XACRO的更多信息。
创建两个xacro文件,一个用于描述机器人,另一个用于描述在下面简要说明的Gazebo插件,用于在仿真中进行交互。
为使Gazebo插件正常工作,请确保已安装以下ROS 2软件包。
gazebo_dev
gazebo_msgs
gazebo_plugins
gazebo_ros
gazebo_ros_pkgs
可以通过运行以下命令进行检查:
$ ros2 pkg list
与Gazebo接口的ROS 2软件包集包含在名为gazebo_ros_pkgs的元软件包中。
注意:所有ROS功能包都使用如下形式ros-<distro>-<package-name>,ros-发行版-功能包名
3.Gazebo插件
插件是一段代码,被编译为共享库并插入到仿真中。该插件可通过标准C++类直接访问Gazebo的所有功能。
插件很有用,因为它们具有如下功能:
除了使用自定义插件,也可以使用gazebo_ros_pkgs提供的现有插件。具体使用如下:
滑行转向差动驱动控制器可实现移动机器人控制,由libgazebo_ros_diff_drive.so提供,详情请点击此处。
相机控制器可读取相机在模拟中捕获的图像,由libgazebo_ros_camera.so提供,此处点击有更多详细信息。
激光雷达控制器从读取激光扫描仪中的点云数据,由libgazebo_ros_ray_sensor.so提供,此处点击有更多详细信息。
在/opt/ros/dashing/lib目录中找到这些库。
在mobot.gazebo文件中定义这些控制器所需的各种属性。
为urdf文件创建目录。
$ cd ~/mobot/src/mobot
$ mkdir urdf
$ cd urdf
$ gedit mobot.gazebo
将以下代码粘贴到mobot.gazebo文件
mobot.gazebo代码补充:
现在,在mobot.urdf.xacro文件中定义机器人描述。
$ cd urdf
$ gedit mobot.urdf.xacro
将以下代码粘贴到mobot.urdf.xacro文件。
mobot.urdf.xacro代码补充:
Xacro代码说明:
在mobot.urdf.xacro文件中
此时,~\mobot_ws\src\mobot目录应如下所示:
relaybot@TPS2:~/mobot/src/mobot$ tree
.
├── CMakeLists.txt
├── include
│ └── mobot
├── package.xml
├── src
├── urdf
│ ├── mobot.gazebo
│ └── mobot.urdf.xacro
└── worlds
└── mobot_room.world
5 directories, 5 files
在colcon编译过程中调用xacro
需要配置编译过程调用xacro工具,从mobot.urdf.xacro和mobot.gazebo文件生成urdf文件。为此,需要编辑CMakeLists.txt文件以指定依赖项。
- # Generate .urdf files from .urdf.xacro files
- # 从.urdf.xacro文件生成.urdf文件
- find_package(xacro REQUIRED)
- # Xacro files Xacro文件
- file(GLOB xacro_files urdf/*.urdf.xacro)
-
- foreach(it ${xacro_files})
- # remove .xacro extension 删除.xacro扩展
- string(REGEX MATCH "(.*)[.]xacro$" unused ${it})
- set(output_filename ${CMAKE_MATCH_1})
-
- # create a rule to generate ${output_filename} from {it} 从{it}创建一条${output_filename}规则
-
- xacro_add_xacro_file(${it} ${output_filename})
-
- list(APPEND urdf_files ${output_filename})
- endforeach(it)
-
- # add an abstract target to actually trigger the builds 添加一个抽象目标实际触发编译
- add_custom_target(media_files ALL DEPENDS ${urdf_files})
此外,需要配置编译过程安装urdf、worlds和meshes目录到install文件夹中。因为所有的软件包都将有ROS环境中的安装目录提供,所以在编译软件包时创建该目录。在CMakeLists.txt中添加以下。
- install(DIRECTORY worlds
- DESTINATION share/${PROJECT_NAME})
-
- install(DIRECTORY urdf
- DESTINATION share/${PROJECT_NAME})
-
- #install(DIRECTORY meshes
- # DESTINATION share/${PROJECT_NAME})
可以从下面复制整个CMakeLists.txt
CMakeLists.txt代码补充:
此时,可以编译程序包啦!开启新终端,请确保更新为ros环境。
$ source /opt/ros/dashing/setup.bash
$ cd ~/mobot
$ colcon build
Starting >>> mobot
Finished <<< mobot [1.08s]
Summary: 1 package finished [1.15s]
$
配置mobot.urdf文件urdf在编译后在目录中生成。
要在Gazebo中看到机器人,需要创建启动(launch)文件夹和启动文件。可以在此处了解ROS 2中的启动系统。
$ cd ~/mobot/src/mobot
$ mkdir launch
$ cd launch
$ gedit world.launch.py
在启动文件中,将做两件事。
将以下代码粘贴到world.launch.py中。
world.launch.py代码补充:
在CMakeLists.txt添加以下代码实现编译后安装到启动文件夹。
- install(DIRECTORY launch
-
- DESTINATION share/${PROJECT_NAME})
此部分已经在附3中,添加完成了。
最终~\mobot\src目录结构应如下所示:
relaybot@TPS2:~/mobot/src/mobot$ tree
.
├── CMakeLists.txt
├── include
│ └── mobot
├── launch
│ └── world.launch.py
├── package.xml
├── src
├── urdf
│ ├── mobot.gazebo
│ ├── mobot.urdf
│ └── mobot.urdf.xacro
└── worlds
└── mobot_room.world
编译并启动:
$ cd ~/mobot
$ colcon build
在启动mobot之前,必须更新bash文件。mobot工作区bash文件将程序包mobot添加到现有ros环境中,使它可使用各种ros2命令,就像其他ros程序包一样。
$ source install/setup.bash
$ ros2 launch mobot world.launch.py
注意:可以使用Tab键完成补全所有ros2命令,在键入ros2后,按Tab键查看可用选项。
应该看到如下图所示的机器人和世界环境。恭喜!此时已经成功在ROS2和Gazebo9搭建了第一个仿真机器人。下一节将学习ROS2各种命令。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。