【ROS2】中级:tf2-四元数基础知识

目标:学习 ROS 2 中四元数使用的基础知识。

教程级别:中级

 时间:10 分钟

 目录

  •  背景

  •  先决条件

  • 四元数的组成部分

  • ROS 2 中的四元数类型

  •  四元数运算

    • 1. 首先在 RPY 中思考,然后转换为四元数

    • 2 应用四元数旋转

    • 3 反转四元数

    •  4 相对旋转

  •  摘要

 背景

四元数是一种表示方向的四元组,比旋转矩阵更简洁。四元数在分析涉及三维旋转的情况时非常高效。四元数广泛应用于机器人学、量子力学、计算机视觉和 3D 动画。

您可以在维基百科上 https://en.wikipedia.org/wiki/Quaternion 了解更多关于基础数学概念的信息。您还可以观看由 3blue1brown https://www.youtube.com/3blue1brown  制作的可视化四元数 https://eater.net/quaternions 视频系列。

在本教程中,您将学习四元数和转换方法在 ROS 2 中的工作原理

 先决条件

然而,这不是一个硬性要求,您可以坚持使用任何其他最适合您的几何变换库。您可以查看诸如 transforms3d、scipy.spatial.transform、pytransform3d、numpy-quaternion 或 blender.mathutils 之类的库。

https://github.com/matthew-brett/transforms3d

https://github.com/scipy/scipy/tree/main/scipy/spatial/transform

https://github.com/dfki-ric/pytransform3d

https://github.com/moble/quaternion

https://docs.blender.org/api/master/mathutils.html

四元数的组成部分

ROS 2 使用四元数来跟踪和应用旋转。一个四元数有 4 个分量 (x, y, z, w) 。在 ROS 2 中, w 是最后一个,但在一些像 Eigen 这样的库中, w 可以放在第一个位置。常用的单位四元数不会绕 x/y/z 轴旋转是 (0, 0, 0, 1) ,可以通过以下方式创建:

#include <tf2/LinearMath/Quaternion.h>
...


tf2::Quaternion q;
// Create a quaternion from roll/pitch/yaw in radians (0, 0, 0)
q.setRPY(0, 0, 0);
// Print the quaternion components (0, 0, 0, 1)
RCLCPP_INFO(this->get_logger(), "%f %f %f %f",
            q.x(), q.y(), q.z(), q.w());

四元数的大小应始终为一。如果数值误差导致四元数大小不为一,ROS 2 将打印警告。为了避免这些警告,请规范化四元数

q.normalize();

ROS 2 中的四元数类型

ROS 2 使用两种四元数数据类型: tf2::Quaternion 及其等效的 geometry_msgs::msg::Quaternion 。要在 C++ 中进行转换,请使用 tf2_geometry_msgs 的方法。

C++

#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
...


tf2::Quaternion tf2_quat, tf2_quat_from_msg;
tf2_quat.setRPY(roll, pitch, yaw);
// 将 tf2::Quaternion 转换为 geometry_msgs::msg::Quaternion
geometry_msgs::msg::Quaternion msg_quat = tf2::toMsg(tf2_quat);


// 将 geometry_msgs::msg::Quaternion 转换为 tf2::Quaternion
tf2::convert(msg_quat, tf2_quat_from_msg);
// 或者
tf2::fromMsg(msg_quat, tf2_quat_from_msg);

Python

from geometry_msgs.msg import Quaternion
...


# 创建一个浮点数列表,该列表与 tf2 四元数方法兼容
quat_tf = [0.0, 1.0, 0.0, 0.0]


# 将列表转换为 geometry_msgs.msg.Quaternion
msg_quat = Quaternion(x=quat_tf[0], y=quat_tf[1], z=quat_tf[2], w=quat_tf[3])

 四元数运算

1 在 RPY 中思考,然后转换为四元数

我们很容易想到围绕轴的旋转,但很难用四元数来思考。建议是计算目标旋转时使用滚转(绕 X 轴)、俯仰(绕 Y 轴)和偏航(绕 Z 轴),然后转换为四元数。

# quaternion_from_euler method is available in turtle_tf2_py/turtle_tf2_py/turtle_tf2_broadcaster.py
q = quaternion_from_euler(1.5707, 0, -1.5707)
print(f'The quaternion representation is x: {q[0]} y: {q[1]} z: {q[2]} w: {q[3]}.')

2 应用四元数旋转

要将一个四元数的旋转应用到一个姿态上,只需将姿态的前一个四元数与表示所需旋转的四元数相乘。这种乘法的顺序很重要。

C++

#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
...


tf2::Quaternion q_orig, q_rot, q_new;


q_orig.setRPY(0.0, 0.0, 0.0); // 设置初始姿态的四元数
// 将前一个姿态绕X轴旋转180度
q_rot.setRPY(3.14159, 0.0, 0.0);
q_new = q_rot * q_orig; // 应用旋转
q_new.normalize(); // 归一化新四元数

Python

q_orig = quaternion_from_euler(0, 0, 0)
# Rotate the previous pose by 180* about X
q_rot = quaternion_from_euler(3.14159, 0, 0)
q_new = quaternion_multiply(q_rot, q_orig)

3 四元数求逆

一种简单的单位四元数求逆方法是取反 w 分量: 单位四元数的逆就是其共轭四元数.

q[3] = -q[3]

4 相对旋转 

假设你有两个来自同一框架的四元数, q_1 和 q_2 。你想找到相对旋转, q_r ,以如下方式将 q_1 转换为 q_2 :

q_2 = q_r * q_1

你可以像解矩阵方程一样解 q_r 。将 q_1 取逆并右乘两边。同样,乘法的顺序很重要:

q_r = q_2 * q_1_inverse

以下是一个示例,说明如何在 Python 中获取从先前机器人姿态到当前机器人姿态的相对旋转

import numpy as np


def quaternion_multiply(q0, q1):
    """
    乘两个四元数。


    输入
    :param q0: 一个包含第一个四元数的4元素数组 (q0w, q0x, q0y, q0z)
    :param q1: 一个包含第二个四元数的4元素数组 (q1w, q1x, q1y, q1z)


    输出
    :return: 一个包含最终四元数的4元素数组 (qw, qx, qy, qz)


    """
    # 从 q0 中提取值
    w0 = q0[0]
    x0 = q0[1]
    y0 = q0[2]
    z0 = q0[3]


    # 从 q1 中提取值
    w1 = q1[0]
    x1 = q1[1]
    y1 = q1[2]
    z1 = q1[3]


    # 逐项计算两个四元数的乘积
    q0q1_w = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1
    q0q1_x = w0 * x1 + x0 * w1 + y0 * z1 - z0 * y1
    q0q1_y = w0 * y1 - x0 * z1 + y0 * w1 + z0 * x1
    q0q1_z = w0 * z1 + x0 * y1 - y0 * x1 + z0 * w1


    # 创建一个包含最终四元数的4元素数组
    final_quaternion = np.array([q0q1_w, q0q1_x, q0q1_y, q0q1_z])


    # 返回一个包含最终四元数的4元素数组 (qw, qx, qy, qz)
    return final_quaternion


# 获取前一个姿态的四元数的逆(共轭)或者单w部取反
q1_inv = [0, 0, 0, 0]
q1_inv[0] = prev_pose.pose.orientation.w
q1_inv[1] = -prev_pose.pose.orientation.x
q1_inv[2] = -prev_pose.pose.orientation.y
q1_inv[3] = -prev_pose.pose.orientation.z # 取负以求逆


# 获取当前姿态的四元数
q2 = [0, 0, 0, 0]
q2[0] = current_pose.pose.orientation.w
q2[1] = current_pose.pose.orientation.x
q2[2] = current_pose.pose.orientation.y
q2[3] = current_pose.pose.orientation.z


# 计算最终的四元数
qr = quaternion_multiply(q2, q1_inv)

 摘要

在本教程中,您了解了四元数的基本概念及其相关的数学运算,如求逆和旋转。您还了解了它在 ROS 2 中的使用示例以及两个不同四元数类之间的转换方法。

257d35c824da5684b8390bdcc42588af.png

08b8ea947ed250215470cc4345589f39.png

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个关于ROS Noetic软件包依赖关系的问题。其中,下列软件包的依赖关系尚不足够满足要求,无法安装: ros-noetic-desktop-full: 依赖于 ros-noetic-desktop,但它不会被安装。 依赖于 ros-noetic-perception,但它不会被安装。 依赖于 ros-noetic-simulators,但它不会被安装。 依赖于 ros-noetic-urdf-sim-tu,但它不会被安装。 ### 回答2: 这个错误提示是说明在安装 ros-noetic-desktop-full 软件包时,发现它需要依赖一些其他的软件包,但是这些软件包未被安装。其中,ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu 是四个未满足依赖关系的软件包。 这个错误提示一般是由于软件源的问题所导致的。在安装软件包时,系统会从软件源中查找该软件包以及它所需的依赖关系。如果软件源中不存在某个软件包的依赖关系,则会提示这个错误信息。 要解决这个问题,可以尝试以下几个方法: 1. 更新软件源:可通过修改软件源配置文件或使用软件源管理工具来更新软件源。更新后再次尝试安装软件包,看是否能够解决依赖关系问题。 2. 手动安装依赖关系:如果更新软件源后仍然无法解决依赖关系问题,可以尝试手动安装依赖关系。按照依赖关系的提示,逐个安装这四个软件包。安装完成后再次尝试安装 ros-noetic-desktop-full 软件包,看是否能够正常安装。 3. 使用 aptitude 命令安装:aptitude 命令可以自动处理依赖关系,可能会更好地解决这个问题。可以通过运行以下命令安装 ros-noetic-desktop-full 软件包: sudo aptitude install ros-noetic-desktop-full 以上是我的回答,希望能对你有所帮助。如果你还有其他问题,请随时回复。 ### 回答3: 这个问题意味着在安装 ros-noetic-desktop-full 软件包时,计算机无法满足所有需要的依赖关系。这些依赖关系包括 ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu。 在解决这个问题之前,我们需要了解什么是依赖关系。在软件工程中,依赖关系指的是一个软件包需要另一个软件包才能正常运行的情况。例如,在 ROS 中,ros-noetic-desktop-full 需要依赖其他的软件包才能提供完整的功能。 为了解决这个问题,我们可以使用以下方法: 1. 更新软件包源列表。我们可以更新软件包源列表,这有助于计算机查找所需的软件包。在 Ubuntu 系统中,我们可以使用以下命令更新软件包源列表:sudo apt-get update。 2. 安装依赖关系。我们可以尝试单独安装缺失的依赖关系。在 ROS 中,我们可以使用以下命令安装缺失的软件包:sudo apt-get install ros-noetic-desktop ros-noetic-perception ros-noetic-simulators ros-noetic-urdf-sim-tu。 3. 检查软件包仓库。某些情况下,软件包源可能已经过时或不再受支持。我们可以检查软件包仓库,查看软件包是否可用。在 Ubuntu 系统中,我们可以使用以下命令查看软件包仓库:apt-cache search ros-noetic-desktop-full。 总之,无法满足依赖关系的问题是常见的,在解决这个问题之前,我们需要了解依赖关系的概念,并掌握一些解决方法。在 ROS 中,我们可以使用更新软件包源列表、安装依赖关系和检查软件包仓库等方法解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值