ROS 机器人开发实践

ROS 机器人开发实践

一、URDF 机器人建模

URDF 概述

URDF(Unified Robot Description Format)是 ROS 中用于描述机器人模型的 XML 格式文件。URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型。

URDF 语法详解

1. robot 标签

urdf 中为了保证 xml 语法的完整性,使用了 robot 标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称。

属性:

  • name: 指定机器人模型的名称

link 标签用于描述机器人的一个刚体部分,比如机器人的底座、轮子等。

属性:

  • name: 指定连杆的名称

子标签:

  • visual - 描述外观(对应的数据是可视的)
    • geometry 设置连杆的形状
      • box(盒状): 属性 size=长(x) 宽(y) 高(z)
      • cylinder(圆柱): 属性 radius=半径 length=高度
      • sphere(球体): 属性 radius=半径
      • mesh(为连杆添加皮肤): 属性 filename=资源路径(格式: package://<packagename>/<path>/文件)
    • origin 设置偏移量与倾斜弧度
      • 属性1: xyz=x偏移 y偏移 z偏移
      • 属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
    • material 设置材料属性(颜色)
      • 属性: name
      • 标签: color
        • 属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1])
  • collision - 连杆的碰撞属性
  • Inertial - 连杆的惯性矩阵

3. joint 标签

joint 标签用于描述两个 link 之间的连接关系。

URDF 集成 Rviz 基本流程

需求描述: 在 Rviz 中显示一个盒状机器人

实现流程:

  1. 准备: 新建功能包,导入依赖
  2. 核心: 编写 urdf 文件
  3. 核心: 在 launch 文件集成 URDF 与 Rviz
  4. 在 Rviz 中显示机器人模型

1. 创建功能包,导入依赖

创建一个新的功能包,名称自定义,导入依赖包:urdfxacro

在当前功能包下,再新建几个目录:

  • urdf: 存储 urdf 文件的目录
  • meshes: 机器人模型渲染文件(暂不使用)
  • config: 配置文件
  • launch: 存储 launch 启动文件

2. 编写 URDF 文件

新建一个子级文件夹:urdf(可选),文件夹中添加一个 .urdf 文件:

<robot name="mycar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
        </visual>
    </link>
</robot>

3. 在 launch 文件中集成 URDF 与 Rviz

launch 目录下,新建一个 launch 文件:

<launch>
    <!-- 设置参数 -->
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />

    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" />
</launch>

4. 在 Rviz 中显示机器人模型

rviz 启动后,需要手动添加机器人显示组件:

  1. 点击左下角的 Add 按钮
  2. 选择 RobotModel 组件
  3. 设置 Fixed Frame 为 base_link

5. 优化 rviz 启动

重复启动 launch 文件时,Rviz 之前的组件配置信息不会自动保存,可以保存配置文件:

  1. 将当前配置保存进 config 目录
  2. launch 文件中 Rviz 的启动配置添加参数:args,值设置为 -d 配置文件路径
<launch>
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find 包名)/config/rviz/show_mycar.rviz" />
</launch>

二、SLAM 建图导航

SLAM 建图

SLAM(Simultaneous Localization and Mapping)即同时定位与建图,指机器人在未知环境中,通过传感器数据构建环境地图,同时确定自身在地图中的位置。

gmapping 使用

gmapping 是 ROS 中常用的 SLAM 算法包,使用粒子滤波算法进行建图。

Launch 文件配置示例:

<launch>
    <param name="use_sim_time" value="true"/>
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
        <remap from="scan" to="scan"/>
        <param name="base_frame" value="base_footprint"/><!--底盘坐标系-->
        <param name="odom_frame" value="odom"/> <!--里程计坐标系-->
        <param name="map_update_interval" value="5.0"/>
        <param name="maxUrange" value="16.0"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <param name="lstep" value="0.05"/>
        <param name="astep" value="0.05"/>
        <param name="iterations" value="5"/>
        <param name="lsigma" value="0.075"/>
        <param name="ogain" value="3.0"/>
        <param name="lskip" value="0"/>
        <param name="srr" value="0.1"/>
        <param name="srt" value="0.2"/>
        <param name="str" value="0.1"/>
        <param name="stt" value="0.2"/>
        <param name="linearUpdate" value="1.0"/>
        <param name="angularUpdate" value="0.5"/>
        <param name="temporalUpdate" value="3.0"/>
        <param name="resampleThreshold" value="0.5"/>
        <param name="particles" value="30"/>
        <param name="xmin" value="-50.0"/>
        <param name="ymin" value="-50.0"/>
        <param name="xmax" value="50.0"/>
        <param name="ymax" value="50.0"/>
        <param name="delta" value="0.05"/>
        <param name="llsamplerange" value="0.01"/>
        <param name="llsamplestep" value="0.01"/>
        <param name="lasamplerange" value="0.005"/>
        <param name="lasamplestep" value="0.005"/>
    </node>
</launch>

导航实现

导航系统需要完成以下任务:

  1. 路径规划 - 根据目标点规划路径
  2. 定位 - 确定机器人在地图中的位置
  3. 路径跟踪 - 控制机器人沿着规划路径移动

使用 rviz 工具来演示机器人的建图和导航过程:

  1. 启动建图节点
  2. 使用键盘控制机器人移动,完成建图
  3. 保存地图
  4. 启动导航节点,设置目标点进行导航

三、图像识别应用

图像识别任务

在 ROS 机器人开发中,图像识别是一个重要的应用场景。例如,在深大 ROS 俱乐部内部赛中,需要实现邮件省份识别和二维码识别。

任务要求

  1. 远程测试图像为随机的 20 张图片,并在规定时间(3 分钟)内反馈识别结果

  2. 识别结果格式:

    • 输出邮件省份文字,显示到结果图像中
    • 在结果图像中标出邮件盒在图像中的位置(可框起来),并得到邮件盒中心在图像中大致的像素坐标
    • 结果需以文本保存文件中,格式:广东,(232,311); 江苏,(299,283);...
  3. 技术实现:

    • 使用 PaddleOCR 模块进行文字识别
    • 使用 OpenCV 进行图像处理
    • 通过多种方法进行图像处理,最终可以快速在图片中找到快递盒位置并标注省份和中心点坐标信息

实现方案

集成化处理,一句运行程序语句即可实现功能,程序在 windows 下运行。

主要技术栈:

  • Python
  • PaddleOCR
  • OpenCV
  • ROS 图像消息处理

四、深大 ROS 俱乐部内部赛

深大 ROS 俱乐部内部赛是一个综合性的 ROS 机器人竞赛,包含三个主要部分:

第一部分:ROS 基础(20 分)

完成 ROS 基础概念的编程实验,要求使用 C++ 或 python。

实验 1: 使用 ROS 话题(Topic)机制实现消息发布与订阅

  • 创建一个发布者,每隔 100ms 依次发送斐波拉契数列的数字到话题 /fibonacci 中
  • 创建一个订阅者,订阅该话题,输出订阅结果

实验 2: 使用 ROS 服务(Service)机制实现同步请求与答复

  • 创建服务端,注册 Service,当服务端收到客户端 Service 请求(携带整型参数 a,b)后,服务端返回 a,b 的和给客户端

实验 3: 使用 ROS 动作(Action)机制实现目标请求、进度与完成结果的反馈

  • 创建服务端,注册 Action,客户端发送 action 请求检测 40 个零件,服务端接收后,每隔 1s 检测一个零件,并实时给客户端返回检测进度

第二部分:机器人建图导航任务(40 分)

使用竞赛机器人(turtlebot3),在 gazebo 仿真环境中,完成基于 ROS 的机器人 SLAM 建图导航。

任务 1: 选手操作机器人,在场景中构建出环境地图,并提供地图参数文件

任务 2: 选手提前记录/计算好点位坐标,程序运行后,机器人从出发区出发,往返分拣台中间位置与投递箱进行邮件的抓取投放

第三部分:图像识别(40 分)

图像内容为张贴在盒子上的标签。输出皆为各省区 2~3 字的简写名称。

要求:

  • 远程测试图像为随机的 20 张图片,并在规定时间(3 分钟)内反馈识别结果
  • 输出邮件省份文字,显示到结果图像中
  • 在结果图像中标出邮件盒在图像中的位置,并得到邮件盒中心在图像中大致的像素坐标

总结

ROS 机器人开发实践涉及多个方面:

  1. URDF 建模 - 描述机器人物理结构
  2. SLAM 建图导航 - 实现机器人的自主定位和导航
  3. 图像识别 - 使用计算机视觉技术进行目标识别
  4. 系统集成 - 将各个模块整合成完整的机器人系统

这些实践项目不仅加深了对 ROS 系统的理解,也提升了机器人开发的综合能力。




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 灵巧手遥操方案调研
  • lerobot探索
  • 提问的智慧
  • Markdown 功能使用指南
  • ROS 运行管理与常用组件