ROS2 シミュレーションとビジョン
22 URDF モデル
22 URDF モデル(URDF Modeling)
22.1 URDF 概要
ROS 2 における URDF は、XML で記述されたロボットモデル記述ファイルで、ロボットのリンク(link)、関節(joint)、幾何形状、質量慣性、座標系、衝突および可視化モデルなどの情報を定義します。これは ROS 2 におけるロボット TF 座標、Gazebo/Ignition シミュレーション、RViz 可視化、モーションプランニングなどの基礎です。簡単に言えば、URDF は ROS 2 が「システムにロボットの外観と各部品の接続方法を示す」ために使用する標準モデルファイルです。
22.1.1 URDF とは
URDF(Unified Robot Description Format)は XML 形式のロボット記述ファイルで、ロボットの幾何形状、関節、慣性などを定義します。
Plain Text URDF ファイル構造:
robot.urdf
ルート要素
link リンク定義
Visual 可視化
Collision 衝突
Inertial 慣性
# 関節定義 親リンク 子リンク 変換
22.2 ロボットの構成
ロボットをモデル化する際、まずその全体構成と主要なパラメータに精通する必要があります。一般的に、ロボットは主にハードウェア構造、駆動システム、センサーシステム、制御システムの 4 つのコンポーネントで構成されます。市場で一般的なロボットの種類は、移動ロボットでもロボットアームでも、これら 4 つの構成モジュールに従って分解および分析でき、その後のモデリングの基礎となります。

ハードウェア構造は、シャーシ、外殻、モーターなどの堅固に見えるデバイスです。
駆動システムは、モータードライブ、電源管理システムなど、機器を正常に駆動できるデバイスです。
センサーシステムは、モーターのエンコーダー、オンボード IMU、取り付けられたカメラ、レーダーなどを含み、ロボットが自身の状態と外部環境を感知できるようにします。
制御システムは、開発プロセスにおける主要な担い手で、通常は Raspberry Pi、コンピューターなどの計算プラットフォームと、内部のオペレーティングシステムおよびアプリケーションです。

ロボットモデリングのプロセスは、同様の方法で、ロボットの各部分をモデリング言語で記述し、組み合わせるプロセスです。

22.3 URDF 構文
22.3.1 link の説明
link タグは、サイズ、色、形状、質量、慣性行列、衝突パラメータなどの物理特性を含む、ロボットのある部品の外観と物理特性を記述するために使用されます。
例えば、この機械アームのリンクは次のように記述されます:

link タグの name はリンクの名前で、将来 link を接続する際に使用できるようにカスタマイズできます。
link 内の部分はロボットの外観を記述します。例えば:
これは stl ファイルで、実際のロボットのように見えます。
これは座標が初期位置に対して持つ偏差を表し、x、y、z の水平シフトと roll、pitch、yaw の回転があり、偏差が必要ない場合はすべて 0 になります。


2 番目の部分は衝突パラメータを記述し、以前と同じように見えますが、大きな違いがあります。

主にロボットの外観、つまり視覚効果を記述する部分。

ロボットの運動状態を記述する部分。例えば、ロボットが外部と接触したときに衝突として数えられる方法。

このロボットモデルでは、青色の部分が記述されており、物理制御プロセスでは、この複雑な外観は衝突検出の計算時により要求が高くなります。計算を簡素化するために、衝突検出に使用するモデルを緑色のボックスの円柱形に簡素化しました。これがそこに記述されている形状です。座標系の偏差についても同様で、剛体の重心の偏差を記述できます。
移動ロボットの場合、link は車体、車輪などを記述するためにも使用できます。
22.3.2 joint 関節の記述
ロボットモデルのリンクが最終的に関節で接続されてはじめて、相対運動が生成できます。
URDF には 6 種類の関節運動タイプがあります。
continuous は回転運動を記述し、軸の周りを無限に回転できます。例えば、車のホイールはこのタイプです。

revolute も回転関節ですが、continuous タイプとの違いは、無限に回転できないことであり、角度制限があります。例えば、機械アームの 2 つのリンクはこの運動タイプに属します。
prismatic はスライド関節で、特定の軸に沿ってスムーズに動かすことができ、その位置に制限があります。一般的なリニアパワーと同じです。

fixed は固定関節で、運動を許可しない唯一の関節ですが、依然として頻繁に使用されます。例えば、ロボットに取り付けられたカメラで、その相対位置は変わらないため、このとき使用される接続は fixed です。
floating はフローティング関節で、6 番目の planar はフラット関節で、使用は比較的少ないです。
URDF モデルでは、各 link は xml コンテンツを使用して記述されます。例えば、関節の名前、運動のタイプなどです。
parent タグ:親リンクを記述します。
child タグ:親リンクに対して動く子リンクを記述します。
origin:2 つの座標系間の関係。図の赤いベクトルで、これら 2 つの座標系がどのように一緒に取り付けられるべきかを理解できます。
axis は関節軸の単位ベクトルを表します。例えば z が 1 に等しい場合、z 軸の右方向の周りで回転運動が行われることを意味します。
limit は最小位置、最大位置、最大速度などの一部の運動制限を表します。
22.4 完全なロボットモデル
最終的に、すべての link と joint タグがロボットの各部分の記述と組み合わせを完了し、すべて 1 つの robot タグ内にあり、完全なロボットモデルを形成します。
したがって、特定の URDF モデルを見るときは、各コードの詳細を見て、link と joint を探し、ロボットが何で構成されているかを確認すると、全体像がわかり、詳細を見ることができます。
22.5 SO-ARM 機械アームのインポート


22.5.1 リポジトリのクローン:

cd ~/workspaces/src
git clone https://github.com/brukg/SO-100-arm.git22.5.2 プロジェクトのコンパイル
# Install dependencies
cd ..
rosdep install --from-paths src --ignore-src -r -y
# Build the package
colcon build --packages-select so_100_arm22.5.3 Gazebo で機械アームを表示
# Refresh environment variables
source install/setup.bash
ros2 launch so_100_arm rviz.launch.py22.6 次のステップ
Gazebo シミュレーション - 物理シミュレーションを学ぶ
2.24 カメラプレビュー - カメラ設定を学ぶ
23 Gazebo シミュレーション
23 Gazebo シミュレーション
23.1 Gazebo 概要

Gazebo は一般的に使用されるロボットシミュレーションプラットフォームで、ロボットの動作、センサーデータ、現実世界での物理的な相互作用(重力、衝突、摩擦など)をシミュレーションするための仮想環境を構築できます。ロボットモデル(URDF/SDF)のインポートをサポートし、カメラ、レーザーレーダー、IMU などのさまざまなセンサーをシミュレーションできるため、ロボットアルゴリズムの開発、デバッグ、テストに頻繁に使用されます。特に ROS/ROS2 エコシステムで使用されます。Gazebo を通じて、開発者は実際のハードウェアに依存することなく、制御、ナビゲーション、SLAM などの機能を迅速に検証でき、開発コストとリスクを大幅に削減できます。
23.1.1 Gazebo とは
Plain Text Gazebo シミュレーション構造:
Gazebo Server
物理エンジン (ODE/Bullet) (OGRE) plugin
ROS 2 インターフェース
cmd_vel odom scan

23.2 インストール操作
apt コマンドで gazebo をインストール
sudo apt install ros-${ROS_DISTRO}-ros-gz次のコマンドで gazebo を起動
# ros2 launch ros_gz_sim gz_sim.launch.pyモデルは次のとおりです:
23.3 次のステップ
1.24 カメラプレビュー - カメラ設定を学ぶ
2.25 カメラキャリブレーション - カメラキャリブレーションを学ぶ
24 カメラプレビュー
24 カメラプレビュー
24.1 機能パッケージのコンパイル
cd /opt/seeed/development_guide/12_llm_offline/seeed_ws
colcon build
source install/setup.bash24.2 カメラを起動
カメラを起動します。
ros2 run camera camera_usbノードとトピックを表示
24.3 画像のプレビュー
rqt を使用してカメラの画像を表示:rqt → Plugins → Visualization → Image View
rqt24.4 主要なコード
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
class CameraNode(Node):
def __init__(self):
super().__init__('camera_usb')
self.publisher = self.create_publisher(Image, 'image_raw', 10)
self.bridge = CvBridge()
self.cap = cv2.VideoCapture(0)
if not self.cap.isOpened():
self.get_logger().error('Unable to open camera')
return
self.timer = self.create_timer(0.05, self.timer_callback)
def timer_callback(self):
ret, frame = self.cap.read()
if ret:
image_msg = self.bridge.cv2_to_imgmsg(frame, encoding="bgr8")
self.publisher.publish(image_msg)
else:
self.get_logger().warn('Failed to capture image')
def main(args=None):
rclpy.init(args=args)
node = CameraNode()
rclpy.spin(node)
node.cap.release()
rclpy.shutdown()
if __name__ == '__main__':
main()24.5 次のステップ
1.25 カメラキャリブレーション - カメラキャリブレーションを学ぶ
- 26 AR ビジョン - AR ビジョンを学ぶ
25 カメラキャリブレーション
カメラキャリブレーション
25.1 カメラキャリブレーションの概要
25.1.1 カメラキャリブレーションとは


カメラキャリブレーションは、カメラの内部パラメータ(焦点距離、主点、歪み係数)と外部パラメータ(位置、姿勢)のコアを決定するプロセスです。
カメラはレンズ撮像を使用するデバイスであり、レンズの物理的特性のため、幾何学的歪みが導入されます。キャリブレーションは、これらの異常を数学モデルで記述および補正することです。
Plain Text カメラパラメータの詳細:
Intrinsics - カメラ固有の光学特性:
- 焦点距離
- ピクセル単位のレンズ焦点距離。視野のサイズを決定
- 主点
- 光軸と画像平面の交点。通常は画像中心付近 Distortion coefficients(歪み係数)
- 半径方向歪み(k1, k2, k3)- バレル/ピンクッション歪み (p1, p2)
Extrinsics - 世界座標系内のカメラ位置: Rotation Matrix(回転行列)
- 世界座標系に対するカメラ座標系の回転を記述
- 並進ベクトル(translation vector: 3x1)
- 世界座標系の原点からのカメラ座標系のシフトを記述
カメラ内部パラメータ(Camera Matrix): [fx 0 cx] K = [0 fy cy] (3x3 matrix) [0 0 1]
25.1.2 なぜキャリブレーションするのか
| 目的 | 注釈 | 精度要件 |
|---|---|---|
| 視覚距離測定 | ピクセル距離を実際の距離に変換 | 高精度 |
| 3D 再構成 | 正確な 3D 情報の復元、Structure from Motion | 高精度 |
| カメラ協調 | マルチカメラ画像融合、パノラマカメラ | 中高精度 |
| ロボットナビゲーション | 正確な環境認識、ビジュアル走行距離計 | 高精度 |
| 物体検出 | 物体エッジを修正し、検出精度を向上 | 中精度 |
| AR/VR | 仮想コンテンツが現実世界と正確に整列 | 高精度 |
25.1.3 カメラ歪みタイプ
Plain Text 歪みタイプ:
- 半径方向歪み(Radial Distortion)
バレル歪み(Barrel Distortion)
ピンクッション歪み(Pincushion Distortion)
- 切線方向歪み(Tangential Distortion) 画像平面とレンズ平面が完全に平行でないことが原因
25.1.4 キャリブレーションの原理
カメラキャリブレーションはピンホールカメラモデルに基づいており、既知の世界座標(キャリブレーションボード上のコーナー)と画像座標(検出されたピクセル位置)の関係によってカメラパラメータを解きます。
Plain Text キャリブレーションプロセス:
世界座標 (3D) → 外部パラメータ → カメラ座標 (3D) → 内部パラメータ → 投影 2D [X,Y,Z,1] [x,y,z] K [u,v,1]
再投影誤差(Reprojection error): キャリブレーションの品質指標、再投影点での誤差ギャップを計算 値が小さいほど、キャリブレーションが良好。
25.2 キャリブレーションツールのインストール
カメラパッケージをインストール
sudo apt install ros-humble-camera-calibration25.3 チェッカーボードのダウンロード
次のアドレスからチェッカーボードをダウンロード
チェッカーボードをダウンロードして印刷します。
25.4 カメラキャリブレーションを実行

# For 8x6 checkerboard with 25mm squares
ros2 run camera_calibration cameracalibrator --size 8x6 --square 0.025 \
--ros-args --remap image:=/camera/color/image_raw --remap camera:=/camera/color注: --size 8x6 は内部コーナーの数を指します(8x6 = 48 個のコーナー、9x7 のグリッドに対応) --square 0.025 は正方形のサイズをメートル単位で指します(25 mm) モバイルカメラがさまざまな角度から画像をキャプチャ
さまざまな角度から画像を収集し、カメラパラメータを自動的に計算し、ツールチップにキャリブレーションデータを保持します。
25.5 次のステップ
カメラキャリブレーションの学習を完了したら:
- 26 AR ビジョン - AR ビジョンと ARUco マーカーを学ぶ