赞
踩
roslaunch r3live r3live_reconstruct_mesh.launch运行后会生成texttured_mesh.ply文件
在r3live_output目录下运行
meshlab textured_mesh.ply
可以查看mesh后的地图
需注意R3LIVE与R2LIVE使用了相似的数据流模式,调试时不需要额外进行数据帧的时间对齐
关于时间戳的问题(livox_ros_driver_for_R2LIVE)
使用livox官方的livox_ros_driver会有rbg和点云,imu时间戳不同步的问题,因为官方的时间戳从雷达开始开同步,而相机一般是和系统时间同步,需要修改Livox-ros-driver时间戳为系统时间。修改在lddc.cpp
修改一 #include "lds_lidar.h" #include "lds_lvx.h" /**************** Modified for R2LIVE **********************/ double g_ros_init_start_time = -3e8; double init_lidar_tim = 3e10; double init_ros_time = 0; double skip_frame = 100; /**************** Modified for R2LIVE **********************/ 修改二 /**************** Modified for R2LIVE **********************/ livox_msg.header.stamp = ros::Time((timestamp - init_lidar_tim - packet_offset_time ) / 1e9 + init_ros_time); /**************** Modified for R2LIVE **********************/ ros::Publisher *p_publisher = Lddc::GetCurrentPublisher(handle); 修改三 imu_data.linear_acceleration.x = imu->acc_x; imu_data.linear_acceleration.y = imu->acc_y; imu_data.linear_acceleration.z = imu->acc_z; /**************** Modified for R2LIVE **********************/ if (1) { // if (g_ros_init_start_time < 0 && timestamp >= 0) if (skip_frame) { skip_frame--; init_ros_time = ros::Time::now().toSec(); init_lidar_tim = timestamp; g_ros_init_start_time = timestamp; ROS_INFO("========================"); ROS_INFO("Init time stamp = %lf", g_ros_init_start_time); ROS_INFO("========================"); } // ANCHOR: Hack IMU time imu_data.header.stamp = ros::Time((timestamp - init_lidar_tim) / 1e9 + init_ros_time); // std::cout << timestamp << " | " << (timestamp - init_lidar_tim)/1e9 << " | " << imu_data.header.stamp.toNSec() / 1e9 << " | " << ros::Time::now().toNSec() / 1e9 << std::endl; // printf("%lf | %lf | %lf \r\n", ros::Time::now().toSec(), imu_data.header.stamp.toSec(), (timestamp - init_lidar_tim) / 1e9); // std::cout << timestamp << " | " << g_ros_init_start_time << " | " << imu_data.header.stamp.toNSec() / 1e9 << " | " << ros::Time::now().toNSec() / 1e9 << std::endl; double g_val = 9.805; imu_data.linear_acceleration.x *= g_val; imu_data.linear_acceleration.y *= g_val; imu_data.linear_acceleration.z *= g_val; /**************** Modified for R2LIVE **********************/ } QueuePopUpdate(queue); ++published_packet; ros::Publisher *p_publisher = Lddc::GetCurrentImuPublisher(handle);
开启时间同步操作 livox_lidar_config.json
{ "lidar_config": [ { "broadcast_code": "1PQDH5B00100041", "enable_connect": false, "return_mode": 0, "coordinate": 0, "imu_rate": 0, "extrinsic_parameter_source": 0, "enable_high_sensitivity": false }, { "broadcast_code": "0TFDG3U99101431", "enable_connect": false, "return_mode": 0, "coordinate": 0, "imu_rate": 0, "extrinsic_parameter_source": 0, "enable_high_sensitivity": false } ], "timesync_config": { "enable_timesync": true, "device_name": "/dev/video0", "comm_device_type": 0, "baudrate_index": 2, "parity_index": 0 } }
r3live作者提供的修改方案针对avia,雷达内置了IMU,在lddc.cpp中把雷达imu的时间戳也改了。如果使用mid70这类不带imu的,不需要需改IMU时间戳。使用预留宏编译的方式去选择编译官方版本的还是编译修改时间戳的
关于IMU的一些问题,如果使用的是avia或者mid360,雷达内是内置imu的,不需要再做额外的处理。如果使用的是mid70这类不含imu的,需要使用RealSense输出IMU,由于安装方式导致IMU与雷达坐标系不匹配,通过ROS中的imu_transformer功能包进行修改
imu_pipeline功能包集
需要注意的是修改cpp内订阅的imu话题名,D455或者D435i正装情况下tf静态旋转参数在launch文件内修改
<?xml version="1.0"?> <launch> <!-- Sample launch file, transforms NED referenced data in imu_link_ned to ENU equivalent data in imu_link --> <!-- Static tfs --> <node pkg="tf2_ros" type="static_transform_publisher" name="tf_imu_ned_enu" args="0 0 0 1.5708 -1.5708 0 camera_imu_optical_frame livox_frame" output="screen"/> <!-- Transforms NED IMU data pulished in frame imu_link_ned on topics /imu/data_ned and /imu/mag_ned to ENU data in frame imu_link published on /imu/data_enu and /imu/mag_enu --> <node pkg="imu_transformer" type="imu_transformer_node" name="imu_data_transformer" output="screen"> <remap from="imu_in" to="camera"/> <remap from="imu_out" to="trans"/> <param name="target_frame" value="livox_frame"/> </node> </launch>
mesh重建和纹理贴图的具体操作
关于运行r3live-bag.launch中参数设置的问题
<param name="LiDAR_pointcloud_topic" type="string" value= "/laser_cloud_flat" />
<param name="IMU_topic" type="string" value= "/livox/imu" />
<param name="Image_topic" type="string" value= "/usb_cam/image_raw" />
激光雷达点云/laser_cloud_flat是r3live自己发出的,订阅外部雷达需要通过设置lidar_type控制,lidar_type=1 就会订阅livox类型的点云,话题名已经在代码内固定写好
/usb_cam/image_raw 图像话题传入后会自动添加压缩后缀compressed,看好传入的图像话题,这里不要写压缩后缀
error: conflicting declaration ‘typedef struct LZ4_streamDecode_t LZ4_streamDecode_t’
在 /usr/include/flann/util/serialization.h 这头文件顶部把引用LZ4的两行改为:
#include "lz4.h"
#include "lz4hc.h"
error: invalid initialization of reference of type ‘const cv::ParallelLoopBody&’ from expression of type ‘LK_optical_flow_kernel::track_image(const cv::Mat&, const std::vector<cv::Point_ >&, std::vector<cv::Point_ >&, std::vector&, int)::<lambda(const cv::Range&)>’
});
opencv版本太低
fatal error: visualization_msgs/Marker.h: 没有那个文件或目录
sudo apt-get install ros-melodic-rviz
R3live运行起来有明显延时,图像滞后后严重。原因可能在相机
相机曝光时间太长影响了实时性
原理:曝光时间影响了图片发布频率,进而影响了时间对齐效果,r3live运行速度
根源还是三个话题的时间对齐
rosrun topic_tools throttle messages /camera/color/image_raw/compressed 5 /camera/color/image_raw_t/compressed
可以强制更新话题频率,将时间同步控制在一定范围内
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。