Robot 操作系統( ROS )提供了許多軟件庫和工具來幫助構建機器人應用程序,包括框架、算法、傳感器和機器人平臺。它在世界各地的機器人專家和研究人員中非常受歡迎。來自生態系統的軟件包和庫的不斷涌入使得機器人項目的啟動變得很容易。

NVIDIA ISAAC 軟件開發工具包 是一個開放的機器人平臺,旨在加速人工智能驅動機器人的開發和部署。 ISAAC SDK 帶來了一個軟件框架, ISAAC 引擎,用于在 NVIDIA Jetson 平臺和 GPUs 上高效處理。它還包括人工智能和 GPU 加速算法, ISAAC GEMS ,以及與 ISAAC Sim 卡的集成,用于 NVIDIA RTX 供電的照片真實模擬。這些功能可以使用 ISAAC SDK ROS 橋在基于 ROS 的應用程序堆棧中使用(圖 1 )。這使得開發人員和研究人員可以利用這兩個平臺來構建機器人應用程序。
在這篇文章中,我們將向您展示如何使用 ROS 橋從 ROS 格式的相機中獲取圖像,并將其與 ISAAC GEM (超級像素)一起使用。通過示例,我們還研究了將 ISAAC GEMs 和 ISAAC Sim 與 ROS 應用程序堆棧以及使用 ISAAC ROS 橋的模塊相連接。最后,我們解釋如何為 ROS 到 ISAAC 或 ISAAC 到 ROS 場景編寫一個消息轉換器( ROS 橋)。
入門
首先,在您的電腦上安裝 ROS 和 ISAAC 軟件開發工具包 。下面是使用 ROS 網橋的操作:
bazel run packages/ros_bridge/apps/ros_to_superpixels roslaunch realsense2_camera rs_rgbd.launch
或者,您可以 下載并保存 ROS 包 :
roslaunch realsense2_camera rs_from_file.launch rosbag_filename:="PathToRosBag"
圖 2 顯示了 ROS 橋的作用。 ROS 相機圖像(或 ROS rviz
中可視化的 ROS 包)被輸入名為 Superpixel 的 ISAAC SDK GEM (在 ISAAC 視線中可視化)。下一節將討論這是如何實現的。

ISAAC ROS 圖像上的超級像素GEMs
ISAAC SDK 中有許多計算機視覺算法是 GPU 加速的。其中之一就是超級像素。超級像素是一組外觀相似的連接像素。超像素分割將圖像分成數百個不重疊的超級像素(而不是數千或數百萬個單獨的像素)。通過使用超級像素,您可以計算更有意義的區域上的特征,并減少用于消耗算法的輸入實體的數量。有許多不同的超像素算法,其復雜度和性能各不相同。 ISAAC SDK 附帶了一個 GPU – 加速超像素 RGB-D 圖像的實現 。
在本例中,您將從 ROS 生成 RGB-D 輸入傳感器消息。此 ROS 圖像隨后被 ISAAC 超級像素GEMs消耗,以產生超級像素分割。 ??????????
首先,在 NVIDIA Jetson 設備上安裝 ROS 。有關使用 ISAAC SDK 的 ROS 安裝要求的更多信息,請參閱 安裝 ROS 。這可以在任何您喜歡的 Jetson 設備上完成。
接下來,將 RGB-D 攝像頭(如 Realsense 435d )連接到 Jetson 開發工具包。您也可以使用 ROS realseness rosbag ,例如 structured.bag 。要啟動 ROS Realsense 相機驅動程序并開始生成顏色和深度 sensor_msg 類型,請遵循 instructions 。
您需要一個 ROS 橋轉換器來將 ROS 消息轉換成 ISAAC 圖像深度 proto
消息(如前面的示例所示),供 ISAAC 超級像素 GEM 使用。修改現有的 RosToImage
轉換器,以包括 ROS 深度消息和現有彩色圖像消息。在下載了 ISAAC SDK 的開發工作站上執行此操作(圖 3 )。
bool RosToImage::rosToProto(const sensor_msgs::Image::ConstPtr& ros_message, ??????????????????????????? std::optional<ros::Time>& ros_time, ??????????????????????????? alice::ProtoTx<ImageProto>& tx_proto) { ? ros_time = ros_message->header.stamp; ? auto builder = tx_proto.initProto(); ? std::vector<SharedBuffer>& buffers = tx_proto.buffers(); ? // This converter is currently only supporting rgb8 color encoding and 16UC1 depth encoding ? if (ros_message->encoding == "rgb8") { ????? ImageConstView3ub rgb_image = ????????? CreateImageView<uint8_t, 3>(static_cast<const uint8_t*>(&ros_message->data[0]), ????????????????????????????????????? ros_message->height, ros_message->width); ????? Image3ub color_image(rgb_image.dimensions()); ????? Copy(rgb_image, color_image); ????? show("image", [&](sight::Sop& sop) { sop.add(rgb_image); }); ????? ToProto(std::move(color_image), builder, buffers); ? } else if (ros_message->encoding == "16UC1") { ????? // ROS depth image with 16UC1 encoding is of type uint8_t ????? ImageConstView1ui16 image = CreateImageView<uint16_t, 1>( ????????? reinterpret_cast<const uint16_t*>(&ros_message->data[0]), ????????? ros_message->height, ros_message->width); ????? Image1f depth_image(image.dimensions()); ????? ConvertUi16ToF32(image, depth_image, 0.001); ????? ToProto(std::move(depth_image), builder, buffers); ? } else { ????? reportFailure("Unsupported image format: %s", ros_message->encoding.c_str()); ????? return false; ? } ? builder.setRows(ros_message->height); ? builder.setCols(ros_message->width); ? builder.setDataBufferIndex(0); ? return true; }
圖 3 顯示了 ROS 主題到 ISAAC proto
的流程。

- ROS 轉換器 分別使用
RosToImage
和RosToCameraIntrinsics
幫助將 ROSRosToCameraIntrinsics
和Camerainfo
主題轉換為 ISAAC proto 。 - 超級像素代碼 使用 ROS 相機驅動程序圖像來產生超像素分割。
下面的代碼示例演示了如何使用 ISAAC 應用程序. json 文件查找 ROS 橋轉換器邊緣和配置:
{ ? "name": "ros_to_superpixels", ? "modules": [ ??? "sight" ? ], ? "graph": { ??? "nodes": [ ????? { ??????? "name": "ros_to_perception", ??????? "subgraph": "packages/ros_bridge/apps/ros_to_perception.subgraph.json" ????? }, ????? { ??????? "name": "superpixels", ??????? "subgraph": "packages/superpixels/apps/superpixels.subgraph.json" ????? } ??? ], ??? "edges": [ ????? { ??????? "source": "ros_to_perception.subgraph/interface/color", ??????? "target": "superpixels.subgraph/interface/color" ????? }, ????? { ??????? "source": "ros_to_perception.subgraph/interface/depth_intrinsics", ??????? "target": "superpixels.subgraph/interface/depth_intrinsics" ????? }, ????? { ??????? "source": "ros_to_perception.subgraph/interface/depth", ????? ??"target": "superpixels.subgraph/interface/depth" ????? } ??? ] ? }, ? "config": { ??? "ros_to_perception.ros_converters": { ????? "RosToDepth": { ??????? "channel_name": "/camera/depth/image_rect_raw" ????? }, ????? "RosToCameraIntrinsics": { ??????? "channel_name": "/camera/color/camera_info" ????? }, ????? "RosToImage": { ??????? "channel_name": "/camera/color/image_raw" ????? } ??? } }
現在,從開發工作站將應用程序部署到 Jetson 設備上:
bob@desktop:~/isaac$? ./engine/build/deploy.sh --remote_user <username_on_robot> -p //packages/ros_bridge/apps:ros_to_superpixel-pkg -d jetpack43 -h <robot_ip>
在 Jetson 設備上運行應用程序并使用自己的應用程序名稱:
bob@jetson:~/$ cd deploy/<bob>/ros_to_superpixel/ bob@jetson:~/deploy/<bob>/ros_to_superpixel$ packages/ros_bridge/apps/ros_to_superpixel
最后,使用 ISAAC Sight 檢查 Superpixels GEM 的輸出(圖 6 )。
對 ROS 導航堆棧使用 ISAAC 全局定位程序
ROS 導航堆棧可以從使用 ISAAC SDK GPU – 加速的全局本地化 GEM 來解決 綁架機器人問題 中獲益。
ISAAC sdk2020 . 1 版本有一個 example 來導航 Isaac Sim? Unity 3D 中的 ROS TurtleBot 3 Waffle Pi ,它使用了全局本地化 GEM 。下面的例子是一個帶有 ISAAC Sim 等的完整應用程序,但是 ROS 用戶只能自由使用 Global Localization GEM 。
在本文的上下文中,從 ISAAC 發布文檔 重新訪問 示例應用程序 。首先,了解用于 ROS 主題的不同的 ISAAC ROS 橋轉換器。圖 2 顯示了不同的 ISAAC ROS 橋轉換器用于 ROS TurtleBot3 應用程序和 ISAAC 全球本地化 GEM 。用于 ISAAC 全局本地化的 ROS 橋轉換器是 PoseMessageToRos
,它將輸出 /initialpose
發布到 ROS TurtleBot3 應用程序。

ISAAC PoseMessageToRos
轉換器的工作如下:從 ISAAC 內部接收全局定位算法的輸出,并將 initialpose
主題發布給 ROS 。下面的代碼示例顯示了這種轉換。
bool PoseMessageToRos::protoToRos(PoseTreeEdgeProto::Reader reader, const ros::Time& ros_time geometry_msgs::PoseWithCovarianceStamped& ros_message) { ? // Read data from Isaac type ? const Pose3d pose = FromProto(reader.getPose()); ? const auto& translation = pose.translation; ? const auto& rotation = pose.rotation.quaternion(); ? // Populate data for ROS type ? ros_message.header.stamp = ros_time; ? ros_message.header.frame_id = get_frame_id(); ? ros_message.pose.pose.position.x = translation.x(); ? ros_message.pose.pose.position.y = translation.y(); ? ros_message.pose.pose.position.z = translation.z(); ? ros_message.pose.pose.orientation.x = rotation.x(); ? ros_message.pose.pose.orientation.y = rotation.y(); ? ros_message.pose.pose.orientation.z = rotation.z(); ? ros_message.pose.pose.orientation.w = rotation.w(); if (get_report_success()) { ??? reportSuccess(); ? } ? return true; }
現在,看看 ROS 橋轉換器的工作。通過運行以下命令啟動 small-warehouse
場景:
bob@desktop:~isaac_sim_unity3d/builds$ ./sample.x86_64 --scene small_warehouse --scenarioFile ~/isaac/packages/navsim/scenarios/turtlebot3_waffle_pi.json --scenario 0
運行 ISAAC SDK 應用程序,該應用程序與 ISAAC Sim Unity3D 和 ROS 進行通信:
bob@desktop:~/isaac$ bazel run packages/ros_bridge/apps:ros_to_navigation_unity3d -- --more apps/assets/maps/virtual_small_warehouse.json --config ros_navigation:packages/ros_bridge/maps/small_warehouse_map_transformation.config.json,ros_navigation:packages/ros_bridge/apps/ros_to_navigation_turtlebot3_waffle_pi.config.json
在 ROS 中推出 TurtleBot3 :
TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$(realpath packages/ros_bridge/maps/small_warehouse.yaml)
在輸出中, ISAAC Sim 顯示了一個基于 ROS 導航的機器人導航到目標,它也使用了 ISAAC 全局定位 GEM 。從 ISAAC 側,您可以在 ISAAC 視線和 ROS 側的 rviz
監控機器人。通過拖動 Map 窗口的 pose_as_goal
標記更改導航目標。
定制 ROS 橋變換器的研制
在圖 3 和圖 4 中 , 中,標準的 ROS 成像主題被轉換成 ISAAC proto
來運行 Perception GEM 。 ISAAC SDK 有 ROS 橋轉換器,可以在 ROS 消息和 ISAAC 消息之間進行轉換。 NVIDIA 還有一個開源轉換器庫,作為 ISAAC SDK 的一部分。但是,您可能需要創建一個轉換器。
下面的代碼示例顯示如何將 ROS custom_msgs::Custom1
消息類型轉換為 ISAAC Proto1
消息類型:
class RosToProto1 : public RosToProtoConverter<Proto1, custom_msgs::Custom1> {
?public:
? bool rosToProto(const custom_msgs::Custom1::ConstPtr& ros_message,
????????????? ????? std::optional<ros::Time>& ros_time,??
????????????? ????? alice::ProtoTx<Proto1>& tx_proto) override;
};
這就是將 Proto2
類型從 ISAAC 轉換為 ROS custom_msgs::Custom2
類型的轉換器的外觀。
class Proto2ToRos : public ProtoToRosConverter<Proto2, custom_msgs::Custom2> {
?public:
? bool protoToRos(const alice::ProtoRx<Proto2>& rx_proto, const ros::Time& ros_time,
????????????? ??? custom_msgs::Custom2& ros_message) override;
};?
在 ISAAC 應用程序 JSON 配置文件中添加所需的 ROS 主題名為 channel_name
,如下所示:
????? "RosToProto1": { ??????? "channel_name": "/custom_input", ??????? ... ????? }, ????? "Proto2ToRos": { ??????? "channel_name": "/result", ??????? ... ????? }
isaac.ros_bridge.ImageToRos
codelet 在 ISAAC 應用程序中接收 ImageProto
數據并將其發布到 ROS 。也就是說,它將數據從 ImageProto
轉換為 sensor_msgs::Image
。
結論
這篇文章展示了 ROS 開發人員如何與 NVIDIA ISAAC SDK 協作。您學習了如何有選擇地使用 ISAAC GEMs ,例如,在您現有的 ROS 應用程序中使用全局定位、低延遲、高保真的感知算法,而您最喜歡的解決方案仍然在 ROS 中。您還學習了如何創建自己的新 ROS- ISAAC 橋式轉換器。
我們很樂意聽聽您在 ROS 與 ISAAC SDK 合作方面的經驗。在 ISAAC 論壇上與我們聯系,提供豐富的 ROS 橋式轉換器和反饋。
有關更多信息,請參閱以下資源:
?