12. isaacsim4.2教程-ROS 导航

1. Teleport 示例

ROS 服务的作用: 提供了一种同步、请求-响应的通信方式,用于执行那些需要即时获取结果或状态反馈的一次性操作或查询。

Teleport 服务在 ROS 仿真(尤其是 Gazebo)和某些简单机器人控制中扮演着瞬移机器人或对象的角色。

Teleport Service 是一个具体应用,它利用 ROS 服务机制来实现在仿真(或极少数简单真实场景)中瞬间设置机器人/模型位置和朝向的功能,主要用于调试、测试和快速初始化。它是一个典型的 ROS 服务。

  1. 在 Isaac Sim 的示例中,打开 Isaac Examples > ROS > Teleport。此时,场景中会自动加载一个立方体和一个圆锥。

  2. 如果未打开 Action Graph 窗口,请通过菜单:Window > Visual Scripting > Action Graph

  3. 此时工作图(graph)应只包含两个节点:

    1. On Playback Tick

    2. ROS1 Teleport Service

  4. 要调用该服务,请在另一个终端中,加载 Isaac Sim 的 ROS1 工作区,然后运行示例客户端脚本:rosrun isaac_tutorials ros_service_client.py

你会看到立方体和圆锥像中了瞬移咒一样,每次都会跳到随机的新位置。😉

Pose Teleport Service 消息定义

该服务使用一个自定义的 IsaacPose ROS Service 消息,定义文件位于:

<noetic_ws>/src/isaac_ros_messages/srv/IsaacPose.srv

消息结构如下:

std_msgs/Header        header
string[]               names
geometry_msgs/Pose[]   poses
geometry_msgs/Twist[]  velocities
geometry_msgs/Vector3[] scales
  • names:一个字符串数组,包含要传送对象的 prim 路径,必须与场景中的路径完全一致。

  • poses:一个 Pose 数组,与 names 一一对应,指定每个对象的目标位置。

  • (可选)velocitiesscales 可用于同时设置速度和缩放,但在本示例中未用到。

客户端示例脚本

下面是示例中运行的客户端脚本,位于:

<noetic_ws>/src/isaac_tutorials/scripts/ros_service_client.py
import rospy
import numpy as np
from isaac_ros_messages.srv import IsaacPose, IsaacPoseRequest
from geometry_msgs.msg import Posedef teleport_client(msg):rospy.wait_for_service("teleport")try:teleport = rospy.ServiceProxy("teleport", IsaacPose)teleport(msg)except rospy.ServiceException as e:print("Service call failed: %s" % e)# 随机生成立方体的新位置
cube_pose = Pose()
cube_pose.position.x = np.random.uniform(-2, 2)
cube_pose.position.y = 0
cube_pose.position.z = 0
cube_pose.orientation.w = 1# 随机生成圆锥的新位置
cone_pose = Pose()
cone_pose.position.x = 0
cone_pose.position.y = np.random.uniform(-2, 2)
cone_pose.position.z = 0
cone_pose.orientation.w = 1# 组装服务请求
teleport_msg = IsaacPoseRequest()
teleport_msg.names = ["/World/Cube", "/World/Cone"]
teleport_msg.poses = [cone_pose, cube_pose]# 调用服务
teleport_client(teleport_msg)

2. ROS导航

学习目标

在本 ROS 示例中,我们将:

  • 演示 Omniverse Isaac Sim 与 ROS Navigation 栈的集成。

  • 使用地图生成器(Occupancy Map Generator)。

2.1 前提条件

  1. 安装 ROS Navigation 栈
    在终端中运行:

    sudo apt-get install ros-$ROS_DISTRO-navigation
    

    这样就能获取所有核心的导航功能包了。

  2. 获取示例所需包
    本教程依赖以下三个 ROS 包,它们位于你的工作空间下的 src/navigation/ 目录中:

    • carter_2dnav

    • carter_description

    • isaac_ros_navigation_goal

    这些包分别包含:

    • 启动文件(launch files)

    • 导航参数配置

    • 机器人模型文件

    确保你已经完成了 ROS 和 ROS 2 的安装,且正确配置了 ROS 环境变量(例如 source /opt/ros/$ROS_DISTRO/setup.bash),并且 src/navigation/ 已在你的 ROS_PACKAGE_PATH 中。

  3. 启用 ROS 桥接并启动 roscore

  4. 可选:如果你对 RTX 激光雷达(Lidar)传感器的工作原理、相关节点,或如何获取合成数据感兴趣,可阅读《RTX Lidar 传感器原理与使用指南》,深入了解它们在导航中的应用。

2.2 ROS导航设置

下面是该 ROS Navigation 栈所需的主要话题及其消息类型,对应图中的各个模块:

ROS 话题 (Topic)消息类型 (Message Type)作用简介
/tftf2_msgs/TFMessage发布各坐标系之间的变换,用于维护机器人在世界、里程计、传感器等坐标系下的位置关系。
/odomnav_msgs/Odometry发布机器人里程计信息,常由里程计源(轮速计/仿真/SLAM)产生,用于局部规划。
/mapnav_msgs/OccupancyGrid发布全局栅格地图(占据栅格),供全局规划器(global_planner)做路径搜索。
/scansensor_msgs/LaserScan发布激光雷达扫描数据,驱动本地/全局代价地图(costmap)和避障模块。

各模块如何利用这些话题

  1. /map &map_server→global_costmap→global_planner
    全局地图加载后,global_costmap 将其转成代价地图,再由全局规划器计算从起点到目标的粗略路径。

  2. /odom & /tf → local_planner & local_costmap
    局部代价地图不断融合里程计和雷达数据,为 local_planner 提供实时障碍物信息,生成可执行的局部路径。

  3. /scan → global_costmap & local_costmap
    激光数据同时更新全局和局部代价地图,保证导航对新出现的障碍物能够“眼观六路、耳听八方”。

  4. tf2_msgs/TFMessage
    /tf 话题上广播的坐标变换,让各节点能够把传感器数据、位姿、路径都正确地“放”到同一个世界坐标系下。

2.3 Carter_ROS Omnigraph 节点说明

在 Isaac Examples → ROS → Navigation 中加载仓库场景(warehouse scenario)。

Graph 说明

  1. 展开 Carter_ROS,右键点击 ActionGraph,选择 Open Graph。图中的控制部分就是经典的两轮小车graph,重点看ros部分:
     

  2. 下列 ROS Omnigraph 节点负责驱动机器人导航:

    Omnigraph 节点功能说明
    ros1_subscribe_twist订阅 /cmd_vel 话题,将接收到的速度指令传给差速与关节控制器,控制机器人运动。
    isaac compute odometry node它接收来自仿真环境或底层传感器(如 IMU、轮编码器)的原始运动数据,执行必要的计算(如积分、滤波、运动学解算),输出机器人当前的状态估计。
    ros1_publish_odometry接收来自 Compute Odometry Node完整状态信息(位置、姿态、线速度、角速度),将其封装成标准的 ROS nav_msgs/Odometry 消息,并发布到指定的 ROS topic 上。
    ros1_publish_raw_transform_tree接收来自 Compute Odometry Node位置和姿态信息,将其转换为 ROS 的坐标变换 (tf transform),并按照指定的父子坐标系关系持续发布到 ROS tf 树中。
    ros1_publish_transform_tree发布机器人基座坐标系(base_link)到底盘坐标系(chassis_link)的静态变换;由于目标 prim 设置为 Carter_ROS,会把整个 Carter 机器人从 chassis_link 开始的层级树都作为 base_link 的子树一起发布。
    ros1_publish_transform_tree_01发布底盘坐标系(chassis_link)到激光雷达坐标系(carter_lidar)的静态变换。
    ros1_publish_laser_scan发布由 isaac_read_lidar_beams_node 读取的 2D 激光扫描(LaserScan)数据。
  3. 同样在 Carter_ROS 下,右键点击 ROS_Cameras,选择 Open Graph。下列 ROS 相机相关 Omnigraph 节点负责图像与相机信息的发布:
    这个好理解,就是有两个相机,然后每个相机都要进行渲染画面,然后分成三种类型和话题发布。

    Omnigraph 节点功能说明
    ros1_create_camera_left_info自动生成并发布 /camera_info_leftCameraInfo,默认已启用 enable_camera_left 分支节点。
    ros1_create_camera_left_rgb自动生成并发布 /rgb_left 的 RGB 图像,默认已启用 enable_camera_leftenable_camera_left_rgb
    ros1_create_camera_left_depth自动生成并发布 /depth_left 的深度图(32FC1),需启用 enable_camera_leftenable_camera_left_depth
    ros1_create_camera_right_info自动生成并发布 /camera_info_rightCameraInfo,需启用 enable_camera_right
    ros1_create_camera_right_rgb自动生成并发布 /rgb_right 的 RGB 图像,默认已启用 enable_camera_rightenable_camera_right_rgb
    ros1_create_camera_right_depth自动生成并发布 /depth_right 的深度图(32FC1),需启用 enable_camera_rightenable_camera_right_depth
  4. 为了让所有外部 ROS 节点使用仿真时间,还额外添加了一个 ROS_Clock Graph,包含一个 ros1_publish_clock 节点,负责将仿真时间发布到 /clock 话题。

2.4 生成 Occupancy Map

使用占据地图生成器扩展(推荐)

要了解更多关于占据地图生成器扩展的信息,请点击此处。

  1. 在 Isaac Examples → ROS → Navigation 中加载仓库场景(warehouse scenario)。

  2. 在视口左上角,点击 Camera,从下拉菜单中选择 Top(俯视图)。

  3. 进入 Isaac UtilsOccupancy Map

  4. Occupancy Map 扩展面板中:

    • Origin 设置为 X: 0.0, Y: 0.0, Z: 0.0

    • Lower BoundZ 设置为 0.1

    • Upper BoundZ 设置为 0.62

    提示:将上界 Z 设为 0.62 米,是为了与 Carter 机器人上激光雷达距离地面的垂直高度保持一致。

  5. 在场景(Stage)中选中 warehouse_with_forklifts 这个 prim。

  6. 返回 Occupancy Map 扩展面板,点击 BOUND SELECTION。此时,占据地图的边界将根据所选 warehouse_with_forklifts prim 自动更新。

此时,面板中的地图参数就会类似于下图所示。

移除 Carter_ROS prim 并生成导航地图

  1. 移除 Carter_ROS prim
    在场景(Stage)中,选中 Carter_ROS prim,按 Delete 键将其移除。

  2. 计算并可视化占据图像

    • Occupancy Map 扩展面板中,依次点击 CALCULATE,然后点击 VISUALIZE IMAGE

    • 弹出可视化窗口后,设置:

      • Rotate Image:选择 180 degrees

      • Coordinate Type:选择 ROS Occupancy Map Parameters File (YAML)

    • 点击 RE-GENERATE IMAGE,重新生成图像(因为 ROS 相机与 Isaac Sim 相机坐标系不同,需要翻转)。

  3. 导出 YAML 参数

    • 在可视化面板下方,即刻会显示一段符合 ROS 格式的 Occupancy Map 参数(YAML 文本)。

    • 复制全部文本内容。

      image: carter_warehouse_navigation.png
      resolution: 0.05
      origin: [-11.975, -17.975, 0.0000]
      negate: 0
      occupied_thresh: 0.65
      free_thresh: 0.196
  4. 创建并保存 YAML 文件
    在你的 carter_2dnav ROS 包的 map 目录下(路径示例:<noetic_ws>/src/navigation/carter_2dnav/map/),新建一个名为carter_warehouse_navigation.yaml 的文件,将剪贴板中复制的 YAML 文本粘贴到该文件中并保存。

  5. 保存可视化图像
    回到 Omniverse Isaac Sim 可视化窗口,点击 Save Image。将文件命名为 carter_warehouse_navigation.png,将它保存在与 carter_warehouse_navigation.yaml 相同的目录中。

An occupancy map 现在就准备好了

2.5 运行 ROS Navigation

  1. Isaac Examples → ROS → Navigation 中加载仓库场景(warehouse scenario)。

  2. 点击 Play 按钮,启动仿真。

  3. 打开一个新终端,运行以下 ROS 启动文件,开启导航流程:
    这时 RViz 会自动打开,加载机器人的 URDF 模型、全局占据地图,以及覆盖其上的局部代价地图。

    roslaunch carter_2dnav carter_navigation.launch
  4. 为验证所有坐标变换(TF)都正常广播,再打开一个新终端,运行:
    rosrun rqt_tf_tree rqt_tf_tree

    弹出的 TF 树图应与下图大致相符。

  5. 由于 carter_navigation.launch 中已定义机器人的初始位姿,启动时机器人会自动定位好;如有需要,也可在 RViz 中点击 2D Pose Estimate 按钮,手动重置位姿。

  6. 在 RViz 中,点击工具栏上的 2D Nav Goal,然后在地图上点击并拖拽至目标点。
    ROS Navigation 栈会立即规划一条轨迹,机器人也会像开了自动驾驶模式一样,朝着目的地优雅行驶!

可以看到拖拽到损失很大的障碍物处是没法继续移动的。

3. 多机器人ROS导航

3.1 建map

  1. Create -> Isaac -> Environments -> Hospital.

  2. Perspective--Top. 选中 Hospital prim and press F

  3. Next, go to Isaac Utils -> Occupancy Map.

  4. In the Occupancy Map extension, ensure the Origin is set to X: 0.0, Y: 0.0, Z: 0.0. For the lower bound, set Z: 0.1. For the Upper Bound, set Z: 0.62. Keep in mind, the upper bound Z distance has been set to 0.62 meters to match the vertical distance of the Lidar onboard Carter with respect to the ground.

  5. Select the Hospital prim in the stage. In the Occupancy Map extension, click on BOUND SELECTION. The bounds of the occupancy map should be updated to incorporate the selected Hospital prim.

  6.  CALCULATE followed by VISUALIZE IMAGE.

  7. For Rotate Image, select 180 degrees and for Coordinate Type select ROS Occupancy Map Parameters File (YAML). Click RE-GENERATE IMAGE. Occupancy map parameters formatted to YAML will appear in the field below. Change the image name to your preference. Copy the full text.

  8. Create a YAML file for the occupancy map parameters called carter_hospital_navigation.yaml and place it in the map directory which is located in the sample carter_2dnav ROS package (carter_2dnav/map/carter_hospital_navigation.yaml).

  9. Insert the previously copied text in the carter_hospital_navigation.yaml file.

3.2 开始运行

  • Load scenario:

    • For the hospital environment, go to Isaac Examples -> ROS -> Multi Robot Navigation -> Hospital Scene.

    • For the Office scenario, go to Isaac Examples -> ROS -> Multi Robot Navigation -> Office Scene.

  • Click on Play to begin simulation.

  • In a new terminal, run the ROS launch file and set the env_name parameter to either hospital or office to begin Multiple Robot Navigation with the desired environment.

    roslaunch carter_2dnav multiple_robot_carter_navigation.launch env_name:=hospital

To verify that all of the transforms are broadcasting, run the following command in a new terminal to visualize the ROS TF frame tree:

rosrun rqt_tf_tree rqt_tf_tree

Since the positions of each robot is defined in multiple_robot_carter_navigation.launch, the robots should already be properly localized.

  1. In RViz, 点击 Tool Properties -> 2D Nav Goal -> Topic, 设置 topic namespace to either /carter1, /carter2 or /carter3 选择给哪一个导航

  2. Next, click on the 2D Nav Goal button and then click and drag at the desired location point in the map. The ROS Navigation stack will now generate a trajectory and the specified robot will start moving towards its destination! Repeat this process for every other robot.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92787.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" DeepSpeed-FastGen&#xff1a;通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成 摘要 随着大语言模型&#xff08;LLM&#xff09;被广泛应用&#xff0c;其部署与扩展变得至关重要&#xff0…

操作系统:操作系统的结构(Structures of Operating System)

目录 简单结构&#xff08;Simple Structure&#xff09; 整体式结构&#xff08;Monolithic Structure&#xff09; 什么是 Kernel&#xff08;内核&#xff09;&#xff1f; 层次结构&#xff08;Layered Structure&#xff09; 微内核结构&#xff08;Microkernel&#x…

Python柱状图

1.各国GDP柱状图2.各国GDP时间线柱状图

FastGPT:企业级智能问答系统,让知识库触手可及

在信息爆炸的时代&#xff0c;企业如何高效管理和利用海量知识&#xff1f;传统搜索和文档库已难以满足需求。FastGPT正成为企业构建智能知识核心的首选。一、FastGPT&#xff1a;不止于问答的智能知识引擎FastGPT 颠覆了传统知识库的局限&#xff0c;其核心优势在于&#xff1…

探索 MyBatis-Plus

引言在当今的 Java 开发领域&#xff0c;数据库操作是一个至关重要的环节。MyBatis 作为一款优秀的持久层框架&#xff0c;已经被广泛应用。而 MyBatis-Plus 则是在 MyBatis 基础上进行增强的工具&#xff0c;它简化了开发流程&#xff0c;提高了开发效率。本文将详细介绍 MyBa…

Hive【安装 01】hive-3.1.2版本安装配置(含 mysql-connector-java-5.1.47.jar 网盘资源)

我使用的安装文件是 apache-hive-3.1.2-bin.tar.gz &#xff0c;以下内容均以此版本进行说明。 以下环境测试安装成功&#xff1a; openEuler 22.03 (LTS-SP1)系统 MySQL-8.0.40 1.前置条件 MySQL数据库 我安装的是 mysql-5.7.28 版本的&#xff0c;安装方法可参考《Linux环境…

璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式

璞致电子 PZSDR-P101 软件无线电平台以 "异构计算 宽频射频 工业级可靠性" 为核心设计理念&#xff0c;基于 Xilinx ZYNQ7100 处理器与 ADI AD9361 射频芯片构建&#xff0c;为工程师提供从 70MHz 到 6GHz 的全频段信号处理解决方案。无论是频谱监测、无线通信原型…

【基础】go基础学习笔记

基础及关键字if for switch都支持使用隐形声明&#xff08;:&#xff09;来快速声明一个变量&#xff0c;无需在上面一行额外声明&#xff0c;这可以增加代码简洁性&#xff0c;但不太符合其他常规语言的写法&#xff0c;需要习惯一下if for switch都不需要使用&#xff08;&am…

AI驱动的企业知识管理革新

Baklib&#xff1a;人工智能引领的知识管理平台Baklib 是领先的 AI 驱动知识管理系统&#xff0c;专为企业打造智能化、模块化的知识共享平台。功能覆盖在线帮助中心、内联网、CMS 网站、客户支持系统、视频中心、活动教学平台和客户社区&#xff0c;全面提升组织在知识管理、员…

使用 FFmpeg 实现 RTP 音频传输与播放

&#x1f50a; 使用 FFmpeg 实现 RTP 音频传输与播放&#xff08;Ubuntu&#xff09; 在音视频开发或远程通信场景中&#xff0c;RTP&#xff08;Real-time Transport Protocol&#xff09; 是一种常用的实时音频传输协议。本文将介绍如何使用 FFmpeg 在 Ubuntu 上实现从一台主…

Android 导出联系人为 vCard(.vcf)

有时需要将联系人数据导出为可共享的标准格式&#xff1a;vCard&#xff08;.vcf&#xff09;格式&#xff0c;可被系统直接导入通讯录一、导出联系人为 vCard&#xff08;.vcf&#xff09;✅ 支持字段我们支持导出的字段包括&#xff1a;姓名个人电话家庭电话工作电话邮箱备注…

大模型-bacth之chunked prefills

一、chunked prefills 1.1 chunked prefills核心思想 ORCA虽然很优秀&#xff0c;但是依然存在两个问题&#xff1a;GPU利用率不高&#xff0c;流水线依然可能导致气泡问题。 我们来看sarathi-serve做的一个实验。左右两图分别刻画了在不同的batch size下&#xff0c;prefil…

multiprocessing模块使用方法(一)

结合Python代码示例说明multiprocessing模块的使用方法、Linux启动命令、服务部署及真实应用场景&#xff1a;一、multiprocessing基础用法 Python的multiprocessing模块通过创建子进程实现并行计算&#xff0c;核心步骤如下&#xff08;引用&#xff09;&#xff1a;创建进程对…

vector如何判断应该扩容?

std::vector 的扩容机制是 C 容器性能优化的一个核心点。它的判断标准、行为特征和实现细节如下所示&#xff1a;✅ 一、vector 的核心结构 std::vector 内部维护三个指针&#xff1a; begin -> 指向数据起始位置 end -> 指向当前已使用的元素末尾&#xff08;size…

ICMP考点

在网络工程师、运维工程师、安全工程师等岗位的面试中&#xff0c;​​ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制报文协议&#xff09;​​ 是高频必考知识点。ICMP作为IP协议的“辅助协议”&#xff0c;虽然不直接传输用户数据&#xff0c;但…

服务器带宽具体是指什么意思?

企业在选择服务器租用或托管服务时&#xff0c;需要根据自身的业务情况来选择合适的服务器带宽&#xff0c;以便于能够让其业务持续稳定的运行工作&#xff0c;做到及时响应用户的访问请求&#xff0c;但是很多用户对于带宽一词没有过多的概念&#xff0c;本文就来探讨一下服务…

CANape之ASAP2 Studio介绍

提到ECU的测量标定工具&#xff0c;很多小伙伴第一个想到的就是CANape。但其实&#xff0c;除了强大的测量标定功能之外&#xff0c;CANape还有很多其他功能。例如&#xff0c;CANape中集成的小工具——ASAP2 Studio&#xff0c;其支持对A2L文件&#xff08;由ASAM组织所定义&a…

【debug日记】MONAI SwinUNETR 目标检测项目调试总结(AI自动总结)

MONAI SwinUNETR 目标检测项目调试总结 日期: 2025年7月25日 项目: 使用 MONAI&#xff0c;以预训练的 SwinUNETR 为骨干网络&#xff0c;微调 RetinaNet 进行3D肺结节检测。 本文档旨在记录在项目配置、数据处理和模型训练过程中遇到的一系列问题及其解决方案&#xff0c;作为…

AI同传领域,字节跳动与科大讯飞激战进行时

在AI同声传译市场&#xff0c;行业巨头科大讯飞长期占据主导地位&#xff0c;但新晋玩家字节跳动正以迅猛姿态发起挑战。7月24日&#xff0c;字节旗下火山引擎正式发布豆包同声传译模型 Seed LiveInterpret 2.0&#xff0c;主打“人类级延迟”和“0样本声音复刻”&#xff0c;试…