demo.launch.py
Go to the documentation of this file.
1 import math
2 import os
3 
4 import pyproj
5 from ament_index_python.packages import get_package_share_directory
6 from launch import LaunchDescription
7 from launch_ros.actions import Node
8 from launch.actions import DeclareLaunchArgument, ExecuteProcess, OpaqueFunction
9 from launch.substitutions import LaunchConfiguration
10 
11 
12 def utmFromLatLon(lat, lon):
13  zone, is_northern = utmZoneFromLatLon(lat, lon)
14  transformer = pyproj.Transformer.from_crs("EPSG:4326", "EPSG:" + epsgCodeFromUtmZone(zone, is_northern)) # EPSG:4326 is WGS84
15  return transformer.transform(lat, lon)
16 
17 def utmZoneFromLatLon(lat, lon):
18  zone_number = int((lon + 180) // 6) + 1
19  is_northern = (lat >= 0)
20  return zone_number, is_northern
21 
22 def utmFrameNameFromUtmZone(utm_zone, is_northern=True):
23  if is_northern:
24  return f"utm_{utm_zone}N"
25  else:
26  return f"utm_{utm_zone}S"
27 
28 def epsgCodeFromUtmZone(utm_zone, is_northern=True):
29  if is_northern:
30  epsg_code = 32600 + utm_zone
31  else:
32  epsg_code = 32700 + utm_zone
33  return str(epsg_code)
34 
36  l = lon * math.pi / 180
37  zone, is_northern = utmZoneFromLatLon(lat,lon)
38  l0 = (zone * 6 - 183) * math.pi / 180
39  phi = lat * math.pi / 180
40  return math.atan(math.tan(l - l0) * math.sin(phi))
41 
42 
43 # https://robotics.stackexchange.com/a/104402
45 
46  # get reference position lat/lon launch argument values
47  lat = float(LaunchConfiguration("lat").perform(launch_context))
48  lon = float(LaunchConfiguration("lon").perform(launch_context))
49 
50  # convert lat/lon to utm
51  utm_x, utm_y = utmFromLatLon(lat, lon)
52  utm_conv_angle = gridConvergenceAngleFromLatLon(lat, lon)
53  utm_zone, is_northern = utmZoneFromLatLon(lat, lon)
54  utm_frame_name = utmFrameNameFromUtmZone(utm_zone, is_northern)
55 
56  return [
57 
58  # rviz2
59  Node(
60  package="rviz2",
61  executable="rviz2",
62  name="rviz2",
63  parameters=[{"use_sim_time": LaunchConfiguration("use_sim_time")}],
64  arguments=["-d", os.path.join(get_package_share_directory("etsi_its_rviz_plugins"), "config/demo.rviz")],
65  output="screen",
66  ),
67 
68  # static_transform_publisher for utm -> map transformation
69  Node(
70  package="tf2_ros",
71  executable="static_transform_publisher",
72  arguments=["--frame-id", utm_frame_name, "--child-frame-id", "map", "--x", str(utm_x), "--y", str(utm_y), "--z", "0.0", "--roll", "0.0", "--pitch", "0.0", "--yaw", str(utm_conv_angle)],
73  ),
74 
75  # NavSatFix publisher for AerialMapDisplay
76  ExecuteProcess(
77  cmd=["ros2", "topic", "pub", "-r 0.1", "/map_link/navsatfix", "sensor_msgs/msg/NavSatFix", f"{{header: {{stamp: {{sec: 0, nanosec: 0}}, frame_id: 'map'}}, latitude: {lat}, longitude: {lon}, altitude: 0.0}}"],
78  output="screen",
79  ),
80  ]
81 
82 
84 
85  return LaunchDescription([
86  DeclareLaunchArgument("use_sim_time", default_value="false", description="use simulation time"),
87  DeclareLaunchArgument("lat", default_value="50.786750", description="reference position latitude (map frame)"),
88  DeclareLaunchArgument("lon", default_value="6.046295", description="reference position longitude (map frame)"),
89  OpaqueFunction(function=generate_launch_description_with_resolved_launch_args)
90  ])
demo.generate_launch_description
def generate_launch_description()
Definition: demo.launch.py:83
demo.utmFrameNameFromUtmZone
def utmFrameNameFromUtmZone(utm_zone, is_northern=True)
Definition: demo.launch.py:22
demo.utmZoneFromLatLon
def utmZoneFromLatLon(lat, lon)
Definition: demo.launch.py:17
demo.epsgCodeFromUtmZone
def epsgCodeFromUtmZone(utm_zone, is_northern=True)
Definition: demo.launch.py:28
demo.gridConvergenceAngleFromLatLon
def gridConvergenceAngleFromLatLon(lat, lon)
Definition: demo.launch.py:35
demo.generate_launch_description_with_resolved_launch_args
def generate_launch_description_with_resolved_launch_args(launch_context)
Definition: demo.launch.py:44
demo.utmFromLatLon
def utmFromLatLon(lat, lon)
Definition: demo.launch.py:12


etsi_its_rviz_plugins
Author(s): Jean-Pierre Busch , Guido Küppers , Lennart Reiher
autogenerated on Sun May 18 2025 02:29:25