ROS Realsense SDK发布图像和Camera_info

本文介绍如何使用ROS与librealsense库实现Realsense摄像头的数据发布,包括图像与相机内参的同步发布,并提供了关键代码示例。

先上代码:

#include <ros/ros.h>
#include <librealsense2/rs.hpp>
#include <iostream> 
#include <opencv2/opencv.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <vector>
#include <camera_info_manager/camera_info_manager.h>

using namespace std;

sensor_msgs::CameraInfoPtr getCameraInfo(rs2_intrinsics intrinsecs)
{
    sensor_msgs::CameraInfoPtr cam(new sensor_msgs::CameraInfo());
    vector<double> D{intrinsecs.coeffs[0], intrinsecs.coeffs[1], intrinsecs.coeffs[2], intrinsecs.coeffs[3], intrinsecs.coeffs[4]};
    boost::array<double, 9> K = {
        intrinsecs.fx,          0,  intrinsecs.ppx,
        0,        intrinsecs.fy,    intrinsecs.ppy,
        0,        0,        1,
    };
    
    vector<double> k = {intrinsecs.fx,          0,  intrinsecs.ppx,
        0,        intrinsecs.fy,    intrinsecs.ppy,
        0,        0,        1};

    cv::Mat p = cv::getOptimalNewCameraMatrix(k, D, cv::Size(640, 480), 0);        // get rectified projection.
    boost::array<double, 12> P = {
        p.at<double>(0,0),        p.at<double>(0,1),        p.at<double>(0,2),        p.at<double>(0,3),
        p.at<double>(1,0),        p.at<double>(1,1),        p.at<double>(1,2),        p.at<double>(1,3),
        p.at<double>(2,0),        p.at<double>(2,1),        p.at<double>(2,2),        p.at<double>(2,3)
    };
    boost::array<double, 9> r = {1, 0, 0, 0, 1, 0, 0, 0, 1};

    cam->height = 480;
    cam->width = 640;
    cam->distortion_model = "plumb_bob";
    cam->D = D;
    cam->K = K;
    cam->P = P;
    cam->R = r;
    // cam.binning_x = 0;
    // cam.binning_y = 0;
    return cam;
}

int main(int argc, char * argv[]) 
{   
    ros::init(argc, argv, "librealsense_publisher");
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    
    image_transport::CameraPublisher rgb_pub = it.advertiseCamera("librealsense/rgb", 1);

    image_transport::CameraPublisher depth_pub = it.advertiseCamera("librealsense/depth", 1);

    try
    {
        rs2::config cfg;
        
        cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 60);
        cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 60);

        rs2::pipeline pipe;
        pipe.start(cfg);
        rs2::frameset frames;

        rs2::device dev = pipe.get_active_profile().get_device();
        dev.query_sensors()[1].set_option(rs2_option::RS2_OPTION_EXPOSURE, 50);

        sensor_msgs::CameraInfoPtr color_cameraInfo_, depth_cameraInfo_;
        bool key_param = true;

        ROS_INFO("=============Realsense Successful start================");
        
        ros::Rate rate(60);
        while (ros::ok())
        {
            frames = pipe.wait_for_frames();

            rs2::depth_frame depth  = frames.get_depth_frame();
            rs2::frame color = frames.get_color_frame();

            if (!color || !depth) break; 
            cv::Mat image(cv::Size(640, 480), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
            cv::Mat depthmat(cv::Size(640, 480), CV_16U, (void*)depth.get_data(), cv::Mat::AUTO_STEP);

            sensor_msgs::ImagePtr rgb_msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
            sensor_msgs::ImagePtr depth_msg = cv_bridge::CvImage(std_msgs::Header(), "16UC1", depthmat).toImageMsg();

            if(key_param)
            {
                rs2::stream_profile dprofile =  depth.get_profile();
                rs2::stream_profile cprofile =  color.get_profile();
                // get color intrinsics
                rs2::video_stream_profile cvsprofile(cprofile);
                rs2_intrinsics color_intrin =  cvsprofile.get_intrinsics();

                // get depth intrinsics
                rs2::video_stream_profile dvsprofile(dprofile);
                rs2_intrinsics depth_intrin =  dvsprofile.get_intrinsics();

                color_cameraInfo_ = getCameraInfo(color_intrin);
                depth_cameraInfo_ = getCameraInfo(depth_intrin);
				
				rgb_msg->header.stamp = ros::Time::now();
            	depth_msg->header.stamp = ros::Time::now();
            	
                color_cameraInfo_->header.stamp = rgb_msg->header.stamp;
                color_cameraInfo_->header.frame_id = rgb_msg->header.frame_id;

                depth_cameraInfo_->header.stamp = depth_msg->header.stamp;
                depth_cameraInfo_->header.frame_id = depth_msg->header.frame_id;
                
                key_param = false;
            }

            rgb_pub.publish(rgb_msg, color_cameraInfo_);
            depth_pub.publish(depth_msg, depth_cameraInfo_);
            
            ros::spinOnce();

            rate.sleep();
        }
        
        pipe.stop();
        return EXIT_SUCCESS;
    }
    catch (const rs2::error & e)
    {
        // std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n    " << e.what() << std::endl;
        ROS_ERROR("[rs_camera_node]: RealSense error calling ");
        return EXIT_FAILURE;
    }
    catch (const std::exception& e)
    {   
        ROS_ERROR("[rs_camera_node]: RealSense failed connect");
        return EXIT_FAILURE;
    }
}

主要踩坑点在发布和内参控制部分,发布的时候照片类型是sensor_msgs::ImagePtr,相机数据类型是sensor_msgs::CameraInfoPtr,使用image_transport::CameraPublisher 来发布消息,否则没法同时发布图像和相机信息。

roslaunch realsense2_camera rs_camera.launch ... logging to /home/lilabws001/.ros/log/c02d0ede-6eab-11f0-b2db-5198d7514de2/roslaunch-lilabws001-201696.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://lilabws001:45387/ SUMMARY ======== PARAMETERS * /camera/realsense2_camera/accel_fps: -1 * /camera/realsense2_camera/accel_frame_id: camera_accel_frame * /camera/realsense2_camera/accel_optical_frame_id: camera_accel_opti... * /camera/realsense2_camera/align_depth: False * /camera/realsense2_camera/aligned_depth_to_color_frame_id: camera_aligned_de... * /camera/realsense2_camera/aligned_depth_to_fisheye1_frame_id: camera_aligned_de... * /camera/realsense2_camera/aligned_depth_to_fisheye2_frame_id: camera_aligned_de... * /camera/realsense2_camera/aligned_depth_to_fisheye_frame_id: camera_aligned_de... * /camera/realsense2_camera/aligned_depth_to_infra1_frame_id: camera_aligned_de... * /camera/realsense2_camera/aligned_depth_to_infra2_frame_id: camera_aligned_de... * /camera/realsense2_camera/allow_no_texture_points: False * /camera/realsense2_camera/base_frame_id: camera_link * /camera/realsense2_camera/calib_odom_file: * /camera/realsense2_camera/clip_distance: -2.0 * /camera/realsense2_camera/color_fps: -1 * /camera/realsense2_camera/color_frame_id: camera_color_frame * /camera/realsense2_camera/color_height: -1 * /camera/realsense2_camera/color_optical_frame_id: camera_color_opti... * /camera/realsense2_camera/color_width: -1 * /camera/realsense2_camera/confidence_fps: -1 * /camera/realsense2_camera/confidence_height: -1 * /camera/realsense2_camera/confidence_width: -1 * /camera/realsense2_camera/depth_fps: -1 * /camera/realsense2_camera/depth_frame_id: camera_depth_frame * /camera/realsense2_camera/depth_height: -1 * /camera/realsense2_camera/depth_optical_frame_id: camera_depth_opti... * /camera/realsense2_camera/depth_width: -1 * /camera/realsense2_camera/device_type: * /camera/realsense2_camera/enable_accel: False * /camera/realsense2_camera/enable_color: True * /camera/realsense2_camera/enable_confidence: True * /camera/realsense2_camera/enable_depth: True * /camera/realsense2_camera/enable_fisheye1: False * /camera/realsense2_camera/enable_fisheye2: False * /camera/realsense2_camera/enable_fisheye: False * /camera/realsense2_camera/enable_gyro: False * /camera/realsense2_camera/enable_infra1: False * /camera/realsense2_camera/enable_infra2: False * /camera/realsense2_camera/enable_infra: False * /camera/realsense2_camera/enable_pointcloud: False * /camera/realsense2_camera/enable_pose: False * /camera/realsense2_camera/enable_sync: False * /camera/realsense2_camera/filters: * /camera/realsense2_camera/fisheye1_frame_id: camera_fisheye1_f... * /camera/realsense2_camera/fisheye1_optical_frame_id: camera_fisheye1_o... * /camera/realsense2_camera/fisheye2_frame_id: camera_fisheye2_f... * /camera/realsense2_camera/fisheye2_optical_frame_id: camera_fisheye2_o... * /camera/realsense2_camera/fisheye_fps: -1 * /camera/realsense2_camera/fisheye_frame_id: camera_fisheye_frame * /camera/realsense2_camera/fisheye_height: -1 * /camera/realsense2_camera/fisheye_optical_frame_id: camera_fisheye_op... * /camera/realsense2_camera/fisheye_width: -1 * /camera/realsense2_camera/gyro_fps: -1 * /camera/realsense2_camera/gyro_frame_id: camera_gyro_frame * /camera/realsense2_camera/gyro_optical_frame_id: camera_gyro_optic... * /camera/realsense2_camera/imu_optical_frame_id: camera_imu_optica... * /camera/realsense2_camera/infra1_frame_id: camera_infra1_frame * /camera/realsense2_camera/infra1_optical_frame_id: camera_infra1_opt... * /camera/realsense2_camera/infra2_frame_id: camera_infra2_frame * /camera/realsense2_camera/infra2_optical_frame_id: camera_infra2_opt... * /camera/realsense2_camera/infra_fps: 30 * /camera/realsense2_camera/infra_height: 480 * /camera/realsense2_camera/infra_rgb: False * /camera/realsense2_camera/infra_width: 848 * /camera/realsense2_camera/initial_reset: False * /camera/realsense2_camera/json_file_path: * /camera/realsense2_camera/linear_accel_cov: 0.01 * /camera/realsense2_camera/odom_frame_id: camera_odom_frame * /camera/realsense2_camera/ordered_pc: False * /camera/realsense2_camera/pointcloud_texture_index: 0 * /camera/realsense2_camera/pointcloud_texture_stream: RS2_STREAM_COLOR * /camera/realsense2_camera/pose_frame_id: camera_pose_frame * /camera/realsense2_camera/pose_optical_frame_id: camera_pose_optic... * /camera/realsense2_camera/publish_odom_tf: True * /camera/realsense2_camera/publish_tf: True * /camera/realsense2_camera/reconnect_timeout: 6.0 * /camera/realsense2_camera/rosbag_filename: * /camera/realsense2_camera/serial_no: * /camera/realsense2_camera/stereo_module/exposure/1: 7500 * /camera/realsense2_camera/stereo_module/exposure/2: 1 * /camera/realsense2_camera/stereo_module/gain/1: 16 * /camera/realsense2_camera/stereo_module/gain/2: 16 * /camera/realsense2_camera/tf_publish_rate: 0.0 * /camera/realsense2_camera/topic_odom_in: odom_in * /camera/realsense2_camera/unite_imu_method: * /camera/realsense2_camera/usb_port_id: * /camera/realsense2_camera/wait_for_device_timeout: -1.0 * /rosdistro: noetic * /rosversion: 1.17.0 NODES /camera/ realsense2_camera (nodelet/nodelet) realsense2_camera_manager (nodelet/nodelet) ROS_MASTER_URI=http://localhost:11311 process[camera/realsense2_camera_manager-1]: started with pid [201731] process[camera/realsense2_camera-2]: started with pid [201732] [ INFO] [1754036964.913405325]: Initializing nodelet with 20 worker threads. [ INFO] [1754036965.020815705]: RealSense ROS v2.3.2 [ INFO] [1754036965.020848598]: Built with LibRealSense v2.50.0 [ INFO] [1754036965.020857879]: Running with LibRealSense v2.50.0 [ INFO] [1754036965.058538813]: [ INFO] [1754036965.225811365]: Device with serial number 108222250371 was found. [ INFO] [1754036965.225849374]: Device with physical ID 1-10.1-23 was found. [ INFO] [1754036965.225861244]: Device with name Intel RealSense D455 was found. [ INFO] [1754036965.226270920]: Device with port number 1-10.1 was found. [ INFO] [1754036965.226291110]: Device USB type: 2.1 [ WARN] [1754036965.226304887]: Device 108222250371 is connected using a 2.1 port. Reduced performance is expected. [ INFO] [1754036965.228672231]: getParameters... [ INFO] [1754036965.284551798]: setupDevice... [ INFO] [1754036965.284584183]: JSON file is not provided [ INFO] [1754036965.284595976]: ROS Node Namespace: camera [ INFO] [1754036965.284609507]: Device Name: Intel RealSense D455 [ INFO] [1754036965.284619165]: Device Serial No: 108222250371 [ INFO] [1754036965.284633319]: Device physical port: 1-10.1-23 [ INFO] [1754036965.284648012]: Device FW version: 05.17.00.10 [ INFO] [1754036965.284657774]: Device Product ID: 0x0B5C [ INFO] [1754036965.284666390]: Enable PointCloud: Off [ INFO] [1754036965.284675432]: Align Depth: Off [ INFO] [1754036965.284683878]: Sync Mode: Off [ INFO] [1754036965.284721925]: Device Sensors: [ INFO] [1754036965.375493262]: Stereo Module was found. [ INFO] [1754036965.391904948]: RGB Camera was found. [ INFO] [1754036965.392118870]: Motion Module was found. [ INFO] [1754036965.392181383]: (Confidence, 0) sensor isn't supported by current device! -- Skipping... [ INFO] [1754036965.392219984]: num_filters: 0 [ INFO] [1754036965.392245841]: Setting Dynamic reconfig parameters. hwmon command 0x80( 5 0 0 0 ) failed (response -7= HW not ready) hwmon command 0x80( 5 0 0 0 ) failed (response -7= HW not ready) hwmon command 0x80( 5 0 0 0 ) failed (response -7= HW not ready) hwmon command 0x80( 5 0 0 0 ) failed (response -7= HW not ready) [ INFO] [1754036968.710727121]: Done Setting Dynamic reconfig parameters. [ INFO] [1754036968.711582313]: depth stream is enabled - width: 640, height: 480, fps: 15, Format: Z16 [ INFO] [1754036968.712503805]: color stream is enabled - width: 640, height: 480, fps: 15, Format: RGB8 [ INFO] [1754036968.712561740]: setupPublishers... [ INFO] [1754036968.716654813]: Expected frequency for depth = 15.00000 [ INFO] [1754036968.769133426]: Expected frequency for color = 15.00000 [ INFO] [1754036968.810623444]: setupStreams... 01/08 16:29:29,083 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,133 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,183 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 [ INFO] [1754036969.234680098]: SELECTED BASE:Depth, 0 [ INFO] [1754036969.252700102]: RealSense Node Is Up! [ WARN] [1754036969.416650092]: 01/08 16:29:29,417 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,468 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,518 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,569 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,621 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,672 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,824 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:29,976 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:30,027 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:30,178 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: Success, number: 0 01/08 16:29:30,228 WARNING [140121396254464] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: S
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值