机器人应用程序设计
機(jī)器人應(yīng)用程序設(shè)計(jì)
Robot 操作系統(tǒng)( ROS )提供了許多軟件庫(kù)和工具來(lái)幫助構(gòu)建機(jī)器人應(yīng)用程序,包括框架、算法、傳感器和機(jī)器人平臺(tái)。它在世界各地的機(jī)器人專(zhuān)家和研究人員中非常受歡迎。來(lái)自生態(tài)系統(tǒng)的軟件包和庫(kù)的不斷涌入使得機(jī)器人項(xiàng)目的啟動(dòng)變得很容易。
圖 1. 使用 ROS 橋接器連接 ISAAC 和 ROS 軟件堆棧。
NVIDIA ISAAC 軟件開(kāi)發(fā)工具包 是一個(gè)開(kāi)放的機(jī)器人平臺(tái),旨在加速人工智能驅(qū)動(dòng)機(jī)器人的開(kāi)發(fā)和部署。 ISAAC SDK 帶來(lái)了一個(gè)軟件框架, ISAAC 引擎,用于在 NVIDIA Jetson 平臺(tái)和 GPUs 上高效處理。它還包括人工智能和 GPU 加速算法, ISAAC GEMS ,以及與 ISAAC Sim 卡的集成,用于 NVIDIA RTX 供電的照片真實(shí)模擬。這些功能可以使用 ISAAC SDK ROS 橋在基于 ROS 的應(yīng)用程序堆棧中使用(圖 1 )。這使得開(kāi)發(fā)人員和研究人員可以利用這兩個(gè)平臺(tái)來(lái)構(gòu)建機(jī)器人應(yīng)用程序。
本文將展示如何使用 ROS 橋從 ROS 格式的相機(jī)中獲取圖像,并將其與 ISAAC GEM (超級(jí)像素)一起使用。通過(guò)示例,還研究了將 ISAAC GEMs 和 ISAAC Sim 與 ROS 應(yīng)用程序堆棧以及使用 ISAAC ROS 橋的模塊相連接。最后,解釋如何為 ROS 到 ISAAC 或 ISAAC 到 ROS 場(chǎng)景編寫(xiě)一個(gè)消息轉(zhuǎn)換器( ROS 橋)。
概述
首先,在電腦上安裝 ROS 和 ISAAC 軟件開(kāi)發(fā)工具包 。下面是使用 ROS 網(wǎng)橋的操作:
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 相機(jī)圖像(或 ROS rviz 中可視化的 ROS 包)被輸入名為 Superpixel 的 ISAAC SDK GEM (在 ISAAC 視線中可視化)。
圖 2. 使用 ROS 橋連接到 ISAAC GEMs。
ISAAC ROS 圖像上的超級(jí)像素GEMs
ISAAC SDK 中有許多計(jì)算機(jī)視覺(jué)算法是 GPU 加速的。其中之一就是超級(jí)像素。超級(jí)像素是一組外觀相似的連接像素。超像素分割將圖像分成數(shù)百個(gè)不重疊的超級(jí)像素(而不是數(shù)千或數(shù)百萬(wàn)個(gè)單獨(dú)的像素)。通過(guò)使用超級(jí)像素,可以計(jì)算更有意義的區(qū)域上的特征,并減少用于消耗算法的輸入實(shí)體的數(shù)量。有許多不同的超像素算法,其復(fù)雜度和性能各不相同。 ISAAC SDK 附帶了一個(gè) GPU – 加速超像素 RGB-D 圖像的實(shí)現(xiàn) 。
本例將從 ROS 生成 RGB-D 輸入傳感器消息。此 ROS 圖像隨后被 ISAAC 超級(jí)像素GEMs消耗,以產(chǎn)生超級(jí)像素分割。
首先,在 NVIDIA Jetson 設(shè)備上安裝 ROS 。有關(guān)使用 ISAAC SDK 的 ROS 安裝要求的更多信息,請(qǐng)參閱 安裝 ROS 。這可以在任何喜歡的 Jetson 設(shè)備上完成。
接下來(lái),將 RGB-D 攝像頭(如 Realsense 435d )連接到 Jetson 開(kāi)發(fā)工具包。也可以使用 ROS realseness
rosbag ,例如 structured.bag 。要啟動(dòng) ROS Realsense 相機(jī)驅(qū)動(dòng)程序并開(kāi)始生成顏色和深度 sensor_msg 類(lèi)型,請(qǐng)遵循 instructions 。
需要一個(gè) ROS 橋轉(zhuǎn)換器來(lái)將 ROS 消息轉(zhuǎn)換成 ISAAC 圖像深度 proto 消息(如前面的示例所示),供 ISAAC 超級(jí)像素 GEM 使用。修改現(xiàn)有的 RosToImage 轉(zhuǎn)換器,以包括 ROS 深度消息和現(xiàn)有彩色圖像消息。在下載了 ISAAC SDK 的開(kāi)發(fā)工作站上執(zhí)行此操作(圖 3 )。
bool RosToImage::rosToProto(const
sensor_msgs::Image::ConstPtr& ros_message,
std::optionalros::Time& ros_time,
alice::ProtoTx& tx_proto) {
ros_time =
ros_message->header.stamp;
auto builder = tx_proto.initProto();
std::vector&
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 的流程。
圖 3. 發(fā)送給 ISAAC proto converter 的 ROS 消息: ROS 主題
·
ROS 轉(zhuǎn)換器 分別使用 RosToImage 和RosToCameraIntrinsics 幫助將 ROS RosToCameraIntrinsics 和 Camerainfo 主題轉(zhuǎn)換為 ISAAC proto 。
·
超級(jí)像素代碼 使用 ROS 相機(jī)驅(qū)動(dòng)程序圖像來(lái)產(chǎn)生超像素分割。
下面的代碼示例演示了如何使用 ISAAC 應(yīng)用程序. json 文件查找 ROS 橋轉(zhuǎn)換器邊緣和配置:
{
“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”
}}
}
現(xiàn)在,從開(kāi)發(fā)工作站將應(yīng)用程序部署到 Jetson 設(shè)備上:
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 設(shè)備上運(yùn)行應(yīng)用程序并使用自己的應(yīng)用程序名稱:
bob@jetson:~/$ cd
deploy//ros_to_superpixel/
bob@jetson:~/deploy//ros_to_superpixel$
packages/ros_bridge/apps/ros_to_superpixel
最后,使用 ISAAC Sight 檢查 Superpixels GEM 的輸出。
對(duì) ROS 導(dǎo)航堆棧使用 ISAAC 全局定位程序
ROS 導(dǎo)航堆棧可以從使用 ISAAC SDK GPU – 加速的全局本地化 GEM 來(lái)解決 綁架機(jī)器人問(wèn)題中獲益。
ISAAC sdk2020 .
1 版本有一個(gè) example 來(lái)導(dǎo)航 Isaac Sim Unity 3D
中的 ROS TurtleBot 3 Waffle Pi ,它使用了全局本地化 GEM 。下面的例子是一個(gè)帶有 ISAAC Sim 等的完整應(yīng)用程序,但是 ROS 用戶只能自由使用 Global Localization GEM 。
在本文的上下文中,從 ISAAC 發(fā)布文檔 重新訪問(wèn) 示例應(yīng)用程序。首先,了解用于 ROS 主題的不同的 ISAAC ROS 橋轉(zhuǎn)換器。圖 2 顯示了不同的 ISAAC ROS 橋轉(zhuǎn)換器用于 ROS TurtleBot3 應(yīng)用程序和 ISAAC 全球本地化 GEM 。用于 ISAAC 全局本地化的 ROS 橋轉(zhuǎn)換器是 PoseMessageToRos ,它將輸出 /initialpose 發(fā)布到 ROS TurtleBot3 應(yīng)用程序。
圖 4 . ISAAC SDK 中 ROS Turtlebot3 參考應(yīng)用中使用的 ROS 橋。
ISAAC PoseMessageToRos 轉(zhuǎn)換器的工作如下:從 ISAAC 內(nèi)部接收全局定位算法的輸出,并將 initialpose 主題發(fā)布給 ROS 。下面的代碼示例顯示了這種轉(zhuǎn)換。
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;
}
現(xiàn)在,看看 ROS 橋轉(zhuǎn)換器的工作。通過(guò)運(yùn)行以下命令啟動(dòng) small-warehouse 場(chǎng)景:
bob@desktop:~isaac_sim_unity3d/builds$
./sample.x86_64 --scene small_warehouse --scenarioFile
~/isaac/packages/navsim/scenarios/turtlebot3_waffle_pi.json --scenario 0
運(yùn)行 ISAAC SDK 應(yīng)用程序,該應(yīng)用程序與 ISAAC Sim Unity3D 和 ROS 進(jìn)行通信:
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 顯示了一個(gè)基于 ROS 導(dǎo)航的機(jī)器人導(dǎo)航到目標(biāo),它也使用了 ISAAC 全局定位 GEM 。從 ISAAC 側(cè),可以在 ISAAC 視線和 ROS 側(cè)的 rviz 監(jiān)控機(jī)器人。通過(guò)拖動(dòng) Map 窗口的 pose_as_goal 標(biāo)記更改導(dǎo)航目標(biāo)。
定制 ROS 橋變換器的研制
在圖 3 和圖 4 中,標(biāo)準(zhǔn)的 ROS 成像主題被轉(zhuǎn)換成 ISAAC proto 來(lái)運(yùn)行 Perception GEM 。 ISAAC SDK 有 ROS 橋轉(zhuǎn)換器,可以在 ROS 消息和 ISAAC 消息之間進(jìn)行轉(zhuǎn)換。 NVIDIA 還有一個(gè)開(kāi)源轉(zhuǎn)換器庫(kù),作為 ISAAC SDK 的一部分。但是,可能需要?jiǎng)?chuàng)建一個(gè)轉(zhuǎn)換器。
下面的代碼示例顯示如何將 ROS custom_msgs::Custom1 消息類(lèi)型轉(zhuǎn)換為 ISAAC Proto1 消息類(lèi)型:
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 類(lèi)型從 ISAAC 轉(zhuǎn)換為 ROS custom_msgs::Custom2 類(lèi)型的轉(zhuǎn)換器的外觀。
class Proto2ToRos : public
ProtoToRosConverter<Proto2, custom_msgs::Custom2> {
public:
bool protoToRos(const alice::ProtoRx& rx_proto, const
ros::Time& ros_time,
custom_msgs::Custom2& ros_message) override;
};
在 ISAAC 應(yīng)用程序 JSON 配置文件中添加所需的 ROS 主題名為 channel_name ,如下所示:
“RosToProto1”: {
“channel_name”: “/custom_input”,
…
},
“Proto2ToRos”: {
“channel_name”: “/result”,
…
}
isaac.ros_bridge.ImageToRos codelet 在 ISAAC 應(yīng)用程序中接收 ImageProto 數(shù)據(jù)并將其發(fā)布到 ROS 。也就是說(shuō),它將數(shù)據(jù)從 ImageProto 轉(zhuǎn)換為 sensor_msgs::Image 。
結(jié)論
本文展示了 ROS 開(kāi)發(fā)人員如何與 NVIDIA ISAAC SDK 協(xié)作。學(xué)習(xí)了如何有選擇地使用 ISAAC GEMs ,例如,在現(xiàn)有的 ROS 應(yīng)用程序中使用全局定位、低延遲、高保真的感知算法,而最喜歡的解決方案仍然在 ROS 中。還學(xué)習(xí)了如何創(chuàng)建自己的新 ROS- ISAAC 橋式轉(zhuǎn)換器。
有關(guān)更多信息,請(qǐng)參閱以下資源:
·
ISAAC 消息 API 操作 and 消息 API 概述 – ISAAC 2020 . 1 文檔
·
構(gòu)建 ISAAC 應(yīng)用程序
·
ISAAC 視圖
總結(jié)
- 上一篇: Linux 2 的 Windows 子系
- 下一篇: MLPerf Inference 0.7