(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Superimposing radar data on camera images

Description: Guide for using a calibrated camera to help visually verify radar data

Tutorial Level: INTERMEDIATE

Next Tutorial: Radar and camera sensor fusion


This tutorials details how to use the utilities in the ainstein_radar_tools packaged to view radar detections superimposed on images streaming from a camera in ROS, for the purpose of cross-validation. The utility is written to work with any radar publishing ainstein_radar_msgs/RadarTargetArray messages and any camera publishing both sensor_msgs/Image and sensor_msgs/CameraInfo messages.


We use the RGB camera in an Intel Realsense d435 because it comes pre-calibrated, with the ROS node provided in the realsense2_camera package publishing the calibration in sensor_msgs/CameraInfo messages. To use an uncalibrated camera, first use the functionality from the camera_calibration package to calibrate it.




Subscribes to input camera image and radar data topics, draws bounding boxes on the image corresponding to radar data for validation, and publishes the annotated image.

Subscribed Topics

radar_topic (ainstein_radar_msgs/RadarTargetArray)
  • Radar detections (targets) to be used for in annotating the input image.
camera_topic (sensor_msgs/Image)
  • Name of the camera topic corresponding to the input image to annotate with radar data. It is assumed that both sensor_msgs/Image and sensor_msgs/CameraInfo messages are published within this topic's namespace.

Published Topics

~image_out (sensor_msgs/Image)
  • Annotated output image.

Required tf Transforms

  • TF transform describing the transform between the radar sensor and camera frames.

Example Launch File

  <!-- Run the radar -->
  <node name="k79_node" pkg="ainstein_radar_drivers" type="k79_node" output="screen" required="true" >
    <param name="host_ip" value="" />
    <param name="host_port" value="1024" />
    <param name="radar_ip" value="" />
    <param name="radar_port" value="7" />

  <!-- Run the camera -->
  <include file="$(find realsense2_camera)/launch/rs_camera.launch" >
    <arg name="enable_infra1" value="false"/>
    <arg name="enable_infra2" value="false"/>
  <!-- Run static TF broadcasters in place of URDF model -->
  <node name="radar_tf" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 map radar_frame 100" />
  <node name="radar_to_camera_tf" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 radar_frame camera_color_frame 100" />

  <!-- Run the radar camera fusion node -->
  <node name="radar_camera_test" pkg="ainstein_radar_tools" type="radar_camera_test_node" output="screen" >
    <remap from="radar_topic" to="/k79_node/targets/raw" />
    <remap from="camera_topic" to="/camera/color/image_raw" />

  <!-- Open an image viewer for the processed image -->
  <node name="image_view" pkg="image_view" type="image_view" >
    <remap from="image" to="/radar_camera_test/image_out" />


Wiki: ainstein_radar/Tutorials/Superimposing radar data on camera images (last edited 2019-11-22 15:24:39 by nrotella-ainstein)