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

1、AGV坐标系简介

d1048ed21fe73842fe5a624c58811e9f.png

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

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

坐标系旋转:  

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

19b71983ed78a4261d7c434b98d8a92d.png

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

另一种表达方式:

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

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

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

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

eb7a58254da5311f7b2169655f866201.jpeg

坐标系旋转公式推导图1

点的旋转:

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

a158bd3362e0c9874086af7823bf44da.png

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

12dc35a5462d591dd62ff4f1aeae23ef.png

再次温习这个图。

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

x=r⋅cos(θ)

y=r⋅sin(θ)

直角坐标转极坐标系:

21264af8b73e56fef0909fad6087adae.png

82037f40ca029d9bd284036db215c62f.png

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

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

灵魂代码如下:

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库。坐标系旋转都是相对的,后面想起更好的方式再记录。

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;
}

欢迎关注!探索不同。

2b17efb827995eddbd9bffbd6e2170e4.png

在 JavaScript 中实现 AGV(Automated Guided Vehicle,自动导引车)坐标转换,通常会涉及到不同坐标系之间的转换,如从世界坐标系到局部坐标系,或者从一个局部坐标系转换到另一个局部坐标系。以下是几种常见的坐标转换场景及实现方法: ### 平移转换 平移转换是将坐标在某个方向上进行移动。假设在二维平面上,将点 $(x, y)$ 沿着 $x$ 轴平移 $tx$ 个单位,沿着 $y$ 轴平移 $ty$ 个单位,转换后的坐标 $(x', y')$ 可以通过以下公式计算: $x' = x + tx$ $y' = y + ty$ 以下是 JavaScript 实现: ```javascript function translateCoordinates(x, y, tx, ty) { const newX = x + tx; const newY = y + ty; return [newX, newY]; } // 使用示例 const originalX = 10; const originalY = 20; const translationX = 5; const translationY = 3; const [newX, newY] = translateCoordinates(originalX, originalY, translationX, translationY); console.log(`转换后的坐标: (${newX}, ${newY})`); ``` ### 旋转变换 旋转变换是将坐标绕原点旋转一个角度 $\theta$。在二维平面上,点 $(x, y)$ 绕原点旋转 $\theta$ 角度后的坐标 $(x', y')$ 可以通过以下公式计算: $x' = x \cos(\theta) - y \sin(\theta)$ $y' = x \sin(\theta) + y \cos(\theta)$ 以下是 JavaScript 实现: ```javascript function rotateCoordinates(x, y, theta) { const cosTheta = Math.cos(theta); const sinTheta = Math.sin(theta); const newX = x * cosTheta - y * sinTheta; const newY = x * sinTheta + y * cosTheta; return [newX, newY]; } // 使用示例 const originalX = 10; const originalY = 20; const rotationAngle = Math.PI / 4; // 旋转 45 度 const [newX, newY] = rotateCoordinates(originalX, originalY, rotationAngle); console.log(`转换后的坐标: (${newX}, ${newY})`); ``` ### 仿射变换 仿射变换是平移、旋转、缩放等变换的组合。在二维平面上,仿射变换可以通过一个 $3 \times 3$ 的变换矩阵来表示。以下是一个简单的仿射变换示例,包含平移和旋转: ```javascript function affineTransformation(x, y, tx, ty, theta) { const cosTheta = Math.cos(theta); const sinTheta = Math.sin(theta); const newX = x * cosTheta - y * sinTheta + tx; const newY = x * sinTheta + y * cosTheta + ty; return [newX, newY]; } // 使用示例 const originalX = 10; const originalY = 20; const translationX = 5; const translationY = 3; const rotationAngle = Math.PI / 4; // 旋转 45 度 const [newX, newY] = affineTransformation(originalX, originalY, translationX, translationY, rotationAngle); console.log(`转换后的坐标: (${newX}, ${newY})`); ``` ### 三维坐标转换 如果涉及到三维空间中的坐标转换,通常会使用 $4 \times 4$ 的变换矩阵。可以使用 Three.js 等库来处理三维坐标转换。以下是一个简单的三维平移示例: ```javascript // 使用 Three.js 进行三维平移 import * as THREE from 'three'; const originalPosition = new THREE.Vector3(10, 20, 30); const translation = new THREE.Vector3(5, 3, 2); const newPosition = originalPosition.clone().add(translation); console.log(`转换后的坐标: (${newPosition.x}, ${newPosition.y}, ${newPosition.z})`); ``` ### 相关问题 1. 如何在 JavaScript 中实现 AGV 坐标的缩放转换? 2. 有没有适用于 JavaScript 的 AGV 坐标转换库推荐? 3. 如何处理 AGV 坐标转换中的误差? 4. 在 JavaScript 中,如何实现 AGV 从世界坐标系到相机坐标系的转换? 5. 对于复杂的 AGV 运动轨迹,如何进行高效的坐标转换?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值