1. RealSense D435 カメラで画像を配信する (ROS1)
- カメラの接続 – Scout 本体に RealSense D435 を USB で接続します。
- ROS パッケージを起動 – ターミナルで Scout の ROS ワークスペースをソースした後、RealSense のドライバーを起動します。R&D キットの手順では
roslaunch realsense2_camera rs_camera.launchを実行すると RealSense ドライバーが立ち上がり、RGB 画像や深度画像を含む複数のトピックが配信されます(/camera/color/image_raw、/camera/depth/image_rect_rawなど)。 - トピックの確認 –
rostopic listでカメラ関連のトピックが追加されていることを確認します。 - 画像を確認する – R&D キットでは RViz での確認方法が紹介されています。RViz を起動し、「Add」→「Image」 を選択して固定フレームを
camera_linkに設定し、先ほど確認したトピックを選択するとカメラ画像が表示されます。深度を確認したい場合は 「Add」→「DepthCloud」 を追加して深度トピックを指定します。 - 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 用になります。- カメラドライバーの起動 – ターミナルで
ros2 launch realsense2_camera rs_launch.pyを実行すると RealSense ドライバーが起動し、画像と深度のトピックが配信されます。 - RViz2 で確認 – RViz2 を起動し、「Add」→「Image」 または 「DepthCloud」 を追加し、固定フレームを
camera_linkに設定して該当トピックを選択します。 - トピックの確認 –
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-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)
- トピック名:
/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/h264 が H.264 を独自メッセージで投げているだけ という点です(GitHub)。
そのままだと rqt_image_view や OpenCV の cv_bridge からは使えないので、以下のような ブリッジノード を自作します。
4-1. 方針
/CoreNode/h264を購読するノードを作るframe.msg中の H.264 バイト列を取り出す- ffmpeg / GStreamer / OpenCV の VideoCapture などで H.264 → RGB 画像にデコード
- その画像を
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. 最初の一歩としてやってみてほしいこと
- SCOUT-E(本体)側で
でメッセージの構造をメモる。source /opt/ros/melodic/setup.bash rostopic list | grep CoreNode rostopic echo -n 1 /CoreNode/h264 rosmsg show roller_eye/frame - PC 側で
/CoreNode/h264が見えている状態で、
を試し、「少なくとも ROS 的には publish されている」ことを確認する。rostopic echo /CoreNode/h264 | head - そのうえで、
- 「とりあえず H.264 をファイルに垂れ流して ffplay で見る」
- 次のステップとして、上のようなブリッジノードで
sensor_msgs/Imageを作る
6. まとめ
- SCOUT-E のカメラは、すでに ROS1 上で
/CoreNode/h264に H.264 映像を publish している(Scout-open-sourceREADME より)(GitHub) - PC からは、これまでどおり
ROS_MASTER_URIを SCOUT-E に向けて、/CoreNode/h264を購読すれば 「画像データへのアクセス」はできている状態。 - ただしそのままだと独自メッセージ + H.264 なので、
sensor_msgs/Imageに変換するブリッジノード- もしくは H.264 を直接 ffmpeg 等で扱うワークフロー のどちらかを自作する必要があります。
もし、
rostopic listに/CoreNode/h264が見えない- または
rostopic echoしても何も流れてこない




