こんにちはアールティ畠山です。
前回に引き続き弊社で取り扱いしている株式会社Preferred Roboticsさんが開発した「カチャカ」やカチャカAPIについて連載していきます。今回は公式のROS 2サンプルコードとRSJ2023の展示用に作成したデモをについて紹介します。この記事から読み初めてた方やカチャカAPIのセットアップができていない方は前回を読んでください。
ROS 2 サンプルコード
公式のGitHubではROS 2のサンプルコードが公開されております。2023年9月時点で公開されているサンプルコードの簡単な説明を以下に記載しました。
- kachaka_follow
- Object DetectionとLiDARのセンサデータを用いて人を追従
- kachaka_smart_speaker
- スマートスピーカーと連携してカチャカに指示
- kachaka_speak
- カチャカ内蔵スピーカーから音声を発声
- kachaka_vision
- カチャカ内蔵カメラからOpenCVを用いて手のポーズを推定
- kachaka_bringup
- Navigation2を用いてカチャカを操作(RSJ2023以降に公開)
kachaka_speakerのように、いくつかサンプルではROS 2アクションを使って実装されています。使えるコマンドに関しては KachakaCommand.msg を見ていただくとわかります。RSJ2023の展示したデモも、これらの機能を組み合わせて実装しました。
RSJ2023の展示デモ
RSJ2023の展示のために作成したROS 2を用いた簡単なデモについて紹介します。作成したデモは以下の通りです。
・ジョイスティック操作
・ターミナルから指定した目的地点に移動
ジョイスティック操作
ジョイスティックでカチャカを操作します。
環境構築
sudo apt install joystic sudo apt install ros-humble-joy* sudo apt install ros-humble--teleop-tools
実行
ros2_bridgeを起動した状態で以下を実行してください。
ros2 run joy joy-node
別ターミナル
ros2 launch teleop_twist_joy teleop-launch.py joy_vel:=/kachaka/manual_control/cmd_vel
手順通りに実行すると動画のようにカチャカを操作できます。また内部で障害物検知が動いているため壁ぶつけようとしても止まってくれます。
指定した目的地点に移動
ターミナルから任意の座標を指定して目的地点に移動します。
環境構築
前回のROS 2のセットアップが完了してましたら、環境構築はいらないです。
ソースコード
以下のコードを実行すれば、動きます。
import rclpy from rclpy.node import Node from kachaka_interfaces.action import ExecKachakaCommand from kachaka_interfaces.msg import KachakaCommand from rclpy.action import ActionClient class WaypointPub(Node): def __init__(self): super().__init__("waypoint_publisher") self._action_client = ActionClient(self, ExecKachakaCommand, "/kachaka/kachaka_command/execute") self._action_client.wait_for_server() def sent_request(self, pos_x, pos_y, yaw): command = KachakaCommand() command.command_type = KachakaCommand.MOVE_TO_POSE_COMMAND command.move_to_pose_command_x = pos_x command.move_to_pose_command_y = pos_y command.move_to_pose_command_yaw = yaw goal_msg = ExecKachakaCommand.Goal() goal_msg.kachaka_command = command future = self._action_client.send_goal_async(goal_msg) return future def return_home(self): command = KachakaCommand() command.command_type = KachakaCommand.RETURN_HOME_COMMAND command.return_home_command_silent = True goal_msg = ExecKachakaCommand.Goal() goal_msg.kachaka_command = command future = self._action_client.send_goal_async(goal_msg) return future def kacha_speaker(self, text): command = KachakaCommand() command.command_type = KachakaCommand.SPEAK_COMMAND command.speak_command_text = text sp_msg = ExecKachakaCommand.Goal() sp_msg.kachaka_command = command self._action_client.send_goal_async(sp_msg) def main(args=None): rclpy.init(args=args) waypoint_pub = WaypointPub() waypoint_pub.kacha_speaker("アールティーブースへようこそ") while True: waypoint_pub.kacha_speaker("もくひょうちてんをせっていしてください") try: x, y, yaw = map(float, input("目標地点を入力してください x, y, yaw =").split()) except: print("入力がまちがっています") continue waypoint_pub.kacha_speaker("もくひょうちてんをせっていしました") future = waypoint_pub.sent_request(x, y, yaw) rclpy.spin_until_future_complete(waypoint_pub, future) waypoint_pub.kacha_speaker("もくひょうちてんにとうちゃくしました") if input("終了しますか? [y/n] = ") == "y": break waypoint_pub.kacha_speaker("ホームにもどります") waypoint_pub.return_home() rclpy.spin_until_future_complete(waypoint_pub, future) rclpy.shutdown() if __name__ == "__main__": main()
感想
ROS 2サンプルコードとRSJ2023の展示デモについて紹介をいたしました。今後の展望として弊社のCRANE-X7などと連携したアプリケーションを開発したいと考えておりますので、今後ともよろしくお願いします。