Advantech Robotic Suite/Container/Utility ROS Container/ROS2-Cartographer-Example
From ESS-WIKI
1. Open a terminal, accessing dev-ros2-humble
docker exec -it dev-ros2-humble bash
2. Download rosbag
curl -L https://iedgeblob.blob.core.windows.net/iedge-public/rosbag-dataset/rosbag2_2023_03_08-14_13_56.tar.gz -o rosbag2_2023_03_08-14_13_56.tar.gz
tar zxvf rosbag2_2023_03_08-14_13_56.tar.gz
3. Play the rosbag, the parameter -l represents looping playback
ros2 bag play rosbag2_2023_03_08-14_13_56/ -l
4. Open a new terminal, accessing util-ros2-humble
docker exec -it util-ros2-humble bash
5. Check whether the lidar and image topics exist
ros2 topic list
6. Add "cartographer.launch.py"
cd /opt/ros/humble/share/cartographer_ros/launch
vim cartographer.launch.py
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
cartographer_prefix = get_package_share_directory('cartographer_ros')
cartographer_config_dir = LaunchConfiguration(
'cartographer_config_dir',
default=os.path.join(cartographer_prefix, 'configuration_files')
)
configuration_basename = LaunchConfiguration(
'configuration_basename',
default='adv_lds_2d.lua'
)
resolution = LaunchConfiguration('resolution', default='0.05')
publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0')
rviz_config_dir = os.path.join(cartographer_prefix, 'rviz', 'cartographer.rviz')
return LaunchDescription([
DeclareLaunchArgument(
'cartographer_config_dir',
default_value=cartographer_config_dir,
description='Full path to config file to load'
),
DeclareLaunchArgument(
'configuration_basename',
default_value=configuration_basename,
description='Name of lua file for cartographer'
),
DeclareLaunchArgument(
'use_sim_time',
default_value='false',
description='Use simulation (Gazebo) clock if true'
),
# Cartographer Node
Node(
package='cartographer_ros',
executable='cartographer_node',
name='cartographer_node',
output='screen',
parameters=[{'use_sim_time': use_sim_time}],
arguments=[
'-configuration_directory', cartographer_config_dir,
'-configuration_basename', configuration_basename
]
),
# Cartographer Occupancy Grid Node
Node(
package='cartographer_ros',
executable='cartographer_occupancy_grid_node',
name='cartographer_occupancy_grid_node',
output='screen',
parameters=[{'use_sim_time': use_sim_time}],
arguments=[
'-resolution', resolution,
'-publish_period_sec', publish_period_sec
]
),
# RViz2 Node
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
arguments=['-d', rviz_config_dir],
parameters=[{'use_sim_time': use_sim_time}]
),
DeclareLaunchArgument(
'resolution',
default_value=resolution,
description='Resolution of a grid cell in the published occupancy grid'
),
DeclareLaunchArgument(
'publish_period_sec',
default_value=publish_period_sec,
description='OccupancyGrid publishing period'
),
])
7. Add "adv_lds_2d.lua"
cd /opt/ros/humble/share/cartographer_ros/configuration_files
vim adv_lds_2d.lua
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "laser",
published_frame = "laser",
odom_frame = "odom",
provide_odom_frame = false,
publish_frame_projected_to_2d = true,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1,
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.min_range = 0.12
TRAJECTORY_BUILDER_2D.max_range = 10
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)
POSE_GRAPH.constraint_builder.min_score = 0.65
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7
-- POSE_GRAPH.optimize_every_n_nodes = 0
return options
8. Run cartographer node
ros2 launch cartographer_ros cartographer.launch.py
9. Add map, trajectory, and lidar components in RViz2
10.Result