视觉机械臂自主抓取全流程

目录

简介

相机标定

手眼标定

Eye-In-Hand

Eye-To-Hand

求解(Eye-In-Hand)

求解AX=XB

手眼标定步骤

读取出摄像头信息并确定目标物体的位姿

图像分割

三维对象实例分割

姿态估计

机械臂正逆运动学求解

运动学正解

运动学逆解

总结

简介

视觉机械手是智能机器人的一个重要分支,主要包括控制芯片、驱动电路、机械手、摄像机等。自主抓取是指视觉机械手系统在没有人工干预的情况下,通过摄像头获取目标物体的位置,并通过驱动机械手来完成抓取目标物体的任务。

[En]

Visual manipulator is an important branch of intelligent robot, which mainly includes control chip, drive circuit, manipulator, camera and so on. Autonomous grasping means that without human intervention, the visual manipulator system acquires the position of the target object through the camera, and completes the task of grasping the target object by driving the manipulator.

视觉机械臂自主抓取全流程

整个捕捉过程大致分为以下步骤(包括图中的九个步骤):摄像机标定–摄像机和机械臂手眼标定–摄像机1读取摄像机信息–摄像机2识别目标对象,并获得位置和姿态–摄像机中对象的二维坐标被转换为相对于摄像机光中心的三维坐标–然后转换为相对于机械手基座的世界坐标。抓取物体时,计算机械手末端执行器的位置和姿态–根据已知的目标位置和末端执行器的位置和姿态信息,计算机械手上的每个电机应该旋转的角度。路径距离要求,时间要求规划出合适的路径–“8驱动机械手的每个关节一步一步到达合适的位置”–“9个末端执行器抓取物体–”把它放到指定的位置。

[En]

The whole capture process is roughly divided into the following steps (including the nine steps in the picture): camera calibration– camera and robotic arm hand-eye calibration– camera 1 reads camera information– camera 2 identifies the target object and obtains the position and pose– the two-dimensional coordinates of the object in the camera are converted into three-dimensional coordinates relative to the light center of the camera– and then into the world coordinates relative to the base of the manipulator. Calculate the position and pose of the end effector of the manipulator when grasping the object– calculate the angle that each motor on the manipulator should rotate according to the known target position and the position and attitude information of the end effector. Path distance requirements, time requirements to plan a suitable path– “8 drives each joint of the manipulator to reach the appropriate position step by step–” 9 end-effector grabs the object– “put it into the specified position.

下面,我将按照上述步骤对视觉机械手自主抓取的全过程进行更详细的介绍。

[En]

Below, I will make a more detailed introduction to the whole process of autonomous grasping of the visual manipulator according to the above steps.

相机标定

什么是摄像机校准?你为什么要校准相机?由于相机采用小孔成像的原理进行图像采集,为了使物体图像更清晰,所以采用了镜头的方式。然而,由于镜头本身在成像过程中不可避免地会引入径向和切向失真(例如,成像后直线会显示为圆弧)。为了使真实的图像真实地呈现在画面中,有利于机械手的捕捉,需要对摄像机的失真进行校正。一般情况下,只要对成像精度较高的场景进行标定,如三维结构光成像、人脸识别、视觉测量等。

[En]

What is camera calibration? Why do you calibrate the camera? Because the camera uses the principle of keyhole imaging to collect images, in order to make the object image more clearly, it uses the way of lens. However, because the lens itself will inevitably introduce radial and tangential distortion in the imaging process (for example, a straight line will be displayed as an arc after imaging). In order to make the real image truly present in the picture, which is beneficial to the capture of the manipulator, it is necessary to correct the distortion of the camera. In general, as long as the scene with high imaging accuracy needs to be calibrated, such as three-dimensional structured light imaging, face recognition, visual measurement and so on.

现在对于相机标定最常用的方法是张正友相机标定法,这种方法是利用棋盘格标定板每个角点像素坐标的相对关系以及在已知真实坐标相对关系的条件下计算出来的。在OpenCv当中已经有了对应的库,在使用前只需设置一下每个格子的大小以及格子的行列数(减去一)即可进行标定。相机标定的合格指标一共有四个,分别是x轴方向、y轴方向、远近以及旋转角度。

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程

捕捉到多张有效图片之后,进度条会变成绿色,点击CALIBRATE可直接计算出关系矩阵。以下就是我采用奥比中光Astro Pro设备得到的标定结果。

视觉机械臂自主抓取全流程

我们使用逆向计算的方法,通过物体的像素坐标来获取图片的真实空间位置(世界坐标),下图的推送过程涉及以下四个坐标系:

[En]

We use the reverse calculation method to obtain the real spatial position (world coordinates) of the image through the pixel coordinates of the object, and the following four coordinate systems will be involved in the push process of the following image:

OW-XWYWZW:世界坐标系,描述相机位置,单位m

Oc-XcYcZc:相机坐标系,光心为原点,单位m

xy:图像坐标系,光心为图像中点,单位mm

uv:像素坐标系,原点为图像左上角,单位pixel

P:世界坐标系中的一点,现实空间中的点

p:点P在图像中的成像点,在图像坐标系中的坐标为(x,y),在像素坐标系中的坐标为(u,v)

f:相机焦距,等于o与Oc的距离,f=||o-Oc||

视觉机械臂自主抓取全流程

世界坐标系是为了更好的描述相机的空间位置,原点(OW)的选择在双目深度相机当中一般会是其中一个相机的中心或者两个相机的中点。在视觉机械臂的标定中,原点(OW)一般被确定为机械臂底座的中心。

世界坐标和相机坐标的变换过程属于刚体变换:即物体不会发生形变,只是进行了平移和旋转的变换。其中R表示旋转矩阵,T表示偏移向量(R、T被称为外参)。围绕着不同的坐标轴,旋转不同的角度都是有对应矩阵的,如下图所示:

视觉机械臂自主抓取全流程

从相机坐标系到图像坐标系的变换,是从3D向2D的转换,主要思想就是相似三角形原理,对应原理图如下:

视觉机械臂自主抓取全流程

图中P点就是现实世界的坐标,p点就是在相机中的成像坐标,f就是透镜的焦距。

图像坐标与像素坐标的转换关系如下:

视觉机械臂自主抓取全流程

图像坐标系的原点是相机光轴和成像平面的交点,单位是mm,属于物理单位。像素坐标系的原点是成像平面的左上角,单位是pixel。

将以上这几个公式进行整理,结果如下:

视觉机械臂自主抓取全流程

摄像机的内部和外部参数已在图中标出。因为有许多未知数,所以需要多组数据来解决问题。

[En]

The internal and external parameters of the camera have been marked in the figure. Because there are many unknowns, multiple sets of data are needed to solve the problem.

手眼标定

首先,什么是手眼校准?为什么要进行手眼校准?由于物体和摄像头之间的相对位置关系不同于物体和机械臂之间的相对位置关系,所以在摄像头确定物体的位置后,需要将其相对于机械臂的位置进行转换,以便机械臂能够抓取。这种位置转换需要一个矩阵,该矩阵由手和眼睛校准。

[En]

First of all, what is hand-eye calibration? Why hand-eye calibration? Because the relative position relationship between an object and the camera is different from that between the object and the robotic arm, after the camera determines the position of the object, it is necessary to convert the position relative to the robotic arm so that the robotic arm can grasp. This position transformation requires a matrix, which is calibrated by the hand and eye.

手眼标定的核心公式只有一个,AX=XB,这里的X就是指手(机械臂末端)与眼(摄像头)之间的坐标转换关系。视觉机械臂的相机和机械臂有两种结合方式,一种是眼在手上(Eye-In-Hand),一种是眼在手外(Eye-To-Hand),所以手眼标定也分两种。

Eye-In-Hand(摄像头被安装在机械臂上):

这种方式的手眼标定是通过两次运动解得相机坐标系(Camera)与机械臂末端坐标系(End)之间的坐标关系。

注意:

1、机械臂末端(End)在机器人(Base)坐标系下的坐标是可以通过机械臂各个关节的角度值直接解算出来的。

2、摄像头与机械臂末端之间的坐标转换关系不变,也就是说,TE→C始终不变;标定板与机械臂底座之间的坐标转换关系不变,也就是说,TB→O也是不变的。

视觉机械臂自主抓取全流程

把TB→O按照前后两次运动展开,有:

TB→E1TE1→C1TC1→O=TB→E2TE2→C2TC2→O

(TB→E2)-1TB→E1TE1→C1TC1→O=TE2→C2TC2→O

(TB→E2)-1TB→E1TE1→C1=TE2→C2TC2→O(TC1→O)-1

TE2→E1TE1→C1=TE2→C2TC2→C1

A = TE2→E1 = (TB→E2)-1TB→E1

B = TC2→C1 = TC2→O(TC1→O)-1

X = TE→C = TE1→C1 = TE2→C2

就得到了

AX = XB

Eye-To-Hand(摄像头被安装在一个固定不动的位置,而标定板被拿在机械臂手上):

这种方法的手眼标定是通过两次运动解得相机坐标系(Camera)与机器人坐标系(Base)之间的坐标关系。

注意:
1、机械臂末端(End)在机器人(Base)坐标系下的坐标是可以通过机械臂各个关节的角度值直接解算出来的。

2、摄像头与机械臂底座之间的坐标转换关系不变,也就是说,TB→C始终不变;标定板与机械臂末端之间的坐标转换关系不变,也就是说,TE→O始终不变。

视觉机械臂自主抓取全流程

把TB→O按照前后两次运动展开,有:

TE1→BTB→CTC→O1=TE2→BTB→CTC→O2

(TE2→B)-1TE1→BTB→CTC→O1=TB→CTC→O2

(TE2→B)-1TE1→BTB→C=TB→CTC→O2(TC→O1)-1

A = (TE2→B)-1TE1→B

B = TC→O2(TC→O1)-1

X = TB→C

就得到了

AX = XB

实际上,求解的只是一个固定的6自由度的位置姿态关系,可以用3X3的旋转矩阵和3X1的平移矩阵表示,也可以用其他方法表示如用四元数表示角度关系等。

求解( Eye-In-Hand

坐标系之间的转换关系说明:

baseHend:表示机械手坐标系到基础坐标系的转换关系,可以由机器人系统中得出。(已知)

endHcam:表示相机坐标系到机械手坐标系的转换关系;这个转化关系在机械手移动过程中是不变的;(未知,待求)

objHcam:表示相机坐标系到标定板坐标系的转换关系(相机外參),可以由相机标定求出;(相当于已知)

baseHobj:表示标定板坐标系到基础坐标系的变换,这个是最终想要得到的结果;只要机械手和标定板的相对位置不变,这个变换矩阵不发生变化。

基础坐标系(求解baseHend)

符合右手定则的XYZ三个坐标轴:

原点:机器人底座的中心点

X轴正向:指向机器人的正前方

Z轴正向:指向机器人的正上方

Y轴正向:由右手定则确定

六个自由度

三个位置:x、y、z(第六轴法兰盘圆心相对于原点的偏移量)

三个角:Rx、Ry、Rz(第六轴法兰盘的轴线角度,由初始姿态即竖直向上绕x轴旋转Rx度,再绕Y轴旋转Ry度,再绕Z轴旋转Rz度得到)

旋转方式

绕定轴X-Y-Z旋转(判断机械臂输出四元数与代码得到的四元数是否相等得到)

旋转矩阵的计算方法如下:R = R z ∗R y ∗R x

(opencv的旋转方式是 z y x,所以旋转矩阵R=RxRyRz)

视觉机械臂自主抓取全流程

R=Rx∗Ry∗Rz=X1Y1Z3

视觉机械臂自主抓取全流程

其中c为cos,s为sin。

所以:

视觉机械臂自主抓取全流程

其中t=[x,y,z]^T,从示教器读取Rx、Ry、Rz分别是绕x、y、z轴的旋转角度。

欧拉角:分别绕x、y、z轴旋转的角度,不一样的旋转次序,得到的R不一样;

李代数:维度是3,是绕一个轴转动一定的角度。欧拉角可以理解成李代数在x、y、z轴上的分解旋转。

camHobj相机到标定板

思路大致如下:

已知双目相机的内参、畸变系数、外参(Pr=R∗Pl+t),

对左右相机的两张图片调用OpenCV中的findChessboardCorners函数,找到内角点(如果结果不好,继续提取亚像素点);

将左右相机的像素点对应起来,得到匹配的2d点;

使用空间异面直线的方法,用对应的2d点计算出以右相机为世界坐标系的3维坐标Pcam;计算出每个角点以棋盘格为世界坐标的3维坐标Pcal;

通过解方程Pcam=camHcal*Pcal求解出外参;

这个部分可以用张正友相机标定Opencv实现

求解AX=XB

李代数到李群的转换满足指数映射关系,假设[w]∈so(3),而exp[w]∈SO(3),则其指数映射满足罗德里格斯公式:

视觉机械臂自主抓取全流程

其中∣∣ω∣∣^2=ω12+ω22+ω32

利用李群知识求解AX=XB

视觉机械臂自主抓取全流程

展开得到:

θA∗θX=θX∗θB,θA∗bX+bA=θX∗bB+bX​

采用”两步法”求解上述方程,先解算旋转矩阵,再求得平移向量。

求解旋转矩阵

假设AX=XB,这里的都是旋转矩阵(SO(3)),并非变换矩阵(SE(3))。

变换可得到:A =XBX^T

两边取对数:log(A)=log(XBX^T)(对数映射)

令logA=[α],logB=[β],则上式可以化为[α]=X[β]X^T=[Xβ]从而α=Xβ

当有多组观测值时,求解方程可转化为以下最小二乘拟合问题:

[En]

When there are multiple sets of observations, solving the equation can be transformed into the following least square fitting problem:

视觉机械臂自主抓取全流程

显然,上述问题是一个典型的绝对定向问题,因此上述公式的解与绝对定向相同,其解为

[En]

Obviously, the above problem is a typical absolute orientation problem, so the solution of the above formula is the same as the absolute orientation, and its solution is

视觉机械臂自主抓取全流程

其中,

视觉机械臂自主抓取全流程

当只有两组A、B时,即有A1,A2,B1,B2

α1=logA1,α2=logA2,β1=logB1,β2=logB2,θX=MN^−1

其中,M=(α1 α2 α1×α2),N=(β1 β2 β1×β2)(×表示叉乘)

即可求得旋转矩阵。

求解平移向量

θA∗bX+bA=θX∗bB+bX 移项化简得到:(I−θA)∗bX=bA−(θX∗bB)计作:c*X=d

又c不一定是可逆,所以两边同时乘以c^T。即为:c^T∗c∗X=c^T∗d

所以:X=(c^T∗c)^−1∗(c^T∗d)

当有多组数据时:(c1^T∗c1+c2^T∗c2+…+cn^T∗cn)∗X=c1^T∗d1+c2^T∗d2+…+cn^T∗dn

即可求得X,即平移向量

手眼标定步骤

  1. 事先准备:机械臂可以按照正常的位姿移动,并且能够正常的输出机械臂末端姿态;机械臂能够稳定搭载相机;相机能够正确稳定地检测到物体,并且能够正确输出位置参数。
  2. 通过机械臂上面的相机,对待测物体进行位姿检测,并且输出参数。
  3. 输出机械臂末端的位置参数。
  4. 重复2、3步骤,采集十组以上有效参数。
  5. 将采集的有效参数放入代码中进行计算。
  6. 输出手眼转换矩阵。

代码:见https://blog.csdn.net/hellohake/article/details/104808149

读取出摄像头信息并确定目标物体的位姿

前两步完成之后就要通过摄像头读取信息了,这个步骤不难,比较难的是确定目标物体的姿态。它首先要进行图像分割(实例分割、语义分割、部件分割),把图像中的每个个体单独分出来。然后进行物体识别,来确定哪个物体才是目标物体。之后是确定物体的姿态,比如一个瓶子,它是立着的,还是倒着的,是横着的,还是竖着的。最后确定抓取的位置,是抓取瓶子的盖子下面,还是抓取瓶子的中间部分,还是底部。此处的图像还分为二维的灰度图、RGB图,三维的点云图、三角面片、Volumetric、Multi-View等。

图像分割

图像分割是计算机视觉研究中的经典问题,也是图像理解领域的研究热点。图像分割是图像分析的第一步,是计算机视觉的基础,也是图像理解的重要组成部分。同时,它也是图像处理中最难解决的问题之一。所谓图像分割,是指根据图像的灰度、颜色、空间纹理、几何形状等特征,将图像分割成几个互不相交的区域,使这些特征在同一区域内表现出一致性或相似性。不同地区之间存在着明显的差异。简单地说,在图像中,目标与背景是分开的。对于灰度图像,区域内的像素通常具有灰度相似性,而区域的边界通常具有灰度不连续性。图像分割的方法主要分为以下几类:基于阈值的分割、基于区域的分割、基于边缘的分割和基于特定理论的分割。下图是基于边缘分割的方法,立方体和香蕉的分割效果很好,罐头的分割效果次之。

[En]

Image segmentation is a classical problem in the research of computer vision, and it has become a hot spot in the field of image understanding. image segmentation is the first step of image analysis, the foundation of computer vision and an important part of image understanding. at the same time, it is also one of the most difficult problems in image processing. The so-called image segmentation means that the image is divided into several disjoint regions according to the features such as grayscale, color, spatial texture and geometric shape, so that these features show consistency or similarity in the same region. and there are obvious differences between different regions. To put it simply, in an image, the target is separated from the background. For grayscale images, the pixels within the region generally have grayscale similarity, while the boundaries of the region generally have grayscale discontinuity. The methods of image segmentation are mainly divided into the following categories: threshold-based segmentation, region-based segmentation, edge-based segmentation and specific theory-based segmentation. The following picture is based on the edge segmentation method, cube and banana segmentation effect is very good, cans segmentation effect is second.

​​​​

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程

三维对象实例分割

3D对象实例分割是指从输入的3D点云中检测出特定类别的点集实例对象。与二维对象实例的分割类似,两阶段方法需要区域建议,而单阶段方法需要免费建议。3D对象实例分割的典型函数图如图所示。

[En]

3D object instance segmentation refers to the detection of a certain class of point set instance objects from the input 3D point cloud. Similar to the segmentation of two-dimensional object instances, the two-stage method requires regional advice, while the single-stage method requires free advice. The typical function graph of 3D object instance segmentation is shown in the figure.

视觉机械臂自主抓取全流程

三维对象实例分割在机器人抓取任务中非常重要。但目前的方法主要是利用二维实例分割方法来获得目标对象的三维点云,这利用了RGB-D图像的优势。目前,三维对象实例分割仍是一个快速发展的领域,如果其性能和速度大大提高,在未来将得到广泛的应用。

姿态估计

先简单介绍三种方法:

A.通过深度神经网络处理,来生成几个候选的抓取位置。这些候选的抓握姿态被编码到一个堆叠的多通道图中。使用一个四层卷积神经网络对每个候选抓握姿态进行评估,以获得一个分数。

B.对整个三维空间进行均匀采样生成候选抓取,利用三维CNN和候选抓取姿态的抓取可达性预测抓取稳定性,得到抓取成功概率。

C.还有一种名为6-自由度GraspNet的算法,该算法使用变分自动编码器对抓取建议进行采样,并使用抓取评估器模型对采样的抓取进行参考。

视觉机械臂自主抓取全流程

正如你在第一张图片中看到的,算法生成了很多爬行位置,然后通过评分来选择其中的一个。在第二幅图像中,使用该算法对模型进行匹配,生成最佳抓取位置。

[En]

As you can see in the first picture, the algorithm generates a lot of crawling positions, and then selects one of them by scoring. In the second image, the algorithm is used to match the model to generate the best grab position.

机械臂正逆运动学求解

首先,大致说一下什么是正逆学求解。机械臂的运动主要是靠电机的旋转来实现末端的移动,一个旋转,一个空间的位置移动。输入每个电机旋转的角度j1,j2…,jn,输出是机械臂末端执行器的位置(x,y,z)与姿态(α,β,γ),这就是机械臂运动学正解。反之,为逆解。

机械臂还有一个常用的参数叫自由度。机械臂机架上有n个电机,就是n自由度机械臂,也叫n轴机械臂,记为n DOF。(末端执行器上的不算,因为它不影响机械臂的运动学结果。)

视觉机械臂自主抓取全流程

UR5机械臂的Gazebo仿真图

运动学正解

正运动学是已知关节六个角度求变换矩阵T

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程

所以末端坐标系6到基座固定坐标系0的变换矩阵

视觉机械臂自主抓取全流程

那么求正解就很简单了,只要输入六个关节角度θi,就得到末端坐标在基坐标系的变换矩阵T。ur机械臂的视教板上末端点的坐标是用六个值[x, y, z, rx, ry, rz]表示的。前三个值[x, y, z]是三维笛卡尔坐标,表示空间位置,后三个值[rx, ry, rz]是坐标旋转向量,表示空间姿态。我们得到的变换矩阵T怎么变成六值坐标[x, y, z, rx, ry, rz]呢?设

视觉机械臂自主抓取全流程

T的左上角的3×3矩阵是旋转矩阵,旋转矩阵和旋转向量之间可以通过罗德里格斯(Rodrigues)变换进行转换。opencv里有相应的函数调用。算法也比较简单,不用opencv的函数自己写代码也不难。T的右上角3×1就是空间位置[x, y, z]。这样有变换矩阵T得到六值坐标,完成了正解。

运动学逆解

逆解相对复杂一些,根据机械臂末端的空间位置和姿态,来求解可能的关节角度。求逆解的方法有解析法,迭代法和几何法等。下面我们推导一下ur的逆解。

首先计算变换矩阵T过程中的一些中间矩阵

视觉机械臂自主抓取全流程

,其中c23=cos(θ2+θ3),s23=sin(θ2+θ3)。

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程得到视觉机械臂自主抓取全流程。计算

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程,得到视觉机械臂自主抓取全流程

等式两边矩阵的行列应该分别相等,由第三行第四列得到

视觉机械臂自主抓取全流程,可解得视觉机械臂自主抓取全流程,有两个解。这里注意写程序的时候,求解这里的反正切是用atan2()这类的函数,返回之在(-π,+π]。而反余弦的返回值在[0,π],从而保证在2π范围每个解是唯一的。

由第三行第三列得

视觉机械臂自主抓取全流程,可解得视觉机械臂自主抓取全流程,两个解。由第三行第二列得到视觉机械臂自主抓取全流程,可解得视觉机械臂自主抓取全流程。接着由

视觉机械臂自主抓取全流程,计算

视觉机械臂自主抓取全流程,得出等式左边等于

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程

视觉机械臂自主抓取全流程,两边平方,令视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程。同样由视觉机械臂自主抓取全流程,令视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程两式相加得到视觉机械臂自主抓取全流程

,则

视觉机械臂自主抓取全流程,有两个解。

把θ3带入

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程,得

视觉机械臂自主抓取全流程视觉机械臂自主抓取全流程,其中t2=tanθ2。两式消去c2,得到视觉机械臂自主抓取全流程

最后得到

视觉机械臂自主抓取全流程,从而得到θ4。综合有两个解的情况,ur机械臂逆解总共有2x2x2=8组解。

总结

视觉机械大致有11步,前文图中九步加上相机标定、手眼标定。里面有很多知识也是借鉴别人的,毕竟一个的能力有限,不可能完成这么多理论知识。自己在学习前也是找了很多资料,没有发现一篇能把视觉机械臂全流程讲详细的帖子。所以我学习并理解了全流程之后,自己整理了一篇文章,仅供大家参考。因为视觉机械臂本身涉及的内容比较多,所以我对于每一步的讲解也不是非常的透彻。如果想更详细的了解其中的某个或某些步骤,可以自行网上检索。总结不易,希望能帮到每一个热爱学习的人。只要你想成功,全世界都会为你让路!!!

Original: https://blog.csdn.net/knightsinghua/article/details/125328920
Author: knightsinghua
Title: 视觉机械臂自主抓取全流程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10577/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总