Skip to content

ROS 1 / ROS 2

Both wrappers are thin: the same LocalPlanner runs inside, planning is timer driven (or on every odometry message with plan_on_odom), and configuration changes are applied between cycles.

ROS 2 ROS 1
ros2 launch fiss_planner_ros2 planner.launch.py roslaunch fiss_planner_ros1 planner.launch
ros2 param set /fiss_planner planner.type fiss rosrun dynamic_reconfigure dynparam set /fiss_planner planner_type fiss
components PlannerNode, ControllerNode nodes planner_node, controller_node

The config_file parameter takes a YAML file in the core format (see Python): a preset from configs/ or a profile from python/fiss_planner/profiles/. ROS parameters override its values.

Inputs and outputs

Topic Type
~/odom nav_msgs/Odometry in
~/obstacles fiss_planner_msgs/ObstacleArray in
~/reference_path nav_msgs/Path in (path mode)
~/goal geometry_msgs/PoseStamped in (map mode)
~/stop_lines fiss_planner_msgs/StopLineStateArray in (traffic lights)
~/trajectory fiss_planner_msgs/Trajectory out: time-parameterized x, y, yaw, v, a, κ, s, d
~/path, ~/reference nav_msgs/Path out
~/stats fiss_planner_msgs/PlannerStats out: mode, timings, counts, blocking obstacle, gap / headway / TTC to the vehicle ahead
~/candidates visualization_msgs/MarkerArray out (publish_candidates)
~/markers visualization_msgs/MarkerArray out (ROS 2): ego, obstacles, predicted paths; vehicle ahead and blocking obstacle highlighted

Obstacles use fiss_planner_msgs/ObstacleArray: a rectangular footprint per object plus a predicted trajectory (times relative to the header stamp). A single state with is_static describes a parked object. A single state without is_static (a tracked object with its current speed) gets a prediction according to prediction.mode: lane_following (default; along its lane of the Lanelet2 map, constant velocity without a map), constant_velocity, or as_given.

Keeping distance

The safety envelope and the proximity costs (see Concepts) are parameters like any other and can be tuned live:

ros2 param set /fiss_planner cost.desired_time_headway 2.0
ros2 param set /fiss_planner safety.min_ttc 2.0
ros2 param set /fiss_planner safety.crossing_time_gap 1.0   # crossing / oncoming traffic

collision.ignore_rear_in_lane is on in the shipped configuration: followers in the ego's lane are expected to keep their distance. degraded_horizon sets the collision horizon of the retry before an emergency stop.

Visualization and recording

ros2 launch fiss_planner_ros2 planner.launch.py rviz:=true opens RViz 2 with the reference, plan, candidates and scene markers. To record a run for Foxglove:

ros2 bag record -s mcap -o run /odom /perception/obstacles /tf \
    /fiss_planner/trajectory /fiss_planner/path /fiss_planner/stats \
    /fiss_planner/candidates /fiss_planner/markers

Maps

Set map.lanelet2_path (plus map.origin_lat/lon) to load a Lanelet2 map. Lane-change legality, speed limits and traffic-light stop lines come from the map and its routing graph. A goal on ~/goal computes the route, and its position is where the route's lane changes must be done. Without a map, publish ~/reference_path and set path.lane_width / path.num_left_lanes / path.num_right_lanes.

Frames

Odometry and obstacles may come in any frame with a TF to map_frame. Positions inside the planner refer to the vehicle box center; odom_to_center_offset is the distance from the odometry frame (e.g. rear-axle base_link) to the center along the heading.