前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AGV平面坐标系变换公式及实例

AGV平面坐标系变换公式及实例

作者头像
用户5908113
发布2024-07-26 18:15:34
140
发布2024-07-26 18:15:34
举报
文章被收录于专栏:Pou光明

1、AGV坐标系简介

如上图,小车前后对角是有激光雷达的,其坐标系称为激光坐标系,采用极坐标系体现。中间为车体坐标系,激光坐标系相对于车体坐标系关系不变;左下角是地图坐标系,小车扫图后,建立的坐标系即为地图坐标系,小车在运动过程中,车体坐标系相对于地图坐标系是变化的。

2、坐标系旋转与点旋转的变换公式

坐标系旋转:

直角坐标系 XOY逆时针旋转 θ角后变成 X′OY′,原坐标系内点的坐标变化为:

如果是顺时针旋转,则将 𝜃 改为 −𝜃 带入公式。

另一种表达方式:

即X′OY′坐标系相对于“静止”XOY坐标系顺时针旋转:

x1=xcos(β)+ysin(β); y1=ycos(β)-xsin(β);

X′OY′坐标系相对于“静止”XOY坐标系逆时针旋转:

x1=xcos(β)-ysin(β); y1=ycos(β)+xsin(β);

坐标系旋转公式推导图1

点的旋转:

直角坐标系 XOY内的点 A(x,y)绕原点逆时针旋转 α 角后得到点 B(x′,y′),两点坐标关系为:

3、小车中激光雷达点云转换例子实战

再次温习这个图。

①激光的点云由极坐标点转直角坐标系点:

x=r⋅cos(θ)

y=r⋅sin(θ)

直角坐标转极坐标系:

②激光坐标系转小车坐标系

这两个坐标系相对关系固定,激光坐标系相对于小车坐标系的变换可以认为是小车坐标系旋转到激光坐标系,这样激光坐标系的点就映射到了小车坐标系。实际中,除了旋转还有原点位置的偏差,这块直接加上差值即可,差值是激光坐标系原点相对于小车坐标系坐标系原点的参数,接口可以获取。

灵魂代码如下:

代码语言:javascript
复制
cartesian_x = dist*cos(angle+install_info_yaw) + install_info_x;
cartesian_y = dist*sin(angle+install_info_yaw) + install_info_y;

展开后发现是激光雷达坐标的install_info_yaw相对于小车坐标系都是逆时针数据。

③小车坐标系下的雷达点云数据相对于地图坐标系的转换

此时地图坐标系是“静止”的,那么接口给出的小车实时位置x,y和yaw信息是相对于

地图坐标系的。根据坐标系旋转公式推导图1,已知的是红色坐标系下的点(小车坐标系),求蓝色坐标系下的点(地图坐标系),即已知x’,y’,θ求x,y。我的处理方式是求旋转矩阵的逆,然后再求出x,y,用的eigen库。坐标系旋转都是相对的,后面想起更好的方式再记录。

代码语言:javascript
复制
if(robot_push_data_.angle > 0){
    float agv_yal = -robot_push_data_.angle;
    Eigen::Matrix2d r;
    r << cos(agv_yal), sin(agv_yal),
         -sin(agv_yal), cos(agv_yal);
         Eigen::MatrixXd pos(2,1);
         pos(0,0) = cartesian_x;
         pos(1,0) = cartesian_y;

    Eigen::MatrixXd posnew(2,1);
    posnew = r.inverse()*pos;

    cartesian_x = posnew(0,0) + robot_push_data_.x;
    cartesian_y = posnew(1,0) + robot_push_data_.y;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2、坐标系旋转与点旋转的变换公式
  • 坐标系旋转:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档