跳至主要內容

机器人编程

2024年5月10日大约 22 分钟

机器人编程

TF

https://wiki.ros.org/tf/Tutorialsopen in new window

TF 为一个 ROS 功能包, 可用于跟踪与定义机器人上多个不同位姿的刚体, 根据刚体坐标系之间的变换关系构建坐标变换树
此时节点仅需要与主节点中的 TF 变换树进行交互即可查询与修改机器人上刚体坐标系
通过监听 TF 坐标树, 从坐标变换树中查询坐标系之间的关系; 通过向 TF 发布坐标系信息, 更新坐标变换树并同步到各个子坐标系的变换

在 TF 变换树中, 使用字符串表示各个坐标系, 一般也会仿照命名空间使用 / 划分层次防止名称冲突

TF 命令行工具

可通过 roslaunch turtle_tf turtle_tf_demo.launch 运行关于 TF 的例程以实验命令行工具的使用
注意 TF 的命令行工具均为特殊的 ROS 节点, 因此需要通过 rosrun tf ... 运行, 且根节点需要存在

在 Python3 中使用 TF

由于功能包 TF 存在问题, 只能在 Python2 中使用, 如果要在 Python3 中使用 TF 需要手动重新编译, 具体步骤如下

TF 节点编程

在使用节点与 TF 交互时, 需要将功能包作为运行时与编译时依赖导入

对于更新坐标系信息的节点, 可使用对象 tf.TransformBroadcaster 管理节点向 TF 变换树发布坐标系信息

对于获取坐标系信息的节点, 可使用对象 tf.TransformListener 管理节点向 TF 变换树获取两个坐标系之间的位姿信息

由于 TF 变换树间传递消息存在约 1 秒的延时, 因此直接查询最新的变换时, 该变换的时间戳不能确定
为了获取最新的变换信息且同时有一个关于该变换较准确的时间信息, 推荐使用以下代码用于接收变换

try:
    # 尝试接收最新变换信息
    now = rospy.Time.now()
    listener.waitForTransform("target_frame", "source_frame", now, rospy.Duration(<等待时长>))
    (trans,rot) = listener.lookupTransform("target_frame", "source_frame", now)
except:
    # 没有接收到新的坐标系变换时, 跳过本次控制循环
    continue

TF 姿态函数

更多信息见 https://wiki.ros.org/tf/Overview/Transformationsopen in new window

tf 功能包中还提供了一系列实用函数用于姿态间的变换, 通过 import tf.transformations 导入姿态变换模块, 该模块的常用函数有

RVIZ

RVIZ 即一个 ROS 功能包, 提供了将消息可视化的仿真环境, 可以可视化多种 ROS 消息
默认情况下 RVIZ 将不会显示任何内容, 需要进行手动配置, 让 RVIZ 正确订阅与显示消息

通过 apt install ros-melodic-rviz 可以安装 rviz

由于 rviz 本质也为一个节点, 因此启动 rviz 前需要先使用 roscore 启动主节点

RVIZ 配置

为了避免每次启动 RVIZ 后, 需要重复手动配置, 可将 RVIZ 的配置导出

URDF

URDF 即统一机器人描述格式, 是在 ROS 中, 一种用于描述机器人连杆外形与特性以及连杆间关节的 XML 格式数据文件

完整参考文档见 https://wiki.ros.org/urdf/XMLopen in new window

基本说明

URDF 可用于描述多种类型的机器人, 包括并联, 串联, 移动等多种类型的机器人
在 URDF 中, 认为机器人由两种类型的部件组成, 即连杆与关节

URDF 使用时有以下基本注意

在使用 URDF 中, 均使用 origin 自闭合标签定义新的坐标系属性, 注意

连杆描述

在 URDF 中, 通过 link 标签以及其中的子标签描述一个连杆

该标签有以下属性

该标签具有以下用于描述连杆特性的子标签

关节描述

在 URDF 中, 通过 joint 标签以及其中的子标签描述一个关节

该标签有以下属性

该标签具有以下常用的用于描述关节特性的子标签

XACRO 参数化模型

XACRO 也属于一个 ROS 功能包, 该功能包能扩展 URDF 的语法, 使 URDF 的定义更加灵活
具体使用可参见文档 https://wiki.ros.org/xacroopen in new window

使用 XACRO 前需要注意

XACRO 提供了以下常用的参数化方法

使用 XACRO

直接检查 URDF 模型

使用命令 check_urdf <file> 可以简单检查 URDF 文件是否存在语法错误, 以及进行初步解析

对于 XACRO, 可使用以下命令创建一个临时解析结果用于检查, 并在检查后删除
xacro <文件名>.urdf.xacro > tmp.urdf ; check_urdf tmp.urdf ; rm tmp.urdf

在 RVIZ 中查看 URDF 模型

使用 apt 命令安装 URDF 模型仿真有关功能包

使用 launch 文件统一管理节点, 基本模板如下 (注意打开 launch 文件前, 应够保证没有正在运行的 roscore)

<launch>
    <!-- 将 URDF 文件导入参数服务器 -->
    <param name="/robot_description" textfile="$(find <所在功能包>)/urdf/<模型名>.urdf"/>

    <!-- 启动机器人状态和关节状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

    <!-- 启动图形化的控制关节运动节点 -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output = "screen" />

    <!-- 启动仿真环境 -->
    <node pkg="rviz" type="rviz" name="rviz"/>
</launch>

关于该模板需要说明

RVIZ 中的模型导入

  1. 在左侧 display 窗口下方的 Add 按钮添加 RobotModel, 通常将自动添加 URDF 模型, 若没有查看其中的 Robot Description 项目参数是否为参数服务其中, 通过 launch 文件导入 URDF 文件的参数名 (此时可能存在错误且无法看见具体模型, 但可以继续操作)
  2. 使用同样的方式添加 TF, 即机器人的坐标系参数, 可在 display 窗口中取消复选框以隐藏
  3. 在 display 窗口的 Global Options 项目下的 Fixed Frame 项目参数, 将该参数修改为机器人原点坐标系 (如底盘, 世界坐标系或专门的机器人的原点坐标系)
  4. 为了避免重复导入模型, 可参考 RVIZ 配置的操作

问题解决

使用 URDF 模型

参见 https://wiki.ros.org/robot_state_publisheropen in new windowhttps://wiki.ros.org/urdf/Tutorials/Using urdf with robot_state_publisheropen in new window

通过功能包 robot_state_publisher 下的节点 robot_state_publisher 可操作 URDF 模型中定义的机器人关节, 并接收机器人的关节信息同时发送机器人上各个坐标系信息到 TF 变换树

基本使用方法如下