LIDAR and Stereo Camera Calibration. Remap input topics
Hi All
I have Quanergy LIDAR and PointGrey Grasshoppers RGB cameras that are connected as Master Slave and work as stereo Camera. I want to do Sensor Fusion of LIDAR and Cemeras and for that need to calibrate the LIDAR and Cameras. I have python code but is not working. I took the code from link text and modified to work for my sensors. So This package assumes that the bag file has at least the following topic names and message types by default, these can be modified in the launch scripts.
/sensors/camera/camera_info (sensor_msgs/CameraInfo)
/sensors/camera/image_color (sensor_msgs/Image)
/sensors/velodyne_points (sensor_msgs/PointCloud2)
In my case these are
/stereo/left/camera_info
/stereo/left/image_rect_color
/Sensor/points
Here are the scripts
'''
The main ROS node which handles the topics
Inputs:
camera_info - [str] - ROS sensor camera info topic
image_color - [str] - ROS sensor image topic
velodyne - [str] - ROS velodyne PCL2 topic
camera_lidar - [str] - ROS projected points image topic
Outputs: None
'''
def listener(camera_info, image_raw, points, camera_lidar=None):
# Start node
rospy.init_node('calibrate_camera_lidar', anonymous=True)
rospy.loginfo('Current PID: [%d]' % os.getpid())
rospy.loginfo('Projection mode: %s' % PROJECT_MODE)
rospy.loginfo('CameraInfo topic: %s' % camera_info)
rospy.loginfo('Image topic: %s' % image_raw)
rospy.loginfo('PointCloud2 topic: %s' % points)
rospy.loginfo('Output topic: %s' % camera_lidar)
# Subscribe to topics
info_sub = message_filters.Subscriber(camera_info, CameraInfo)
image_sub = message_filters.Subscriber(image_raw, Image)
Sensor_sub = message_filters.Subscriber(points, PointCloud2)
# Publish output topic
image_pub = None
if camera_lidar: image_pub = rospy.Publisher(camera_lidar, Image, queue_size=5)
# Synchronize the topics by time
ats = message_filters.ApproximateTimeSynchronizer(
[image_sub, info_sub, Sensor_sub], queue_size=5, slop=0.1)
ats.registerCallback(callback, image_pub)
# Keep python from exiting until this node is stopped
try:
rospy.spin()
except rospy.ROSInterruptException:
rospy.loginfo('Shutting down')
if __name__ == '__main__':
# Calibration mode, rosrun
if sys.argv[1] == '--calibrate':
camera_info = '/stereo/left/camera_info'
image_raw = '/stereo/left/image_raw'
points = '/Sensor/points'
camera_lidar = None
PROJECT_MODE = False
# Projection mode, run from launch file
else:
camera_info = rospy.get_param('camera_info_topic')
image_raw = rospy.get_param('image_color_topic')
points = rospy.get_param('points_topic')
camera_lidar = rospy.get_param('camera_lidar_topic')
PROJECT_MODE = bool(rospy.get_param('project_mode'))
# Start keyboard handler thread
if not PROJECT_MODE: start_keyboard_handler()
# Start subscriber
listener(camera_info, image_raw, points, camera_lidar)
and display lidar camera calibration
?xml version="1.0" encoding="UTF-8"?>
<launch>
<arg name="camera" default="/stereo/left" />
<!-- Play rosbag record -->
<include file="$(find lidar_camera_calibration)/launch/play_rosbag.launch">
<arg name="bagfile" value="2019-10-24-16-56-30.bag" />
</include>
<!-- Nodelet manager for this pipeline -->
<node
pkg="nodelet"
type="nodelet"
args="manager"
name="lidar_camera_manager"
output="screen" />
<node
pkg="image_proc"
type="image_proc"
name="image_proc_node1" />
<!-- Run image_proc/rectify nodelet -->
<node
pkg="nodelet"
type="nodelet"
name="rectify_color"
args="load image_proc/rectify lidar_camera_manager --no-bond" >
<!-- Remap input topics -->
<remap from="image_mono" to="$(arg camera)/image_rect_color" />
<remap from="camera_info" to="$(arg camera)/camera_info" />
<!-- Remap output topics -->
<remap from="image_rect" to="$(arg camera)/image_rect" />
</node>
<!-- Wire static transform from the world to velodyne frame -->
<node
pkg="tf2_ros"
type="static_transform_publisher"
name="world_velodyne_tf"
output="screen"
args="-0.0 -0.0 -0.0 0.0 -0.0 -0.0 world Sensor" />
<!-- Setup params for Camera-LiDAR calibration script -->
<param name="camera_info_topic" type="str" value="$(arg camera)/camera_info" />
<param name="image_color_topic" type="str" value="$(arg camera)/image_rect_color" />
<param name="points_topic" type="str" value="/Sensor/points" />
<param name="camera_lidar_topic" type="str" value="$(arg camera)/camera_lidar" />
<param name="project_mode" type="bool" value="true" />
<!-- Run Camera-LiDAR projection script -->
<node
pkg="lidar_camera_calibration"
type="calibrate_camera_lidar.py"
name="calibrate_camera_lidar"
output="screen" />
<!-- Run image view to display the projected points image -->
<node
name="camera_lidar_projection"
pkg="image_view"
type="image_view"
respawn="false"
output="screen">
<!-- Remap input topics -->
<remap from="image" to="$(arg camera)/camera_lidar" />
</node>
</launch>
After play the recorded bag file the rostopic list is
/Sensor/points
/clock
/rosout
/rosout_agg
/stereo/left/camera_info
/stereo/left/image_raw
/stereo/left/image_rect
/stereo/left/image_rect_color
Any help?
Asked by Astronaut on 2019-10-25 01:46:39 UTC
Comments
Can you tell what the exact problem is that you are having?
Asked by Choco93 on 2019-10-25 07:53:58 UTC
when try to perform calibration using the matplotlib GUI to pick correspondences in the camera and the LiDAR frames wirh
roslaunch lidar_camera_calibration play_rosbag.launch bagfile:=/path/to/file.bag
androsrun lidar_camera_calibration calibrate_camera_lidar.py --calibrate
it doesnt open the GUI but it compile. So any help?Asked by Astronaut on 2019-10-26 05:00:34 UTC