以下では、AgileX Scout Mini などの「Scout 本体」が画像を ROS へ配信する一般的な方法をまとめました。Scout は標準状態ではカメラを搭載していませんが、R&D キットでは Intel RealSense D435 などの RGB‑D カメラが同梱されており、このカメラを ROS から利用できるようにする手順が提供されています。

1. RealSense D435 カメラで画像を配信する (ROS1)

  1. カメラの接続 – Scout 本体に RealSense D435 を USB で接続します。
  2. ROS パッケージを起動 – ターミナルで Scout の ROS ワークスペースをソースした後、RealSense のドライバーを起動します。R&D キットの手順では roslaunch realsense2_camera rs_camera.launch を実行すると RealSense ドライバーが立ち上がり、RGB 画像や深度画像を含む複数のトピックが配信されます(/camera/color/image_raw/camera/depth/image_rect_raw など)。
  3. トピックの確認rostopic list でカメラ関連のトピックが追加されていることを確認します。
  4. 画像を確認する – R&D キットでは RViz での確認方法が紹介されています。RViz を起動し、「Add」→「Image」 を選択して固定フレームを camera_link に設定し、先ほど確認したトピックを選択するとカメラ画像が表示されます。深度を確認したい場合は 「Add」→「DepthCloud」 を追加して深度トピックを指定します。
  5. rqt_image_view を使った表示 – GUI が不要な場合は rosrun rqt_image_view rqt_image_view を実行し、トピック選択欄から /camera/color/image_raw を選択するだけで映像を確認できます。ROS のチュートリアルではカメラノードを起動後に rqt_image_view でトピックを選択する方法が紹介されています。

2. RealSense D435 カメラで画像を配信する (ROS2)

Scout の ROS2 教育キットでは ROS2 Humble を使用します。手順は基本的に同じですが、コマンドが ROS2 用になります。
  1. カメラドライバーの起動 – ターミナルで ros2 launch realsense2_camera rs_launch.py を実行すると RealSense ドライバーが起動し、画像と深度のトピックが配信されます。
  2. RViz2 で確認 – RViz2 を起動し、「Add」→「Image」 または 「DepthCloud」 を追加し、固定フレームを camera_link に設定して該当トピックを選択します。
  3. トピックの確認ros2 topic list/camera/color/image_raw などのトピックを確認し、ros2 run rqt_image_view rqt_image_view で映像の確認ができます。

3. 汎用 USB カメラの場合

Scout に RealSense が付属していない場合は、市販の USB カメラを接続し、usb_cam パッケージなどで画像を配信することもできます。ROS2 版の usb_cam では sudo apt install ros-<ros2-distro>-usb-cam でインストールした後、ros2 run usb_cam usb_cam_node_exe または ros2 launch usb_cam camera.launch.py でカメラノードを起動し、画像ビューワを自動で立ち上げることができます。ROS1 版では rosrun usb_cam usb_cam_node または roslaunch usb_cam usb_cam-test.launch で同様に配信できます。

4. まとめ

  • Scout R&D キットでは Intel RealSense D435 を利用し、realsense2_camera パッケージを roslaunch realsense2_camera rs_camera.launch (ROS1) または ros2 launch realsense2_camera rs_launch.py (ROS2) で起動することで、RGB 画像や深度画像が ROS トピックに公開されます。
  • RViz/RViz2 の Image もしくは DepthCloud 表示に camera_link を固定フレームとして追加し、公開されたトピックを選択すると視覚的に確認できます。
  • トピック名は /camera/color/image_raw などであり、rqt_image_view を利用すると簡単に確認できます。
  • 付属カメラがない場合は usb_cam などのパッケージを利用して一般的な USB カメラを ROS に接続することも可能です。
以上の手順に従えば、Scout 本体に接続したカメラ映像を ROS 上に発行(publish)し、画像や深度データをプログラムや可視化ツールから利用できます。  

SCOUT-Eなので初めからカメラがある仕様です。画像を ROS に publish する方法を探して下さい

了解、SCOUT-E 前提で整理し直します。 結論から言うと:
SCOUT(-E) のカメラは、すでに ROS 上で /CoreNode/h264 というトピックに H.264 形式で publish されています。 これを PC から購読して、必要なら sensor_msgs/Image に変換する「ブリッジノード」を自作する、というのが基本ルートです。

1. SCOUT-E のカメラが出している ROS トピック

Moorebot 公式のオープンソース SDK(Scout-open-source)の README に、「動画を取るには /CoreNode/h264 を購読する」とはっきり書いてあります。(GitHub)
  • リポジトリ: Pilot-Labs-Dev/Scout-open-source
  • 動画ストリーム:
    • トピック名: /CoreNode/h264
    • メッセージ型: roller_eye/msg/frame.msg(独自メッセージ)(GitHub)
SCOUT-E は機構が違うだけで、SoC・OS・ROS 周りは同じファミリー(Linux + ROS1)です(moorebot.com)。 なので、SCOUT-E でも同じ /CoreNode/h264 が動いている前提でよいです(実機では rostopic list で要確認)。

2. まず「ROBOT がどのトピックに何を出しているか」を確認する

2-1. SCOUT-E に ssh する

(もうやっていると思いますが整理)
ssh linaro@linaro-alip
# パスワードはデフォルトだと linaro
(dpin.de)

2-2. ROS 環境を読み込む

source /opt/ros/melodic/setup.bash
# roller_eye が別の setup を持っている場合はそれも source

2-3. トピック一覧を確認

rostopic list
ここで、
  • /CoreNode/h264
  • /CoreNode/aac
  • /SensorNode/imu
  • /SensorNode/light
  • …などが出てくるはずです。動画は /CoreNode/h264 です(GitHub)

2-4. 実際にメッセージが出ているか確認

rostopic echo -n 1 /CoreNode/h264
  • 何かしら header: ...data: ... が出れば OK
  • 全く出ない場合は、カメラノード(roller_eye)が落ちている可能性あり → 再起動 or メーカーのデーモンを再起動、になります(ここはまだ情報が少ないので、いったん「/CoreNode/h264 が出ている前提」で話を進めます)。

3. PC 側から「SCOUT-E のカメラ」を ROS で見る

これは以前やっていた通り:
# PC 側(WSL/Ubuntu)の例
source /opt/ros/noetic/setup.bash

export ROS_MASTER_URI=http://<SCOUT-EのIP>:11311
export ROS_IP=<PCのIP>
この状態で PC 側で
rostopic list | grep CoreNode
として /CoreNode/h264 が見えれば、「すでに SCOUT-E 本体が ROS に画像を publish していて、PC から購読できる状態」です。

4. 「通常の画像トピック(sensor_msgs/Image)が欲しい」場合の方針

問題は、 /CoreNode/h264H.264 を独自メッセージで投げているだけ という点です(GitHub)。 そのままだと rqt_image_view や OpenCV の cv_bridge からは使えないので、以下のような ブリッジノード を自作します。

4-1. 方針

  1. /CoreNode/h264 を購読するノードを作る
  2. frame.msg 中の H.264 バイト列を取り出す
  3. ffmpeg / GStreamer / OpenCV の VideoCapture などで H.264 → RGB 画像にデコード
  4. その画像を sensor_msgs/Image に詰めて、/camera/image_raw として publish
frame.msg のフィールド構造は GitHub の roller_eye/msg/frame.msg に書いてあります(今こちらから中身までは覗けないので、実機で rosmsg show roller_eye/frame を確認するのが確実です)。(GitHub)

5. ブリッジノードのイメージ(疑似コード)

※**フィールド名やデコード部分は「雰囲気レベル」**です。 実際には frame.msg の定義に合わせてフィールド名を修正してください。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import rospy
from roller_eye.msg import frame  # 実際の型名は rosmsg show で確認
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as np
import subprocess

class ScoutCameraBridge:
    def __init__(self):
        self.bridge = CvBridge()
        self.pub = rospy.Publisher('/camera/image_raw', Image, queue_size=1)

        # /CoreNode/h264 を購読
        rospy.Subscriber('/CoreNode/h264', frame, self.cb_h264)

        # ffmpeg で H.264 を生画像にデコードするパイプラインを作る方針(例)
        # 実装は環境依存になるので、ここはあくまで「アイデア」です。
        # 実務では、別プロセスで ffmpeg サーバーを立てて、そこに H.264 を送る構成が現実的です。

    def cb_h264(self, msg):
        # TODO: msg から H.264 バイト列を取り出すフィールド名を確認する
        h264_bytes = bytes(msg.data)   # ← 仮。実際のフィールド名は frame.msg を参照

        # ここで h264_bytes をデコードして BGR/RGB 画像にする
        # 例:ffmpeg で rawvideo を吐かせて numpy に詰める/GStreamer を使うなど

        # ここでは「decode_h264_to_bgr(h264_bytes)」という仮想関数で表現
        bgr = decode_h264_to_bgr(h264_bytes)

        if bgr is None:
            return

        img_msg = self.bridge.cv2_to_imgmsg(bgr, encoding='bgr8')
        img_msg.header = msg.header   # 元の header を流用できればタイムスタンプも揃う
        self.pub.publish(img_msg)

def main():
    rospy.init_node('scout_h264_bridge')
    bridge = ScoutCameraBridge()
    rospy.spin()

if __name__ == '__main__':
    main()

5-1. 最初の一歩としてやってみてほしいこと

  1. SCOUT-E(本体)側で
    source /opt/ros/melodic/setup.bash
    rostopic list | grep CoreNode
    rostopic echo -n 1 /CoreNode/h264
    rosmsg show roller_eye/frame
    
    でメッセージの構造をメモる。
  2. PC 側で /CoreNode/h264 が見えている状態で、
    rostopic echo /CoreNode/h264 | head
    
    を試し、「少なくとも ROS 的には publish されている」ことを確認する。
  3. そのうえで、
    • 「とりあえず H.264 をファイルに垂れ流して ffplay で見る」
    • 次のステップとして、上のようなブリッジノードで sensor_msgs/Image を作る
    という二段階に分けるとデバッグしやすいです。

6. まとめ

  • SCOUT-E のカメラは、すでに ROS1 上で /CoreNode/h264 に H.264 映像を publish しているScout-open-source README より)(GitHub)
  • PC からは、これまでどおり ROS_MASTER_URI を SCOUT-E に向けて、/CoreNode/h264 を購読すれば 「画像データへのアクセス」はできている状態
  • ただしそのままだと独自メッセージ + H.264 なので、
    • sensor_msgs/Image に変換するブリッジノード
    • もしくは H.264 を直接 ffmpeg 等で扱うワークフロー のどちらかを自作する必要があります。

もし、
  • rostopic list/CoreNode/h264 が見えない
  • または rostopic echo しても何も流れてこない
という状況なら、「SCOUT 本体側でカメラノードが起動していない」可能性があるので、そのときは「今どういうトピックが見えているか」「echo したときのログ」を教えてもらえれば、そこから一緒に切り分けできます。