前言
全向运动是现代机器人的核心能力之一,能够让机器人无需转向即可向任意方向移动,在仓储自动化、服务机器人等对精度和灵活性要求较高的场景中不可或缺。NVIDIA Kaya 机器人搭载全向驱动系统,可无缝对接 NVIDIA Isaac Sim 仿真平台与 ROS2 框架,实现高效的仿真与实机控制。
一、前置准备
在进行 Isaac Sim 与 ROS2 的桥接前,需确保系统已正确安装适配的 ROS2 版本。
另外,需要在 Isaac Sim 中打开 ROS2 bridge:

二、核心技术基础
1. 全向运动与 Kaya 机器人
全向运动机器人拥有三个自由度,分别为前进 / 后退、横向移动和旋转运动。这类机器人通常配备全向轮等特殊运动机构,无需调整自身朝向就能完成方向切换。
NVIDIA Kaya 机器人是一款小型多功能机器人,基于 Jetson Nano 平台构建,适配 AI 与机器人应用开发。它搭载 3 个全向轮组成的全向驱动系统,支持与 Isaac Sim 的无缝集成,可实现仿真与真实环境的统一部署。
2. Isaac Sim 与 ROS2 的核心协作组件
在 Isaac Sim 中,OmniGraph 是实现仿真逻辑的核心工具,其节点通信机制与 ROS2 的节点 - 话题模型类似。控制 Kaya 机器人的关键 OmniGraph 节点包括以下四类:
- **Break 3 Vector:**将 3D 运动矢量分解为 x、y、z 三个独立分量,用于管理机器人的各运动轴。
- **Make 3 Vector:**将分解后的 x、y、z 分量重新组合为 3D 运动矢量,定义机器人的期望运动方向。
- **Articulator Controller:**负责控制机器人的关节与执行器,将期望运动矢量转化为轮子的实际物理运动指令。
- **Holonomic Driver:**全向驱动专用驱动节点,确保机器人按照设定速度平稳完成全向运动。
USD 文件则用于定义机器人的物理与视觉属性,包含轮子、传感器、执行器等关键部件的参数。OmniGraph 中的控制节点需要通过调用 USD 配置,才能实现对机器人运动的精准仿真。
这里 OmniGraph,具体我以 ActionGraph 作为实现形式,以 Isaac Sim 4.5.0 为例:

在配置 kaya 机器人时我使用了很多的官方节点,官方解释如下:

官方已经提供了大量的节点以供用户使用,节点库及介绍可见网址:OmniGraph 节点库 — Omniverse 扩展
三、OmniGraph 控制流程搭建
Isaac Sim 中 Kaya 机器人的全向运动控制,是通过 OmniGraph 节点的有序连接实现的,具体流程分为四步:
- **输入处理:**基于用户指令或传感器数据生成运动指令,传入 Break 3 Vector 节点进行矢量分解。
- **运动矢量重组:**分解后的 x、y、z 分量经处理后,通过 Make 3 Vector 节点重新组合为完整的期望运动矢量。
- **关节控制指令生成:**运动矢量被输入 Articulator Controller 节点,该节点计算每个轮子需要执行的动作,以达成期望运动状态。
- **全向运动执行:**Holonomic Driver 节点协调所有轮子的运动,确保机器人在仿真环境中完成平稳的全向移动。
ActionGraph 节点图示例:

四、ROS2 控制代码实现
要实现 ROS2 对 Kaya 机器人的控制,核心是编写节点程序,通过/cmd_vel 话题发布速度指令。
ROS2 编译并运行自定义功能包方法如下:
# 开启一个新的终端
cd ~/kaya_ws
# 切换到 kaya_ws 工作空间的根目录
colcon build --symlink-install
# 快速编译,适合代码修改后
source install/setup.bash
# 将编译后的工作空间'注册'到当前终端的 ROS 2 环境中
ros2 run kaya_control kaya_drive
# 启动 kaya_control 功能包中的 kaya_drive 节点(ROS 2 中'节点'是最小的可执行单元,对应一个功能模块)
其中 kaya_drive.py 代码核心功能为:循环发布预设的速度指令到/cmd_vel 话题,控制 Kaya 机器人按照固定序列完成'前进→停止→横向移动→停止→旋转→停止'的循环运动。
完整代码如下所示:
import rclpy
from rclpy.node import Node
from rclpy.logging import LoggingSeverity
from geometry_msgs.msg import Twist
class KayaControlNode(Node):
def __init__(self):
super().__init__('kaya_control_node')
# 设置日志级别为 DEBUG,确保所有调试信息都能显示
self.get_logger().set_level(LoggingSeverity.DEBUG)
self.cmd_vel_pub = self.create_publisher(Twist, '/cmd_vel', 10)
self.timer = self.create_timer(0.1, self.timer_callback) # 10Hz 更新
self.sequence_step = 0
self.sequence = [
# (linear.x, linear.y, angular.z, duration_sec)
(-0.5, 0.0, 0.0, 2.0), # 前进 2 秒
(0.0, 0.0, 0.0, 1.0), # 停止 1 秒
(0.0, 0.5, 0.0, 2.0), # 横向移动 2 秒
(0.0, 0.0, 0.0, 1.0), # 停止 1 秒
(0.0, 0.0, 0.1, 2.0), # 旋转 2 秒
(0.0, 0.0, 0.0, 1.0), # 停止 1 秒
]
self.start_time = self.get_clock().now()
self.get_logger().info("Kaya 控制节点启动,运动序列将循环执行")
self.get_logger().info(f"序列包含 {len(self.sequence)} 个步骤")
def timer_callback(self):
self.get_logger().debug("定时器回调被触发")
# 当序列执行完毕后,重置为第一步(实现循环)
if self.sequence_step >= len(self.sequence):
self.sequence_step = 0
# 重置步骤索引
self.start_time = self.get_clock().now()
# 重置计时
self.get_logger().info("运动序列执行完毕,开始新一轮循环")
# 获取当前步骤的运动参数
linear_x, linear_y, angular_z, duration = self.sequence[self.sequence_step]
current_time = self.get_clock().now()
elapsed = (current_time - self.start_time).nanoseconds / 1e9
self.get_logger().debug(
f"步骤 {self.sequence_step+1}/{len(self.sequence)} - "
f"已耗时:{elapsed:.2f}秒,总时长:{duration}秒"
)
if elapsed < duration:
# 发布速度指令
twist = Twist()
twist.linear.x = linear_x
twist.linear.y = linear_y
twist.angular.z = angular_z
self.cmd_vel_pub.publish(twist)
# 使用 INFO 级别确保能看到发布的速度指令
self.get_logger().info(
f"步骤 {self.sequence_step+1}/{len(self.sequence)} - "
f"发布速度指令:linear.x={linear_x}, linear.y={linear_y}, angular.z={angular_z}"
)
else:
# 进入下一个运动步骤
self.sequence_step += 1
self.start_time = self.get_clock().now()
self.get_logger().info(f"进入步骤 {self.sequence_step}/{len(self.sequence)}")
def main(args=None):
rclpy.init(args=args)
node = KayaControlNode()
try:
rclpy.spin(node)
except KeyboardInterrupt:
node.get_logger().info("用户中断,节点停止")
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
五、总结与拓展
通过 NVIDIA Isaac Sim 与 ROS2 的协同,我们可以高效实现 Kaya 机器人的全向运动控制。Isaac Sim 的 OmniGraph 与 USD 配置为仿真提供了精准的物理模型支撑,ROS2 则为实时控制提供了灵活的通信框架。本文的 kaya_drive.py 脚本实现了基础的运动序列控制,在此基础上,开发者可以进一步集成激光雷达、视觉传感器等模块,开发避障、自主导航等更复杂的应用,适用于仓储、服务等多样化的机器人场景。

