feat: support slam localization mode

This commit is contained in:
2026-07-28 17:19:22 +09:00
parent 1fbe5d110c
commit af24aa53d3
4 changed files with 57 additions and 4 deletions
@@ -1,15 +1,23 @@
from launch import LaunchDescription from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node from launch_ros.actions import Node
def generate_launch_description(): def generate_launch_description():
localization_mode = DeclareLaunchArgument(
'localization_mode',
default_value='amcl',
choices=['amcl', 'slam'],
)
node = Node( node = Node(
package='localization_pkg', package='localization_pkg',
executable='localization_manager', executable='localization_manager',
name='localization_manager', name='localization_manager',
output='screen', output='screen',
parameters=[{'localization_mode': LaunchConfiguration('localization_mode')}],
) )
ld = LaunchDescription([]) ld = LaunchDescription([localization_mode])
ld.add_action(node) ld.add_action(node)
return ld return ld
@@ -0,0 +1,28 @@
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
sim_mode = LaunchConfiguration('sim_mode')
return LaunchDescription([
DeclareLaunchArgument('sim_mode', default_value='false'),
DeclareLaunchArgument('robot', default_value=''),
Node(
package='slam_toolbox',
executable='async_slam_toolbox_node',
name='slam_toolbox',
output='screen',
parameters=[
'/opt/ros/humble/share/slam_toolbox/config/mapper_params_online_async.yaml',
{
'use_sim_time': sim_mode,
'scan_topic': '/scan',
'base_frame': 'base_link',
'odom_frame': 'odom',
'map_frame': 'map',
},
],
),
])
@@ -18,13 +18,28 @@ class LocalizationManager(Node):
reliability=ReliabilityPolicy.RELIABLE reliability=ReliabilityPolicy.RELIABLE
) )
self.localization_process = None self.localization_process = None
self.config_received = False
self.declare_parameter('localization_mode', 'amcl')
self.localization_mode = self.get_parameter('localization_mode').value
self.create_subscription(String, '/vehicle_config', self.handle_config, qos_profile=qos) self.create_subscription(String, '/vehicle_config', self.handle_config, qos_profile=qos)
def handle_config(self, msg:String): def handle_config(self, msg:String):
if self.config_received:
return
self.config_received = True
self.get_logger().info(f"Localization Received config: {msg.data}") self.get_logger().info(f"Localization Received config: {msg.data}")
config_data = json.loads(msg.data) config_data = json.loads(msg.data)
if self.localization_mode == 'slam':
self.get_logger().info('Starting SLAM Toolbox localization mode.')
self.localization_process = subprocess.Popen(['ros2', 'launch',
'localization_pkg',
'localization_slam.launch.py',
f'sim_mode:={config_data.get("sim_mode")}',
f'robot:={config_data.get("robot")}'])
return
if config_data.get("level") == "2d": if config_data.get("level") == "2d":
self.localization_process = subprocess.Popen(['ros2', 'launch', self.localization_process = subprocess.Popen(['ros2', 'launch',
'localization_pkg', 'localization_pkg',
@@ -60,4 +75,3 @@ def main(args=None):
if __name__ == '__main__': if __name__ == '__main__':
main() main()
+3
View File
@@ -7,6 +7,9 @@
<maintainer email="jang1future@gmail.com">dgist</maintainer> <maintainer email="jang1future@gmail.com">dgist</maintainer>
<license>TODO: License declaration</license> <license>TODO: License declaration</license>
<exec_depend>rclpy</exec_depend>
<exec_depend>slam_toolbox</exec_depend>
<test_depend>ament_copyright</test_depend> <test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend> <test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend> <test_depend>ament_pep257</test_depend>