Week 5:Linux 目录操作与机器人运动学

本周继续练习 Ubuntu / Linux 终端操作,并通过 Panda 机器人示例理解关节空间、坐标空间、正运动学和逆运动学。

课堂内容

  1. Ubuntu / Linux 终端操作和目录操作。
  2. Ubuntu / Linux 学习资料与学习用途。
  3. Panda 机器人的运动学展示。
  4. 机器人基本概念:关节空间 / 坐标空间、正运动学 / 逆运动学。

终端操作:人生三问

进入“小区”,保安会问你三大问题:

who

你是谁?

pwd

你从哪里来?也就是当前目录在哪里。

ls

当前目录里有什么文件和文件夹。

cd 目标目录地址

你要去哪里?

Ubuntu 里的目录地址

绝对地址:

/home/robot/ros2_ws

相对地址:

content/week5.md
./content/week5.md
../README.md

Windows 文件管理器也可以操作 WSL 虚拟机中的目录,但建议在课程前期多练习命令行。

Ubuntu 中绝对路径和相对路径示例

VS Code 获取目录路径

VS Code 可以辅助查看、复制目录路径,也可以直接编辑 WSL 中的文件。对于后续 ROS2 工作区、Markdown 作业和 Python 程序,建议通过 VS Code 连接 WSL 后编辑。

VS Code 获取目录路径截图 1

VS Code 获取目录路径截图 2

Linux 学习资料

经典参考:

https://linux.vbird.org/

也就是“鸟哥的 Linux 私房菜”。

自学 Linux 的用途包括:

  • 服务器运维。
  • 网站搭建。
  • VPS 使用。
  • 远程开发。
  • 机器人和嵌入式系统开发。

VPS 是 Virtual Private Server,即虚拟专用服务器。它通过虚拟化技术把一台物理服务器划分为多个独立虚拟服务器,每个 VPS 通常有独立公网 IP、操作系统、内存、磁盘和 CPU 资源。

鸟哥 Linux 私房菜页面截图

在程序里感受坐标系

课堂使用的示例仓库:

https://github.com/ai-robot-class/ai-robot-frank

练习重点是通过程序和可视化观察机器人坐标系、关节变化和末端执行器运动。

机器人坐标系程序截图 1

机器人坐标系程序截图 2

ai-robot-frank 仓库链接截图

Panda 机器人运动学展示截图 1

Panda 机器人运动学展示截图 2

关节空间

关节空间(Joint Space)是基于机器人每一个驱动电机或关节的状态来描述位姿的。

对于 7 轴 Panda 机器人,可以用一组向量表示:

theta = [theta1, theta2, ..., theta7]

常用单位:

  • 弧度 rad
  • 角度 deg

物理意义:直接对应电机转动角度。当改变滑块 J0 时,就是在关节空间中移动。

特点:

  • 唯一性:给定一组关节角度,机器人形状唯一确定。
  • 非直观性:人很难直接想象多个关节角组合后末端在空间中的位置。

坐标空间

坐标空间(Task Space / Cartesian Space)基于外部参考系描述机器人末端执行器的位置和姿态。

通常用:

位置: (x, y, z)
姿态: Roll / Pitch / Yaw 或四元数

物理意义:描述夹爪在三维世界里的具体位置。例如输入:

0.5, 0.2, 0.0

就是在坐标空间中操作。

特点:

  • 直观:符合人类对前后、上下、左右的理解。
  • 多解:同一个空间点,机器人可能用多种关节组合到达。

关节空间与坐标空间

简单理解:

  • 关节空间关注“机器人自己是怎么长的”。
  • 坐标空间关注“机器人在世界上是怎么动的”。

这两套语言不同,但又紧密相关。

关节空间与坐标空间对比示意

正向运动学 FK

Forward Kinematics:

关节空间 -> 坐标空间

已知每个关节转了多少度,计算末端夹爪在哪里。

特点:

  • 计算相对简单。
  • 结果唯一。
  • 可以通过三角函数组合或齐次变换矩阵计算。

逆向运动学 IK

Inverse Kinematics:

坐标空间 -> 关节空间

已知目标位置,例如:

[0.5, 0.05, 0.1]

计算各个电机分别要转多少度。

特点:

  • 计算困难且复杂。
  • 可能无解、唯一解或多解。
  • 例如同一个杯子,可以手肘向上抓,也可以手肘向下抓。

PyBullet 中可以调用:

p.calculateInverseKinematics(
    pandaId,
    11,
    [tx, ty, tz],
    p.getQuaternionFromEuler([math.pi, 0, 0])
)

控制关节目标位置:

p.setJointMotorControl2(
    pandaId,
    i,
    p.POSITION_CONTROL,
    target_val,
    force=500
)

轨迹示例:画圆

伪代码:

for theta in range(0, 360, step):
    x = center_x + R * cos(theta)
    y = center_y + R * sin(theta)
    z = center_z
    robot.move_lin(x, y, z)

每一个小点都可以转换成 IK 问题:给出目标坐标,求对应的关节角度。

results matching ""

    No results matching ""