Files
simulation/launch/full_simulation.launch.py
2026-02-09 03:39:49 +00:00

170 lines
5.2 KiB
Python

#!/usr/bin/env python3
"""Full Simulation Launch - GPS-Denied Navigation."""
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction, IncludeLaunchDescription
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch.conditions import IfCondition
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
import os
def generate_launch_description():
pkg_share = FindPackageShare('uav_ugv_simulation').find('uav_ugv_simulation')
world_arg = DeclareLaunchArgument(
'world',
default_value=os.path.join(pkg_share, 'worlds', 'empty_custom.world'),
description='Path to world file'
)
use_nvidia_arg = DeclareLaunchArgument(
'use_nvidia', default_value='true', description='Enable NVIDIA GPU'
)
headless_arg = DeclareLaunchArgument(
'headless', default_value='false', description='Run without GUI'
)
use_ground_truth_arg = DeclareLaunchArgument(
'use_ground_truth', default_value='true', description='Use Gazebo ground truth'
)
gazebo = ExecuteProcess(
cmd=['gazebo', '--verbose', LaunchConfiguration('world')],
output='screen',
additional_env={
'GAZEBO_MODEL_PATH': f"{pkg_share}/models:" + os.path.expanduser('~/ardupilot_gazebo/models'),
'GAZEBO_RESOURCE_PATH': f"{pkg_share}/worlds:" + os.path.expanduser('~/ardupilot_gazebo/worlds')
}
)
ardupilot_uav = TimerAction(
period=3.0,
actions=[
ExecuteProcess(
cmd=[
'sim_vehicle.py',
'-v', 'ArduCopter',
'-f', 'gazebo-iris',
'--model', 'JSON',
'--map', '--console',
'-I0',
'--out', '127.0.0.1:14550',
'--out', '127.0.0.1:14551',
'--add-param-file', os.path.join(pkg_share, 'config', 'ardupilot_gps_denied.parm')
],
cwd=os.path.expanduser('~/ardupilot/ArduCopter'),
output='screen'
)
]
)
mavros_uav = TimerAction(
period=8.0,
actions=[
Node(
package='mavros',
executable='mavros_node',
name='mavros_uav',
namespace='uav',
output='screen',
parameters=[
os.path.join(pkg_share, 'config', 'mavros_params.yaml'),
{
'fcu_url': 'udp://:14550@127.0.0.1:14555',
'gcs_url': '',
'target_system_id': 1,
'target_component_id': 1,
'fcu_protocol': 'v2.0'
}
]
)
]
)
visual_odom_node = TimerAction(
period=10.0,
actions=[
Node(
package='uav_ugv_simulation',
executable='visual_odom_node',
name='visual_odom_node',
namespace='uav',
output='screen',
parameters=[os.path.join(pkg_share, 'config', 'uav_params.yaml')]
)
]
)
geofence_node = TimerAction(
period=12.0,
actions=[
Node(
package='uav_ugv_simulation',
executable='geofence_node',
name='geofence_monitor',
namespace='uav',
output='screen',
parameters=[os.path.join(pkg_share, 'config', 'geofence_params.yaml')]
)
]
)
vision_nav_node = TimerAction(
period=14.0,
actions=[
Node(
package='uav_ugv_simulation',
executable='vision_nav_node',
name='vision_nav_node',
namespace='uav',
output='screen',
parameters=[os.path.join(pkg_share, 'config', 'uav_params.yaml')]
)
]
)
uav_controller = TimerAction(
period=15.0,
actions=[
Node(
package='uav_ugv_simulation',
executable='uav_controller',
name='uav_controller',
namespace='uav',
output='screen',
parameters=[os.path.join(pkg_share, 'config', 'uav_params.yaml')]
)
]
)
failsafe_handler = TimerAction(
period=16.0,
actions=[
Node(
package='uav_ugv_simulation',
executable='failsafe_handler',
name='failsafe_handler',
output='screen',
parameters=[os.path.join(pkg_share, 'config', 'uav_params.yaml')]
)
]
)
return LaunchDescription([
world_arg,
use_nvidia_arg,
headless_arg,
use_ground_truth_arg,
gazebo,
ardupilot_uav,
mavros_uav,
visual_odom_node,
geofence_node,
vision_nav_node,
uav_controller,
failsafe_handler,
])