机器人操作系统 (ROS) 是研究和工业中最受欢迎的机器人软件框架之一。它具有多种功能,可以在机器人中实现不同的功能,而无需从头开始实现。
首先向您展示 ROS 的基础知识,以便您了解差分机器人的基础知识。 然后,您将了解机器人建模以及如何使用 ROS 对其进行设计和模拟。 接下来,我们将设计机器人硬件和接口执行器。 然后,您将学习使用 ROS 配置和编程深度传感器和 LIDAR。 最后,您将使用 Qt 框架为您的机器人创建一个 GUI。
代码的第一部分调用upload_model.launch文件,创建robot_description参数。 如果它成功,那么它将在 Gazebo 开始一个空世界:
<launch>
<include file='$(find chefbot_description)/launch/upload_model.launch' />
<include file='$(find gazebo_ros)/launch/empty_world.launch'>
<arg name='paused' value='false'/>
<arg name='use_sim_time' value='true'/>
<arg name='gui' value='true'/>
<arg name='recording' value='false'/>
<arg name='debug' value='false'/>
include>
那么 robot_description 参数中的机器人模型在Gazebo中是如何显示的呢? 启动文件中的以下代码片段完成了这项工作:
<node name='spawn_urdf' pkg='gazebo_ros' type='spawn_model' args='-param robot_description -urdf -z 0.1 -model chefbot' />
在gazebo_ros 包中名为spawn_model 的节点,将读取robot_description 并在Gazebo 中生成模型。 -z 0.1 参数表示要放置在 Gazebo 中的模型高度。 如果高度为 0.1,模型将在高度为 0.1 处生成。 如果启用重力,则模型将掉落到地面。 我们可以根据需要更改此参数。 -model 参数是 Gazebo 中机器人模型的名称。 该节点将解析 robots_description 中的所有 Gazebo 参数,并在 Gazebo 中启动模拟。
生成模型后,我们可以使用以下代码行发布机器人转换 (tf):
<node pkg='robot_state_publisher' type='robot_state_publisher' name='robot_state_publisher'>
<param name='publish_frequency' type='double' value='30.0' />
node>
我们以 30 Hz 的频率发布 ROS tf。
机器人上的深度传感器提供环境的 3D 坐标。 为了实现自主导航,我们可以使用这些数据,创建 3D 地图。 除此之外,还有不同的技术可以创建环境地图。 我们为这个机器人使用的一种算法称为 gmapping (http://wiki.ros.org/gmapping)。 gmapping 算法主要使用激光扫描,创建地图,但在我们的例子中,我们从传感器获得了完整的 3D 点云。 我们可以通过获取深度数据的切片,转换激光扫描的 3D 深度数据。 此启动文件中的以下 nodelet (http://wiki.ros.org/nodelet) 能够接收深度数据并将其转换为激光扫描数据:
<node pkg='nodelet' type='nodelet' name='laserscan_nodelet_manager' args='manager'/>
<node pkg='nodelet' type='nodelet' name='depthimage_to_laserscan'
args='load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager'>
<param name='scan_height' value='10'/>
<param name='output_frame_id' value='/camera_depth_frame'/>
<param name='range_min' value='0.45'/>
<remap from='image' to='/camera/depth/image_raw'/>
<remap from='scan' to='/scan'/>
node>
launch>
nodelet 是一种特殊的 ROS 节点,具有称为零复制传输的属性,这意味着,它不需要网络带宽来订阅主题。 这将使从深度图像 (sensor_msgs/Image) 到激光扫描 (sensor_msgs/LaserScan) 的转换更快、更高效。 nodelet 的其他属性之一是它可以作为插件动态加载。 我们还可以设置这个 nodelet 的各种属性,例如 range_min、图像主题的名称和输出激光主题。
我们已经在 Gazebo 中看到了模拟机器人。 现在,我们将更详细地查看, URDF 中与模拟相关的标签以及在 URDF 模型中,包含的各种插件。
大多数 Gazebo 特定的标签都在文件中。 此外,在模拟中,使用了中的一些标签。 在中定义 和 标签对于我们的模拟非常重要。 URDF 中的 标签,定义了机器人链接周围的边界,主要用于检测特定链接的碰撞,而 标签,包含链接的质量和转动惯量。 下面是 标签定义的一个例子:
<inertial>
<mass value='0.564' />
<origin xyz='0 0 0' />
<inertia ixx='0.003881243' ixy='0.0' ixz='0.0'
iyy='0.000498940' iyz='0.0'
izz='0.003879257' />
inertial>
详情参阅 - 亚图跨际