(1)LiDARセンサーから取得するロボットと障害物の距離によってロボットが発停止するように/cmd_velの値を送信するコード(リスト11)を作成する。
#!/usr/bin/env python3 import rclpy from rclpy.node import Node from sensor_msgs.msg import LaserScan from geometry_msgs.msg import Twist from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSDurabilityPolicy class ObstacleDetector(Node): def __init__(self): super().__init__(‘obstacle_detector’) qos_profile = QoSProfile(depth=10, reliability=QoSReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_SYSTEM_DEFAULT, durability=QoSDurabilityPolicy.RMW_QOS_POLICY_DURABILITY_SYSTEM_DEFAULT) self.cmd_vel_pub = self.create_publisher(Twist, ‘cmd_vel’, 10) self.cmd_vel2_sub = self.create_subscription(Twist, ‘cmd_vel2’, self.cmd_vel2_callback, 10) self.scan_sim_sub = self.create_subscription(LaserScan, ‘scan_sim’, self.scan_sim_callback, 10) self.obstacle_flg = False self.obstacle_sim_flg = False def cmd_vel2_callback(self, msg): #センサーと障害物が閾値(今回は35cm)以下の場合は速度0、そうでなければ受信した値をそのまま送信 if self.obstacle_flg or self.obstacle_sim_flg: msg.linear.x = 0.0 msg.angular.z = 0.0 self.cmd_vel_pub.publish(msg) #受信したセンサーの値が閾値以下かを判定 def scan_sim_callback(self, scan): range_ahead = scan.ranges[len(scan.ranges)//2] print(“sim:”, range_ahead) self.obstacle_sim_flg = self.detect_obstacle(range_ahead) def detect_obstacle(self, range_ahead): return range_ahead < 0.35 def main(args=None): rclpy.init(args=args) obstacle_detector = ObstacleDetector() rclpy.spin(obstacle_detector) obstacle_detector.destroy_node() rclpy.shutdown() if __name__ == ‘__main__’: main()
(2)作成したコードを任意の名前で保存する。
今回は“lidar_sensor.py”と保存。その後、ROS 2を有効化し、Pythonからlidar_sensor.pyを実行する(リスト12)
$ source /opt/ros/foxy/setup.bash $ python3 lidar_sensor.py
(3)別のターミナルから、Pythonを用いて「3.シミュレーションと実機に発生する同期ズレの調整」で作成したコードを実行し、Isaac Simを開く(リスト13)。
$ unset LD_LIBRARY_PATH $ export FASTRTPS_DEFAULT_PROFILES_FILE=~/.ros/fastdds.xml $ cd ~/.local/share/ov/pkg/isaac_sim-2022.2.1 $ ./python.sh standalone_examples/api/omni.isaac.ros2_bridge/turtlebot3_move.py
(4)左側の■ボタンを押下していったんIsaac Simを停止させ、メニューから“Create>Shape>Cube”を選択する。Isaac Sim上に立方体が生成される(図25)。
(5)立方体を右クリックし“Add>Physics>Rigid Body with Colliders Preset”を選択し、この立方体に物理演算を付与する(図26)。
(6)立方体をロボットの前に移動させ、「Play」ボタンを押し、シミュレーションを開始すると、床上に立方体が表示される(図27)。
(7)新しいターミナルから、/cmd_vel2のトピック名で移動コマンドを出力する(リスト14)。
$ source /opt/ros/foxy/setup.bash $ ros2 topic pub /cmd_vel2 geometry_msgs/Twist '{linear: {x: 0.02, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}'
Isaac Sim上のTurtlebot3と実機のTurtlebot3が同時に動き出す。Isaac Sim上のTurtlebot3が障害物に近づくと実機のTurtlebot3も止まるのが分かるだろう。Isaac Sim上で障害物をTurtlebot3から遠ざけると、再度実機のTurtlebot3が動き出す(図28)。
今回はデジタルツインを活用した事例を紹介したが、実際の現場で活用するには以下のような実機とシミュレーション間の課題を解決することが必要であり、技術の進化に期待したい。
ROSを用いてシミュレーションと実機間の通信ができる。しかし、実機の位置情報をシミュレーションに取り込むインタフェースや、シミュレーションからのフィードバックで実機のハードウェアを直接制御するためのインタフェースが用意されていないため、今回はAPIの活用やROS通信処理コードの作成など、基本部分以外の連携部分の自作が必要だった。デジタルツイン活用を広げるためにはこういったインタフェース部分の整備が必要だと考える。
今回の通信環境、シミュレーターの処理速度によって、実機とシミュレーションの間で若干のズレが生じてしまった。
このため、画像や動画データのような大容量の通信が発生する場合、シミュレーションと実機間のデジタルツインに大きな遅延が生じる可能性が考えられる。デジタルツインを行う際には、十分な通信環境やPCの処理性能が必要となるだろう。
ロボットやROSは成長を続け、ロボットの導入が進む製造や物流だけではなく食品や農業などの業種でも使われ始めている。その中でも、デジタルツインでの活用が注目されており、今後も増えていくだろう。
今回は、シンプルなデジタルツインの活用例を紹介した。Isaac Sim上のロボットと実空間のロボットをリアルタイムで連動させ、シミュレーションの結果を実機に反映できる。デジタルツインは、業務改善やコスト削減などさまざまなメリットを得ることが可能だ。Isaac Simを提供するNVIDIAもロボット開発に注力している。今後、多くの企業がデジタルツインに向けたより便利な機能を提供するだろう。未解決な課題もあるが、今後のデジタルツインの進化に期待が高まる。(連載完)
富士ソフト AI・ロボット開発 R&Dチーム
富士ソフトでAI・ロボット開発の調査研究を主務として、最新技術の調査・社内外へのセミナー等に対応し、AI・ロボット開発の最新技術の習得および普及のため活動している。
Copyright © ITmedia, Inc. All Rights Reserved.