Kitti数据集标签中yaw角在不同坐标系的转换

KITTI数据集中坐标系的定义如下图:

相机坐标系(俯视)
激光雷达坐标系(俯视)

 在标签文件(label)中,最后一个值为物体前进方向与x轴夹角的弧度值(在相机坐标系下)且以X轴->Y轴方向为负,Y轴->X轴方向为正

举个例子:如上图第一个car数据为例,其前进方向与x轴夹角(也称为yaw角)为-89.9°(-1.57*180/pi)


那么坐标系向雷达坐标系转换后,其raw角就变成了-(r_y + pi/2) ,且在雷达坐标系下,以X轴->Y轴方向为正。则接上一个例子,如图所示,其在雷达坐标系下的yaw角度为-0.1°。(图中X'为雷达坐标系下的X轴,X为相机坐标系的X轴,皆是俯视状态)

`pcl::PassThrough` 过滤器可以对点云数据进行限定范围过滤,但是不能直接过滤指定yaw的点云。如果需要过滤指定yaw的点云,可以通过以下步骤实现: 1. 将点云转换到某个参考坐标系下。 2. 计算每个点相对于参考坐标系yaw。 3. 使用 `pcl::PassThrough` 过滤器对yaw在指定范围内的点云进行过滤。 其第2步,可以使用 `pcl::getAngle3D` 函数计算点云相对于参考坐标系yaw。具体实现可以参考以下代码: ```cpp // 定义一个欧拉变量存储点云的欧拉 Eigen::Vector3f euler; // 将点云转换到某个参考坐标系下 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_transformed (new pcl::PointCloud<pcl::PointXYZ>); pcl::transformPointCloud (*cloud_in, *cloud_transformed, transform); // 计算每个点相对于参考坐标系yaw for (size_t i = 0; i < cloud_transformed->size (); ++i) { const pcl::PointXYZ& pt = cloud_transformed->points[i]; euler = pt.getVector3fMap ().cast<float>().eulerAngles(0, 1, 2); float yaw = euler[2] * 180 / M_PI; // 弧度转度 } ``` 第3步,可以设置 `pcl::PassThrough` 过滤器的 `setFilterFieldName` 函数为yaw度字段,然后调用 `setFilterLimits` 函数设置过滤范围。具体实现可以参考以下代码: ```cpp // 过滤yaw在[-90, 90]之间的点云 pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud (cloud_transformed); pass.setFilterFieldName ("yaw"); pass.setFilterLimits (-90.0, 90.0); pass.filter (*cloud_out); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值