مسیر یادگیری ROS 2  ·  کتاب آموزشی تصویری

فصل ششم: RViz — داشبورد دیداری ROS 2

اولین بار که ARCHO را واقعاً می‌بینیم
پیش‌نیاز: فصل ۴ و ۵
پروژه پیوسته: ربات ARCHO
ابزار: RViz2
زمان مطالعه: ۶۰ تا ۸۰ دقیقه
در این فصل چه می‌خوانیم ۶.۱RViz چیست و چه چیزی نیست ۶.۲آناتومی پنجره RViz ۶.۳اولین بار ARCHO را می‌بینیم ۶.۴Display مهم: Grid، RobotModel، TF، LaserScan ۶.۵Checkpoint دیداری ۶.۶جمع‌بندی، واژه‌نامه و تمرین‌ها

۶.۱RViz چیست و چه چیزی نیست

تا اینجا ARCHO فقط در فایل‌های XML و خروجی‌های ترمینال وجود داشته. زمانش رسیده که برای اولین بار او را «ببینیم». RViz ابزاری است که دقیقاً همین کار را می‌کند: هر چیزی که در شبکه ROS 2 منتشر می‌شود — مدل ربات، درخت TF، داده LiDAR، مسیر برنامه‌ریزی‌شده Nav2 — را به‌صورت سه‌بعدی و زنده نمایش می‌دهد.

📖 جمله طلایی این فصل

RViz پنجره اطلاعات ربات است؛ Gazebo (فصل بعد) آزمایشگاه مجازی ربات است. RViz هیچ فیزیکی شبیه‌سازی نمی‌کند — اگر ARCHO را یک متر بالای زمین قرار بدهی، در RViz همان‌جا در هوا می‌ماند، چون RViz فقط چیزی را نشان می‌دهد که از شبکه ROS دریافت کرده، نه اینکه قوانین دنیای واقعی را اعمال کند.

🧠 تشبیه ساده

اگر بخواهی یک خودرو را طراحی کنی، یک نرم‌افزار نقشه‌کشی فقط ظاهرش را نشان می‌دهد؛ نمی‌گوید آیا واژگون می‌شود یا ترمز می‌گیرد. RViz دقیقاً همان نقش را برای ربات دارد — یک پنجره برای دیدن و دیباگ‌کردن، نه یک آزمایشگاه فیزیکی.

۶.۲آناتومی پنجره RViz

پیش از باز کردن RViz، بیایید ببینیم داخلش با چه چیزی روبه‌رو می‌شویم:

RViz2 — archo.rviz File Panels Help Displays ☑ Grid ☑ RobotModel ☑ TF ☑ LaserScan /scan ☐ Odometry + Add Global Options Fixed Frame: base_footprint Views: Orbit ۳بعدی — grid + RobotModel + TF + LaserScan
شکل ۶.۱ — طرحی از پنجره RViz2: پنل Displays در سمت راست، نمای سه‌بعدی در وسط با شبکه زمین، مدل ARCHO، محورهای TF و نقاط LaserScan.
بخش پنجرهنقش
پنل Displaysفهرست همه لایه‌های اطلاعاتی که می‌خواهی ببینی؛ هرکدام را می‌توان با تیک فعال/غیرفعال کرد
دکمه Addاضافه‌کردن یک Display جدید (مثلاً LaserScan، PointCloud، Path)
Fixed FrameFrame مرجعی که همه چیز نسبت به آن رسم می‌شود
نمای سه‌بعدیصحنه اصلی؛ با ماوس می‌توان چرخاند، بزرگ‌نمایی کرد و جابه‌جا شد
Viewsنوع دوربین (Orbit، Top Down، First Person و غیره)

۶.۳اولین بار ARCHO را می‌بینیم

برای نمایش مدل، به یک زنجیره سه‌مرحله‌ای نیاز داریم که هر حلقه‌اش را در فصل‌های قبل ساختیم:

flowchart LR A["Xacro"] --> B["robot_description"] B --> C["robot_state_publisher"] C --> D["RViz2"] style D fill:#eef0ff,stroke:#3d4bf5,color:#211f1a,font-weight:bold

یک فایل Launch به نام display.launch.py در archo_description/launch می‌سازیم:

from launch import LaunchDescription
from launch.substitutions import Command
from launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValue
from ament_index_python.packages import get_package_share_directory
import os


def generate_launch_description():
    package_path = get_package_share_directory('archo_description')
    xacro_file = os.path.join(package_path, 'urdf', 'archo.urdf.xacro')
    robot_description = ParameterValue(
        Command(['xacro ', xacro_file]), value_type=str)

    return LaunchDescription([
        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            parameters=[{'robot_description': robot_description}],
        ),
        Node(
            package='joint_state_publisher_gui',
            executable='joint_state_publisher_gui',
        ),
        Node(
            package='rviz2',
            executable='rviz2',
            output='screen',
        ),
    ])
📖 چرا joint_state_publisher_gui؟

هنوز هیچ Controller واقعی یا شبیه‌سازی چرخ نداریم (این کار فصل بعد است). joint_state_publisher_gui یک پنجره کوچک با اسلایدر برای هر Joint متحرک باز می‌کند — می‌توانی دستی چرخ چپ یا راست را «بچرخانی» و بلافاصله ببینی که robot_state_publisher این تغییر را در TF منعکس می‌کند. ابزار عالی برای تست سریع قبل از رفتن سراغ شبیه‌سازی کامل.

dev@archo:~$ cd ~/archo_ws dev@archo:~/archo_ws$ colcon build --symlink-install dev@archo:~/archo_ws$ source install/setup.bash dev@archo:~/archo_ws$ ros2 launch archo_description display.launch.py [INFO] [robot_state_publisher]: got segment base_link [INFO] [robot_state_publisher]: got segment left_wheel_link [INFO] [robot_state_publisher]: got segment right_wheel_link [INFO] [rviz2]: RViz2 window opened

۶.۴Display مهم: Grid، RobotModel، TF، LaserScan

وقتی RViz برای اولین بار باز می‌شود، معمولاً چیزی نمی‌بینی — چون هنوز هیچ Displayای اضافه نکرده‌ای. این چهار مورد را با دکمه Add اضافه کن:

Displayچه چیزی نشان می‌دهد
Gridیک شبکه مرجع روی زمین، فقط برای جهت‌یابی چشمی
RobotModelظاهر واقعی ARCHO، دقیقاً همان Visual که در فصل چهارم در Xacro تعریف کردیم
TFمحورهای رنگی (قرمز/سبز/آبی) هر Frame، برای دیدن اینکه درخت TF فصل قبل واقعاً درست ساخته شده
LaserScanنقاط داده LiDAR، وقتی در فصل بعد وارد Gazebo شویم؛ Topic آن معمولاً /scan است

و مهم‌تر از همه، Fixed Frame را روی base_footprint تنظیم کن — یعنی همان Root که در فصل چهارم با check_urdf تأیید کردیم.

⚠️ اشتباه رایج

اگر بعد از اضافه‌کردن RobotModel چیزی در صفحه نمی‌بینی، معمولاً یکی از این سه چیز است: Fixed Frame اشتباه انتخاب شده، robot_state_publisher اجرا نشده، یا Xacro خطا داده و robot_description اصلاً منتشر نشده. پنل Displays معمولاً یک آیکون قرمز کنار موردی که مشکل دارد نشان می‌دهد.

۶.۵Checkpoint دیداری

این فصل، برخلاف فصل‌های قبل، Checkpointش «چشمی» است — باید با نگاه‌کردن به RViz، این موارد را تأیید کنی:

✅ Checkpoint فصل ششم
  • بدنه ARCHO به رنگ آبی که در فصل چهارم تعریف کردیم دیده می‌شود.
  • دو چرخ محرک دقیقاً دو طرف بدنه‌اند، نه داخل آن و نه جدا افتاده.
  • LiDAR (استوانه کوچک) بالای بدنه، نزدیک جلو قرار دارد.
  • محورهای TF قرمز/شکسته یا هشدار نیستند.
  • Root Frame پنل Displays برابر base_footprint است.
  • با اسلایدرهای joint_state_publisher_gui، چرخ‌ها در RViz واقعاً می‌چرخند.

۶.۶جمع‌بندی فصل ششم

برای اولین بار در این کتاب، ARCHO را با چشم خودمان دیدیم — نه به‌عنوان خطوط XML، بلکه به‌عنوان یک مدل سه‌بعدی زنده که درخت TF فصل پنجم را واقعی نشان می‌دهد. اما یادت باشد: RViz فقط یک پنجره اطلاعات است. هیچ‌چیز در آن واقعاً «اتفاق» نمی‌افتد. برای اینکه ARCHO واقعاً حرکت کند، با گرانش برخورد کند و رفتار فیزیکی واقعی داشته باشد، باید وارد آزمایشگاه مجازی بعدی شویم.

🌍 ارتباط با پروژه اصلی

پروژه ARCHO اکنون برای اولین بار قابل مشاهده است. فایل display.launch.py که همین حالا ساختیم، پایه تمام Launchهای بعدی خواهد بود — فقط هر بار یک لایه جدید (Gazebo، Nav2، SLAM) رویش اضافه می‌شود.

فصل بعد چه چیزی اضافه می‌کند

در فصل هفتم، ARCHO برای اولین بار وارد Gazebo می‌شود — جایی که دیگر فقط دیده نمی‌شود، بلکه گرانش رویش اثر می‌گذارد، با زمین برخورد می‌کند، و LiDAR و IMU‌اش داده‌های واقعی (با نویز) تولید می‌کنند.

واژه‌نامه فصل ششم

RViz2
ابزار دیداری‌سازی ROS 2 که هر داده منتشرشده روی شبکه (مدل ربات، TF، حسگرها) را سه‌بعدی نمایش می‌دهد، بدون شبیه‌سازی فیزیک.
Display
یک لایه اطلاعاتی قابل‌افزودن در RViz، مثل Grid، RobotModel، TF یا LaserScan.
Fixed Frame
Frame مرجعی که تمام Displayهای دیگر نسبت به آن در صحنه رسم می‌شوند.
joint_state_publisher_gui
ابزاری با اسلایدر برای تغییر دستی زاویه هر Joint، بدون نیاز به Controller واقعی.

خطاهای رایج فصل ششم — جمع‌بندی