"""
realsense.launch.py — Intel RealSense D435i driver (standalone)

Launches realsense2_camera_node with Jetson Orin Nano Super power-budget settings:
  - 640×480 @ 15fps (depth + RGB) — saves ~0.4W vs 30fps
  - IMU enabled with linear interpolation (unified /camera/imu topic)
  - Depth aligned to color frame
  - Point cloud disabled (expensive on Maxwell GPU)

Published topics:
  /camera/color/image_raw          sensor_msgs/Image         15 Hz
  /camera/color/camera_info        sensor_msgs/CameraInfo    15 Hz
  /camera/depth/image_rect_raw     sensor_msgs/Image         15 Hz
  /camera/depth/camera_info        sensor_msgs/CameraInfo    15 Hz
  /camera/aligned_depth_to_color/image_raw  sensor_msgs/Image  15 Hz
  /camera/imu                      sensor_msgs/Imu           ~200 Hz

Verify:
  ros2 topic list | grep camera
  ros2 topic hz /camera/color/image_raw
  ros2 topic hz /camera/imu
"""

import os
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from ament_index_python.packages import get_package_share_directory


def generate_launch_description():
    # Allow overriding camera serial number at launch time (useful with multiple cameras)
    serial_no_arg = DeclareLaunchArgument(
        'serial_no',
        default_value="''",
        description='RealSense device serial number (empty = first found)',
    )

    realsense_share = get_package_share_directory('realsense2_camera')

    realsense_launch = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            os.path.join(realsense_share, 'launch', 'rs_launch.py')
        ),
        launch_arguments={
            # Camera identity
            'serial_no':              LaunchConfiguration('serial_no'),
            'camera_name':            'camera',
            'camera_namespace':       'camera',

            # Depth stream — 640×480 @ 15fps saves power on Nano
            'depth_module.profile':   '640x480x15',
            'enable_depth':           'true',

            # RGB stream — matched resolution/fps to depth
            'rgb_camera.profile':     '640x480x15',
            'enable_color':           'true',

            # IR streams — disabled (not needed for RTAB-Map RGB-D mode)
            'enable_infra1':          'false',
            'enable_infra2':          'false',

            # IMU — enable both sensors, publish unified topic
            'enable_gyro':            'true',
            'enable_accel':           'true',
            # 2 = linear_interpolation: aligns accel+gyro timestamps
            'unite_imu_method':       '2',

            # Align depth to color frame (required for rtabmap_ros RGB-D input)
            'align_depth.enable':     'true',

            # Point cloud — disabled, too expensive for Maxwell GPU during SLAM
            'pointcloud.enable':      'false',

            # TF — publish camera→IMU extrinsics
            'publish_tf':             'true',
            'tf_publish_rate':        '0.0',   # static only, no redundant updates
        }.items(),
    )

    return LaunchDescription([
        serial_no_arg,
        realsense_launch,
    ])
