Halcon相机标定
1,前言。
相机的成像过程实质上是坐标系的转换。首先空间中的点由“世界坐标系”转换到“相机坐标系”,然后再将其投影到成像平面(图像物理坐标系),最后再将成像的平面上的数据转换为图像像素坐标系。但是由于透镜的制造精度以及组装工艺的偏差会出现不同的畸变,导致图像失真。
镜头畸变分为径向畸变和切向畸变。径向畸变是由镜头形状缺陷造成,它又分为枕形畸变和桶形畸变。
对于一般低精度的场合,只考虑径向畸变即可,因为切向畸变的影响远小于径向畸变。因此如果要进行图像畸变矫正就需要通过标定获取相机的参数。同时为了将图像的坐标系中的像素坐标系与世界坐标系中的坐标距离对应起来,就需要了解相机的外部参数信息,换算其在世界坐标系中的实际距离。相机标定就是获取相机内部参数和外部参数的过程。
2,相机标定的方法。
传统标定法:标定精度较高,但在非线性相机模型下计算十分复杂,标定速度较低,通常用于精度要求较高的线性系统。
自标定法:不需要借助参考物,操作简单且计算速度较快,但其标度精度及鲁棒性较低,只适用于速度要求较高精度较低的系统。
张正友标定:介于前面两种标定法之间,具有操作简单,标定精度高,鲁棒性好的优点,较为广泛使用。
3,内部参数和外部参数。
内部参数:相机的焦距、畸变系数、像素间距、中心点坐标、图像的宽和高等。这些参数虽然可以从制造商提供的说明书中查询,单其精度性不一定满足要求,因此只能作为参考,在实际中还需要对其进行标定,通过标定可以对这些参数进行修正。不同的相机,其内部参数也不相同,这取决于相机和镜头的类型,以及选择的畸变类型。
外部参数:相机的外部参数描述相机坐标系与世界坐标系的关系,即相机在世界坐标系中的三位位置,如相机的X轴坐标,Y轴坐标,Z轴坐标,以及相机的朝向。
4,相机的畸变。
径向畸变:矢量端点沿长度方向的变化,即矢量长度的变化。
切向畸变:矢量端点沿切线方向发生的变化,即矢量角度的变化。
5,Halcon标定。
1,准备标定板。
用halcon代码生成用于打印标定板的描述文件及标定板图像的ps文件。
*生成标定板文件gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
生成的.descr与caltab.ps文件。
备注:
caltab.descr:对标记点的半径,坐标,行,列进行描述的文件。
有.cpd与.descr两种扩展 名的标定板描述文件:
.cpd描述文件:使用create_caltab函数生成,这种格式适用于六边形排列的标定板,通常在深色背景上有浅色的标记。
.descr文件:使用gen_caltab函数生成,用于矩形排列的标定板,通常用于浅色背景下深色标记。
Halcon已提供的.cpd与.descr文件位于:D:\Program Files\MVTec\HALCON-12.0\calib目录下。
caltab.descr文件详情如下:
# Plate Description Version 2
# HALCON Version 12.0 -- Sun Dec 29 11:09:19 2024
# Description of the standard calibration plate
# used for the camera calibration in HALCON
# (generated by gen_caltab)
#
## 7 rows x 7 columns
# Width, height of calibration plate [meter]: 0.1, 0.1
# Distance between mark centers [meter]: 0.0125# Number of marks in y-dimension (rows)
r 7# Number of marks in x-dimension (columns)
c 7# offset of coordinate system in z-dimension [meter] (optional):
z 0# Rectangular border (rim and black frame) of calibration plate
# rim of the calibration plate (min x, max y, max x, min y) [meter]:
o -0.05125 0.05125 0.05125 -0.05125
# outer border of the black frame (min x, max y, max x, min y) [meter]:
i -0.05 0.05 0.05 -0.05
# triangular corner mark given by two corner points (x,y, x,y) [meter]
# (optional):
t -0.05 -0.0375 -0.0375 -0.05# width of the black frame [meter]:
w 0.003125# calibration marks: x y radius [meter]# calibration marks at y = -0.0375 m
-0.0375 -0.0375 0.003125
-0.025 -0.0375 0.003125
-0.0125 -0.0375 0.003125
0 -0.0375 0.003125
0.0125 -0.0375 0.003125
0.025 -0.0375 0.003125
0.0375 -0.0375 0.003125# calibration marks at y = -0.025 m
-0.0375 -0.025 0.003125
-0.025 -0.025 0.003125
-0.0125 -0.025 0.003125
0 -0.025 0.003125
0.0125 -0.025 0.003125
0.025 -0.025 0.003125
0.0375 -0.025 0.003125# calibration marks at y = -0.0125 m
-0.0375 -0.0125 0.003125
-0.025 -0.0125 0.003125
-0.0125 -0.0125 0.003125
0 -0.0125 0.003125
0.0125 -0.0125 0.003125
0.025 -0.0125 0.003125
0.0375 -0.0125 0.003125# calibration marks at y = 0 m
-0.0375 0 0.003125
-0.025 0 0.003125
-0.0125 0 0.003125
0 0 0.003125
0.0125 0 0.003125
0.025 0 0.003125
0.0375 0 0.003125# calibration marks at y = 0.0125 m
-0.0375 0.0125 0.003125
-0.025 0.0125 0.003125
-0.0125 0.0125 0.003125
0 0.0125 0.003125
0.0125 0.0125 0.003125
0.025 0.0125 0.003125
0.0375 0.0125 0.003125# calibration marks at y = 0.025 m
-0.0375 0.025 0.003125
-0.025 0.025 0.003125
-0.0125 0.025 0.003125
0 0.025 0.003125
0.0125 0.025 0.003125
0.025 0.025 0.003125
0.0375 0.025 0.003125# calibration marks at y = 0.0375 m
-0.0375 0.0375 0.003125
-0.025 0.0375 0.003125
-0.0125 0.0375 0.003125
0 0.0375 0.003125
0.0125 0.0375 0.003125
0.025 0.0375 0.003125
0.0375 0.0375 0.003125
caltab.ps:可直接用于打印的标定板图像文件。
打印出的标定板如下:
2,内部参数与外部参数获取
1,使用Halcon算子获取
相机内部参数标定算子所在位置:
算子如下:
*生成标定板文件*gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
ImgPath := '3d_machine_vision/calib/'
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
OpSystem := environment('OS')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*
* Calibrate the camera.
* StartCamPar := [Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight]
*Focus:相机的焦距,如果是远心相机,则焦距为0
*Kappa:畸变系数,初始值可以设置为0
*Sx、Sy:单个像元的宽,高(可从相机说明书中获取)
*Cx、Cy:图像的原点坐标,初始值可认为是图像的中心点,即坐标分为为图像的宽度和高度的一半
*ImageWidth,ImageHeight:采集图像的宽和高
StartCamPar := [0.016,0,0.0000074,0.0000074,326,247,652,494]
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置为面阵模式
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*设置标定描述文件
set_calib_data_calib_object (CalibDataID, 0, 'caltab.descr')
NumImages := 10
* Note, we do not use the image from which the pose of the measurement plane can be derived
for I := 1 to NumImages by 1read_image (Image, ImgPath + 'calib_' + I$'02d')dev_display (Image)find_calib_object (Image, CalibDataID, 0, 0, I, [], [])get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)dev_set_color ('green')dev_display (Caltab)
endfor
*标定相机内参
calibrate_cameras (CalibDataID, Error)
*获取标定后的相机内部参数
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
* 将相机内部参数写入到文件
write_cam_par (CamParam, 'camera_parameters.dat')
Message := 'Interior camera parameters have'
Message[1] := 'been written to file'
disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
clear_calib_data (CalibDataID)
相机外部参数标定算子所在位置:
算子如下:
* Attention:
* This program reads the internal camera parameters from the file
* 'camera_parameters.dat', which, e.g., could be generated by the program
* 'camera_calibration_internal.hdev'
*
ImgPath := '3d_machine_vision/calib/'
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 从文件中读取内部参数
tryread_cam_par ('camera_parameters.dat', CamParam)
catch (Exception)* run 'camera_calibration_internal.hdev' first to generate camera* parameter file 'camera_parameters.dat'stop ()
endtry
*
* Determine the external camera parameters and world coodinates from image points
*
* The external camera parameters can be determined from an image, where the
* calibration plate is positioned directly on the measurement plane
read_image (Image, ImgPath + 'calib_11')
dev_display (Image)
*标定描述文件
CaltabName := 'caltab.descr'
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* Here, the final camera parameters are already known and can be used instead
* of the starting values used in the program 'camera_calibration_internal.hdev'
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', CamParam)
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
find_calib_object (Image, CalibDataID, 0, 0, 1, [], [])
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, 1)
*获取粗略估计的姿态(外部参数)
get_calib_data_observ_points (CalibDataID, 0, 0, 1, RCoord, CCoord, Index, PoseForCalibrationPlate)
dev_set_color ('green')
dev_display (Caltab)
dev_set_color ('red')
disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1)
dev_set_line_width (3)
disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))
* caltab_points (CaltabName, X, Y, Z)
* calibrate_cameras (CalibDataID, Error)
* To take the thickness of the calibration plate into account, the z-value
* of the origin given by the camera pose has to be translated by the
* thickness of the calibration plate.
* Deactivate the following line if you do not want to add the correction.
*设置标定板的厚度,如果没有则省略
set_origin_pose (PoseForCalibrationPlate, 0, 0, 0.00075, PoseForCalibrationPlate)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Alternatively, the external camera parameters can be determined from
* at least three point correspondances between the WCS and the pixel coordinate system
read_image (Image, ImgPath + 'caliper_01')
dev_display (Image)
* Set the world coordinates of three points on the rule
*在尺上选择点设置世界坐标
X := [0,50,100,80]
Y := [5,0,5,0]
Z := [0,0,0,0]
* Set the respective image plane coordinates of the three points
*设置选择点在图像上对应的像素坐标
RCoord := [414,227,85,128]
CCoord := [119,318,550,448]
*
disp_cross (WindowHandle, RCoord, CCoord, 6, 0)
* create_pose (-50, 25, 400, 0, 0, -30, 'Rp+T', 'gba', 'point', InitialPose)
*生成外部参数(姿态参数)
vector_to_pose (X, Y, Z, RCoord, CCoord, CamParam, 'iterative', 'error', FinalPose, Errors)
*将外部参数写入到文件
write_pose (FinalPose, 'pose_from_three_points.dat')* Now, transform a point measured interactively into the WCS
dev_update_window ('on')
dev_display (Image)
while (1)disp_message (WindowHandle, 'Measure one point: left mouse button', 'window', 12, 12, 'red', 'false')disp_message (WindowHandle, 'Exit measure mode: right mouse button', 'window', 36, 12, 'red', 'false')get_mbutton (WindowHandle, Row, Column, Button)if (Button == 4)breakendifdev_display (Image)dev_set_color ('green')disp_cross (WindowHandle, Row, Column, 6, 0)image_points_to_world_plane (CamParam, FinalPose, Row, Column, 1, X1, Y1)disp_message (WindowHandle, 'X = ' + X1, 'window', 320, 400, 'red', 'false')disp_message (WindowHandle, 'Y = ' + Y1, 'window', 340, 400, 'red', 'false')
endwhile
2,使用助手获取相机内部参数与外部参数。
选择标定助手
设置参数
选择拍摄的各个角度标定板图像
不同角度的标定板图像
查看标定结果
6,应用。
* gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
dev_close_window ()
read_image (Image, '3d_machine_vision/calib/calib_10')
get_image_size(Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
*测量两个点之间的世界距离
*因为标定板相邻的两个圆远心之间的距离是12.5mm,所以用这个进行测试
*读取相机内参
read_cam_par ('camera_parameters.dat', CameraParam)
*读取相机的外参
read_pose ('pose_from_three_points.dat', Pose)
*获取两个相邻圆的圆形图像距离
threshold (Image, Region, 0, 100)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','row','column'], 'and', [0,305.96,360.09], [131651,345.41,500])
*获取该两点的相机坐标
gen_contour_region_xld (SelectedRegions, Contours, 'border')
dev_set_color ('green')
dev_set_line_width (2)dev_display (Image)
dev_display (Contours)
*获取两个选定区域的坐标
area_center (SelectedRegions, Area, Row, Column)*映射成世界坐标
image_points_to_world_plane (CameraParam, Pose, Row, Column, 'mm', X, Y)
*计算两点之间的距离
distance_pp (X[1], Y[1], X[0], Y[0], Distance)
dev_set_color ('red')
disp_line (WindowHandle, Row[0], Column[0], Row[1], Column[1])
disp_message (WindowHandle,'Distance:'+ Distance$'.2f'+'mm', 'window', 20, 20, 'green', 'false')
7,代码文件资源链接。
https://download.csdn.net/download/lingxiao16888/90384839
相关文章:

Halcon相机标定
1,前言。 相机的成像过程实质上是坐标系的转换。首先空间中的点由“世界坐标系”转换到“相机坐标系”,然后再将其投影到成像平面(图像物理坐标系),最后再将成像的平面上的数据转换为图像像素坐标系。但是由于透镜的制…...

部门管理(体验,最原始方法来做,Django+mysql)
本人初学,写完代码在此记录和复盘 在创建和注册完APP之后(我的命名是employees),编写models.py文件创建表 手动插入了几条数据 1.部门查询 urls.py和views.py在编写之前,都要注意导入对应的库 urls.py:…...
clickhouse集群搭建
Clickhouse集群搭建 文章目录 Clickhouse集群搭建安装包下载clickhouse单机安装默认安装默认数据库目录更改默认数据目录 2分片-1副本-3节点集群搭建1. 配置hosts2. 修改每个主机的主机名3. 配置文件上传配置文件分布chnode1配置文件chnode2配置文件chnode3配置文件 4. 重启cli…...

250214-java类集框架
单列集合是list和set,list的实现类有ArrayList和LinkedList,前者是数组实现,后者是链表实现。list和set,前者有序、可重复,后者无序不可重复。 1.单列集合 1.1. list java.util.List接口继承自Collection接口&#…...

二叉树(C语言版)
文章目录 二叉树完全二叉树和满二叉树二叉搜索树基本操作实现代码运行结果 分析红黑树2-3-4树(理论模型)红黑树(实际实现) 二叉树 树是一种层次结构,它在现实生活中是广泛存在的,比如:族谱(family tree),组织机构,目录…...

ASP.NET Core 面试宝典【刷题系列】
文章目录 引言1、什么是 dot net core 的 startup class?2、什么是中间件?3、application builder 的 use 和 run 方法有什么区别?4、dot net core 管道里面的map拓展有什么作用?5、dot net core 里面的路径是如何处理的?6、如何在 dot net core 中激活 session 功能?7、…...

案例-02.部门管理-查询
一.查询部门-需求 二.查询部门-思路 API接口文档 三.代码实现 1.controller层:负责与前端进行交互,接收前端所发来的请求 注:Slf4j用于记录日志使用,可以省略private static Logger log LoggerFactory.getLogger(DeptControlle…...
src和href区别
src和href区别 (1)请求资源类型不同(2)作用结果不同(3)解析方式不同 (1)请求资源类型不同 href 用来建立文档和元素之间的链接(是引用),常用的有a、linksrc 在请求src资源时候会将指向的资源下载并且应用到文档中(引入),常用的有script、iframe、image。 (2)作用结果不同 hr…...
Java每日精进·45天挑战·Day19
第一部分:移除数字以形成最小数的贪心算法实现 在编程的世界里,我们经常遇到需要对字符串表示的数字进行操作的问题。今天,我们要深入探讨一个具体的挑战:给定一个以字符串形式表示的非负整数 num 和一个整数 k,我们的…...
区块链的交易管理和共识机制
区块链的交易管理和共识机制是其核心功能,以下为你详细介绍它们的实现方式: 交易管理的实现 交易发起 • 用户使用钱包软件创建一笔交易,该交易包含发送方地址、接收方地址、转账金额等关键信息。同时,发送方会使用自己的私钥对…...

最新国内 ChatGPT Plus/Pro 获取教程
最后更新版本:20250202 教程介绍: 本文将详细介绍如何快速获取一张虚拟信用卡,并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号!一张虚拟信用卡…...

Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer
文章目录 1. 动态规划2. 采样3. 代价函数3.1 障碍物代价3.2 距离终点代价3.3 速度代价3.4 加速度代价3.5 jerk代价 4. 回溯 这一章将来讲解速度决策算法,也就是SPEED_HEURISTIC_OPTIMIZER task里面的内容。Apollo 9.0使用动态规划算法进行速度决策,从类名…...
Apache Iceberg 与 Apache Hudi:数据湖领域的双雄对决
在数据存储和处理不断发展的领域中,数据湖仓的概念已经崭露头角,成为了一种变革性的力量。数据湖仓结合了数据仓库和数据湖的最佳元素,提供了一个统一的平台,支持数据科学、商业智能、人工智能/机器学习以及临时报告等多种关键功能…...
【LeetCode Hot100 普通数组】最大子数组和、合并区间、旋转数组、除自身以外数组的乘积、缺失的第一个正整数
普通数组 1. 最大子数组和(Maximum Subarray)解题思路动态规划的优化解法(Kadane 算法)核心思想 代码解析 2. 合并区间(Merge Intervals)解题思路代码实现 3. 旋转数组(Rotate Array)…...

共享存储-一步一步部署ceph分布式文件系统
一、Ceph 简介 Ceph 是一个开源的分布式文件系统。因为它还支持块存储、对象存储,所以很自 然的被用做云计算框架 openstack 或 cloudstack 整个存储后端。当然也可以单独作 为存储,例如部署一套集群作为对象存储、SAN 存储、NAS 存储等。 二、ceph 支…...
19.Python实战:实现对博客文章的点赞系统
Flask博客点赞系统 一个基于Flask的简单博客系统,具有文章展示和点赞功能。系统使用MySQL存储数据,支持文章展示、点赞/取消点赞等功能。 功能特点 文章列表展示文章详情查看(模态框展示)点赞/取消点赞功能(每个IP只…...
【stm32】定时器输出PWM波形(hal库)
一. PWM基本原理 PWM是一种通过调节信号的占空比(Duty Cycle)来控制输出平均电压的技术。占空比是指高电平时间与整个周期时间的比值。例如: - 占空比为50%时,输出平均电压为电源电压的一半。 - 占空比为100%时,输出始…...

当Ollama遇上划词翻译:我的Windows本地AI服务搭建日记
🚀 实现Windows本地大模型翻译服务 - 基于OllamaFlask的划词翻译实践 🛠️ 步骤概要1️⃣ python 环境准备2️⃣ Ollama 安装3️⃣ 一个 Flask 服务4️⃣ Windows 服务化封装5️⃣ 测试本地接口6️⃣ 配置划词翻译自定义翻译源7️⃣ 效果展示8️⃣ debug…...
Linux上Elasticsearch 集群部署指南
Es 集群部署 Es 集群部署 Es 集群部署 准备好三台服务器。示例使用:110.0.5.141/142/143 1、es用户和用户组创建,使用root账号 groupadd esuseradd -g es es2、将es安装包和ik分词器上传到:/home/es/目录下(任意目录都行&#…...

字节Trae使用感想(后端)
前言 昨天分享了字节哥的Trae从0到1创作模式构建一个vue前端项目,今天又来试试她的后端项目能力。不是我舔,不得不说确实不错。可惜现在曾经没有好好学习,进不了字节。既然进不了字节,那我就用字节哥的产品吧。 后面有惊喜…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...