当前位置: 首页 > news >正文

【AprilTag】视觉定位实战 | 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。

🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒
若您觉得内容有价值,还请评论告知一声,以便更多人受益。
转载请注明出处,尊重原创,从我做起。

👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜
在这里,您将收获的不只是技术干货,还有思维的火花

📚 系列专栏:【机器视觉】系列,带您深入浅出,探索机器视觉技术。🖊
愿我的分享能为您带来启迪,如有不足,敬请指正,让我们共同学习,交流进步!

🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~


文章目录

  • 引言
  • 一、准备工作
    • 1.1 安装 usb_cam 驱动
    • 1.2 安装相机标定功能包
    • 1.3 准备标定板和 USB 摄像头
  • 二、相机标定
    • 2.1 启动摄像头驱动节点
    • 2.2 确定相机编号
    • 2.3 查看启动的设备是否正确
    • 2.4 运行相机标定节点
    • 2.5 移动标定板或摄像头
    • 2.6 得到标定结果
    • 2.7 保存保定数据
  • 三、对焦问题
    • 3.1 启动摄像头存在的警告
    • 3.2 对焦问题的可能原因
  • 四、运行Apriltag_ros
    • 4.1 安装 Apriltag_ros 功能包
    • 4.2 修改配置文件
    • 4.3 运行Apriltag_ros
      • (1) 启动 USB 相机驱动
      • (2) 运行 AprilTag_ros 算法
      • (3) RViz 可视化界面
      • (4) 输出定位数据
  • 五、总结
  • 参考资料


引言

  上一篇博客介绍了虚拟机 Ubuntu18.04 安装 USB 摄像头 ROS 驱动 usb_cam 的最新方法,本篇博客讲解如何使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别。


一、准备工作

1.1 安装 usb_cam 驱动

  系统环境:Ubuntu18.04

  本教程是基于 usb_cam 包读取图像,因此需要提前安装 usb_cam 驱动,参见:

  【Ubuntu】虚拟机安装USB摄像头ROS驱动 usb_cam(最新方法)

1.2 安装相机标定功能包

  安装 camera_calibration 功能包:

sudo apt-get install ros-melodic-camera-calibration

1.3 准备标定板和 USB 摄像头

  准备一个已知尺寸的标定板,本实验使用的是 6 × 9 6\times9 6×9(列X行),边长为 1.8 c m 1.8cm 1.8cm 的棋盘标定板。

  一个通过 ROS 发布图像的单目 USB 摄像头。


二、相机标定

2.1 启动摄像头驱动节点

rosrun usb_cam usb_cam_node

2.2 确定相机编号

  确定使用的video_id,使用如下命令查看:

ls /dev/video*

  一般笔记本电脑自带的摄像头 id 0 0 0,外接的摄像头 id 1 1 1。然后根据需要修改usb_cam/src/usb_cam/launch/usb_cam-test.launch里面的<param name="video_device" value="/dev/video1" />

  尝试启动摄像头。

roslaunch usb_cam usb_cam-test.launch

  但是博主这样写会报错:

… logging to /home/qingliu/.ros/log/0976c44a-7583-11ef-82de-000c293e3ad5/roslaunch-qingliu-4538.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://localhost:44077/
SUMMARY
========
PARAMETERS

  • /image_view/autosize: True
  • /rosdistro: melodic
  • /rosversion: 1.14.13
  • /usb_cam/camera_frame_id: usb_cam
  • /usb_cam/color_format: yuv422p
  • /usb_cam/image_height: 480
  • /usb_cam/image_width: 640
  • /usb_cam/io_method: mmap
  • /usb_cam/pixel_format: yuyv
  • /usb_cam/video_device: /dev/video1

NODES
/image_view (image_view/image_view)
usb_cam (usb_cam/usb_cam_node)
ROS_MASTER_URI=http://localhost:11311
process[usb_cam-1]: started with pid [4558]
process[image_view-2]: started with pid [4559]
[ INFO] [1726639123.930729617]: Initializing nodelet with 4 worker threads.
[ INFO] [1726639124.024001715]: Using transport “raw”
[ INFO] [1726639124.046743699]: using default calibration URL
[ INFO] [1726639124.047399791]: camera calibration URL: file:///home/qingliu/.ros/camera_info/head_camera.yaml
[ INFO] [1726639124.047502595]: Unable to open camera calibration file [/home/qingliu/.ros/camera_info/head_camera.yaml]
[ WARN] [1726639124.047555944]: Camera calibration file /home/qingliu/.ros/camera_info/head_camera.yaml not found.
[ INFO] [1726639124.047608139]: Starting ‘head_camera’ (/dev/video1) at 640x480 via mmap (yuyv) at 30 FPS
[ERROR] [1726639124.047678525]: VIDIOC_G_FMT error 22, Invalid argument
[usb_cam-1] process has died [pid 4558, exit code 1, cmd /home/qingliu/catkin_ws/devel/lib/usb_cam/usb_cam_node __name:=usb_cam __log:=/home/qingliu/.ros/log/0976c44a-7583-11ef-82de-000c293e3ad5/usb_cam-1.log].
log file: /home/qingliu/.ros/log/0976c44a-7583-11ef-82de-000c293e3ad5/usb_cam-1*.log

解决方法

  修改文件~/catkin_ws/src/usb_cam/launch/usb_cam-test.launch

<param name="video_device" value="/dev/video0" />

  修改为 /dev/video0

2.3 查看启动的设备是否正确

查看启动的设备是否正确,若正确则关掉再打开驱动:

rosrun usb_cam usb_cam_node

查看图像是否发布, 列出 topic 确保相机正在通过ROS发布图像:

rostopic list 

这会显示所有已发布的 topic,检查是否有 image_raw topic。以下是本实验的相机topic:

/image_view/output
/image_view/parameter_descriptions
/image_view/parameter_updates
/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates

2.4 运行相机标定节点

运行 camera_calibration 标定节点:

rosrun camera_calibration cameracalibrator.py --size 5x8 --square 0.018 image:=/usb_cam/image_raw camera:=/usb_cam  --no-service-check

此命令运行标定结点的python脚本,其中 :

  • --size 5x8 为棋盘内部角点的个数,方格几列几行(需要减 1 1 1),比如我的标定板方格是 6 × 9 6\times 9 6×9,则 size 5 × 8 5\times 8 5×8
  • --square 0.018 为每个棋盘格的边长,单位默认为米( m m m)

  注意 7 × 9 7\times 9 7×9 中间不能用“ ∗ * ”,是字母“ x x x”。

  • image:=/usb_cam/image_raw 为当前订阅的图像来自名为/usb_cam/image_raw的 topic
  • camera:=/usb_cam 为摄像机名
  • 加上--no-service-check是因为一开始运行后出现下面的错误,参考官网加上此参数后就可正常显示。

(‘Waiting for service’, ‘/camera/set_camera_info’, ‘…’)
Service not found

  此操作将打开标定窗口,如下图所示:

在这里插入图片描述

2.5 移动标定板或摄像头

为了达到良好的标定效果,需要在摄像机周围移动标定板,并完成以下基本需求:

  • 移动标定板到画面的最左、右,最上、下方
  • 移动标定板到视野的最近和最远处
  • 移动标定板使其充满整个画面
  • 保持标定板倾斜状态并使其移动到画面的最左、右,最上、下方

右侧四个参数的含义:

  • 当标定板移动到画面的最左、右方时,此时,窗口的X会达到最小或满值
  • 同理,Y指示标定板的在画面的上下位置
  • Size表示标定板在视野中的距离,也可以理解为标定板离摄像头的远近
  • Skew为标定板在视野中的倾斜位置

  每次移动之后,保持标定板不动直到窗口出现高亮提示。

  直到条形变为绿色。当 CRLIBRATE 按钮亮起时,代表已经有足够的数据进行摄像头的标定,此时按下 CRLIBRATE 并等待一分钟左右,标定界面变成灰色,无法进行操作,属于正常情况。
在这里插入图片描述

2.6 得到标定结果

*** Added sample 1, p_x = 0.612, p_y = 0.460, p_size = 0.340, skew = 0.152
*** Added sample 2, p_x = 0.556, p_y = 0.498, p_size = 0.319, skew = 0.277
*** Added sample 3, p_x = 0.373, p_y = 0.579, p_size = 0.321, skew = 0.245
*** Added sample 4, p_x = 0.363, p_y = 0.353, p_size = 0.319, skew = 0.201
*** Added sample 5, p_x = 0.471, p_y = 0.309, p_size = 0.294, skew = 0.162
*** Added sample 6, p_x = 0.603, p_y = 0.319, p_size = 0.282, skew = 0.110
*** Added sample 7, p_x = 0.663, p_y = 0.296, p_size = 0.358, skew = 0.164
*** Added sample 8, p_x = 0.671, p_y = 0.199, p_size = 0.434, skew = 0.139
*** Added sample 9, p_x = 0.674, p_y = 0.144, p_size = 0.524, skew = 0.194
*** Added sample 10, p_x = 0.683, p_y = 0.026, p_size = 0.572, skew = 0.131
*** Added sample 11, p_x = 0.623, p_y = 0.086, p_size = 0.652, skew = 0.143
*** Added sample 12, p_x = 0.586, p_y = 0.262, p_size = 0.635, skew = 0.183
*** Added sample 13, p_x = 0.531, p_y = 0.403, p_size = 0.635, skew = 0.250
*** Added sample 14, p_x = 0.485, p_y = 0.223, p_size = 0.663, skew = 0.244
*** Added sample 15, p_x = 0.560, p_y = 0.329, p_size = 0.516, skew = 0.194
*** Added sample 16, p_x = 0.570, p_y = 0.489, p_size = 0.470, skew = 0.177
*** Added sample 17, p_x = 0.515, p_y = 0.515, p_size = 0.399, skew = 0.122
*** Added sample 18, p_x = 0.494, p_y = 0.618, p_size = 0.334, skew = 0.089
*** Added sample 19, p_x = 0.491, p_y = 0.516, p_size = 0.265, skew = 0.061
*** Added sample 20, p_x = 0.459, p_y = 0.414, p_size = 0.207, skew = 0.069
**** Calibrating ****
mono pinhole calibration…
*** Added sample 63, p_x = 0.568, p_y = 0.398, p_size = 0.252, skew = 0.181
*** Added sample 64, p_x = 0.449, p_y = 0.598, p_size = 0.242, skew = 0.006
*** Added sample 65, p_x = 0.382, p_y = 0.635, p_size = 0.218, skew = 0.080
D = [0.03868745150785007, -0.029877004108823855, -0.0007851867081518497, -0.0008866834766470662, 0.0]
K = [433.18386473568006, 0.0, 341.5023734989315, 0.0, 433.4953796121861, 244.3823670617905, 0.0, 0.0, 1.0]
R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P = [438.92010498046875, 0.0, 340.88175832247, 0.0, 0.0, 439.3984375, 243.95816827518865, 0.0, 0.0, 0.0, 1.0, 0.0]
None
# oST version 5.0 parameters

[image]

width 640

height 480

[narrow_stereo]

camera matrix
433.183865 0.000000 341.502373
0.000000 433.495380 244.382367
0.000000 0.000000 1.000000

distortion
0.038687 -0.029877 -0.000785 -0.000887 0.000000

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
438.920105 0.000000 340.881758 0.000000
0.000000 439.398438 243.958168 0.000000
0.000000 0.000000 1.000000 0.000000

其中,K为相机内参矩阵

  • distortion:畸变系数矩阵
  • camera matrix:摄像头的内部参数矩阵
  • distortion:畸变系数矩阵
  • rectification:矫正矩阵,一般为单位阵
  • projection:外部世界坐标到像平面的投影矩阵

2.7 保存保定数据

  点击 SAVE 按钮。

在这里插入图片描述
  点击 COMMIT 按钮将结果保存到默认文件夹,终端输出如下信息,说明标定结果已经保存在相应文件夹下。下次启动 usb_cam 节点时,会自动调用。

(‘Wrote calibration data to’, ‘/tmp/calibrationdata.tar.gz’)

在这里插入图片描述
  其中,ost.yaml 文件即为相机内参的标定文件。

  至此,相机标定完成!


三、对焦问题

3.1 启动摄像头存在的警告

  启动摄像头存在如下警告:

[ WARN] [1726642015.933315970]: unknown control ‘focus_auto’

3.2 对焦问题的可能原因

出现这个警告可能是有以下两种原因:

  • 因为参数设置不匹配,默认像素的宽和高跟摄像头不匹配。

  • 还有可能只是所使用的相机根本没有自动对焦功能。

因此不用管这个问题。


四、运行Apriltag_ros

4.1 安装 Apriltag_ros 功能包

  Apriltag_ros 的安装非常简单,将源码放到工作空间路径下,如catkin_ws/src,然后编译即可。

cd catkin_ws/src
git clone https://github.com/AprilRobotics/apriltag_ros.git
cd ..
catkin_make

4.2 修改配置文件

  首先修改 ~/catkin_ws/src/apriltag_ros/apriltag_ros/launch/continuous_detection.launch 文件。

  apriltag_ros 需要订阅相机图像数据与相机信息,比如对于USB摄像头,在开启相机时会发布两个相关的 topic:

  • /usb_cam/camera_info
  • /usb_cam/image_raw

  因此需将 camera_namecamera_frame 的内容修改为订阅的 topic。

launch 文件内容修改如下:

<!-- 修改 --><arg name="camera_name" default="/usb_cam" /><arg name="image_topic" default="image_raw" />
<!-- 添加 --><arg name="camera_frame" default="/camera" />

完整launch文件内容如下:

<launch><!-- set to value="gdbserver localhost:10000" for remote debugging --><arg name="launch_prefix" default="" /><!-- configure camera input --><arg name="camera_name" default="/usb_cam" /><arg name="image_topic" default="image_raw" /><arg name="camera_frame" default="/camera" /><arg name="queue_size" default="1" /> <!-- apriltag_ros continuous detection node --><node pkg="apriltag_ros" type="apriltag_ros_continuous_node" name="apriltag_ros_continuous_node" clear_params="true" output="screen" launch-prefix="$(arg launch_prefix)"><!-- Remap topics from those used in code to those on the ROS network --><remap from="image_rect" to="$(arg camera_name)/$(arg image_topic)" /><remap from="camera_info" to="$(arg camera_name)/camera_info" /><param name="publish_tag_detections_image" type="bool" value="true" /><!-- default: false --><param name="queue_size" type="int" value="$(arg queue_size)" /><!-- load parameters (incl. tag family, tags, etc.) --><rosparam command="load" file="$(find apriltag_ros)/config/settings.yaml"/><rosparam command="load" file="$(find apriltag_ros)/config/tags.yaml"/></node>
</launch>

  修改 ~/catkin_ws/src/apriltag_rosapriltag_ros/config/tags.yaml 文件,添加需要检测的二维码id与自己测量得到的二维码尺寸大小size(单位:米)。

standalone_tags:[{id: 1, size: 0.0515},{id: 2, size: 0.0515},{id: 3, size: 0.0515},{id: 4, size: 0.0515},{id: 5, size: 0.0515},{id: 6, size: 0.0515}    ]

注意
1、同一 ID 的 Apriltag 码不能在该配置文件中以不同的大小出现两次,也不能出现在一张图片的两个地方。这些都将在检测中产生歧义。

2、确保打印的 AprilTag 码至少包含 1 1 1 位宽的白色边框,AprilTag 算法会对周围的白色边框进行采样。

4.3 运行Apriltag_ros

  分别打开四个终端,运行如下命令行:

(1) 启动 USB 相机驱动

roslaunch usb_cam usb_cam-test.launch

(2) 运行 AprilTag_ros 算法

roslaunch apriltag_ros continuous_detection.launch

(3) RViz 可视化界面

rosrun rviz rviz

(4) 输出定位数据

rostopic echo /tag_detections

  正确运行识别到 AprilTag 的界面如下图所示:

在这里插入图片描述

  输出的定位数据如下:

在这里插入图片描述


五、总结

  本教程介绍了如何使用 ROS 进行相机标定和 Apriltag 识别。

  首先,安装了 usb_cam 驱动和 camera_calibration 功能包,并准备了一个 6 × 9 6\times9 6×9 的棋盘格标定板和一个单目 USB 摄像头。

  然后,启动了摄像头驱动节点,并调整了摄像头视频设备 id,以正确地接收摄像头图像。

  接下来,运行了相机标定节点,通过在摄像机周围移动标定板,完成了标定过程,并得到了相机的内参矩阵和畸变系数矩阵。

  最后,安装了 Apriltag_ros 功能包,并修改了配置文件以匹配摄像头和 Apriltag 尺寸。运行了 Apriltag 识别节点,并在 RViz 中可视化了检测结果。

  通过本教程,读者可掌握如何使用 ROS 进行相机标定和 Apriltag 识别,这对于机器人视觉系统至关重要。


参考资料

  1、【Ubuntu】虚拟机安装USB摄像头ROS驱动 usb_cam(最新方法)

  2、使用Apriltags实现定位、评估定位精度的全流程记录

  3、ROS下采用camera_calibration进行单目相机标定


后记:

🌟 感谢您耐心阅读这篇关于 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀

相关文章:

【AprilTag】视觉定位实战 | 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…...

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6116 标注数量(xml文件个数)&#xff1a;6116 标注数量(txt文件个数)&#xff1a;6116 标注…...

windows10下tomcat安装及配置教程

Apache Tomcat是一个开源的、轻量级的Servlet容器&#xff0c;广泛用于运行Java Web应用程序。以下是Tomcat安装及配置的基本步骤&#xff0c;根据搜索结果整理&#xff1a; 一、安装前的准备工作 确保你的计算机上已经安装了Java Development Kit (JDK)&#xff0c;因为Tomc…...

Spring MVC设置请求头和响应头的Header

在Spring MVC中&#xff0c;动态设置请求头和响应头的方法有多种&#xff0c;以下是一些常见的方式&#xff1a; 设置请求头 使用RequestHeader注解 这个注解用于读取请求中的单个HTTP头部值&#xff0c;并将其作为一个参数传递给控制器方法。 RequestMapping("/examp…...

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展&#xff0c;后台管理系统的复杂度不断增加&#xff0c;对于开发者而言&#xff0c;既要系统的功能完备&#xff0c;又要追求开发效率的提升。然而&#xff0c;传统的开发方式往往会导致大量的重复劳动&#xff0c;尤其是在构建复杂的管理页面时。有…...

HTML讲解(二)head部分

目录 1. 2.的使用 2.1 charset 2.2 name 2.2.1 describe关键字 2.2.2 keywords关键字 2.2.3 author关键字 2.2.4 http-equiv 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#x…...

Linux(Ubuntu)(终端实现helloworld输出)

一、终端实现gcc编译 1.写好helloworld.h&#xff0c;helloworld.c&#xff0c;main.c后&#xff0c;打开终端&#xff0c;切换到保存这些文件的文件夹的目录&#xff0c;我把这些文件存放在helloworld的文件夹下&#xff0c;所以输入cd ~/helloworld 2.查看该目录下的文件&a…...

开源模型应用落地-qwen模型小试-调用Qwen2-VL-7B-Instruct-更清晰地看世界-集成vLLM(二)

一、前言 学习Qwen2-VL ,为我们打开了一扇通往先进人工智能技术的大门。让我们能够深入了解当今最前沿的视觉语言模型的工作原理和强大能力。这不仅拓宽了我们的知识视野,更让我们站在科技发展的潮头,紧跟时代的步伐。 Qwen2-VL 具有卓越的图像和视频理解能力,以及多语言支…...

【乐企-工具篇】有关乐企发票文件生成- OFD和PDF文件生成

有关乐企发票文件生成- OFD和PDF文件生成 本文主要是实现发票的OFD文件以及PDF文件的生成可以参考具体实现思路,具体情况需要根据自己业务进行改造! 具体的OFD文件模板可以从税局进行下载,下载之后放到resources资源目录下。 代码 package com.ruoyi.output.service.thi…...

llama网络结构及源码

目录 模型初始化 config lm_head transformer wte h rms_1/rms_2 attn c_attn c_proj 线性层mlp ln_f rope_cache mask_cache kv_caches tokenizer tokenizer初始化 tokennizer.encoder 位置编码和mask 确定最大文本长度 建立rope_cache 建立mask_cache …...

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学&#xff0c;这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了&#xff0c;大力赞叹华为云的 同时感谢华为云提供优惠卷&#xff0c;只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动&#xff0c;90款免…...

计算机网络 8.*结构化布线

第八章 结构化布线 第一节 结构化布线基础 一、认识结构化布线 1.定义&#xff1a;在建筑物或楼宇内安装的传输线路&#xff0c;是一个用于语音、数据、影像和其他信息技术的标准结构化布线系统。 2.任务&#xff1a;使语音和数据通信设备、交换设备和其他信息管理系统彼此相…...

c#的委托、事件

程序目的&#xff1a;实现对一个bool型变量的监视&#xff0c;当数据变化时&#xff0c;调用某一个函数&#xff0c;引申出委托、事件等基础概念。 方法一、在form1的类定义中&#xff0c;定义如下代码&#xff0c;这样定义是最直接的&#xff0c;也非常简单&#xff0c;没有涉…...

Day23笔记-Day21和Day22作业讲解单例类

Day22作业讲解 学生类Student:属性:学号&#xff0c;姓名&#xff0c;年龄&#xff0c;性别&#xff0c;成绩 ​ 班级类 Grade:属性:班级名称&#xff0c;班级中的学生 【使用列表存储学生】 ​方法:1.查看该班级中的所有学生的信息2.查看指定学号的学生信息3.查看班级中成绩不…...

k8s中的存储

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…...

【Linux进程控制】进程程序替换

目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…...

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…...

web渗透—RCE

一&#xff1a;代码执行 相关函数 1、eval()函数 assert()函数 (1)原理&#xff1a;将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过&#xff1a;闭合注释&#xff1b;开启GPC的话就无法绕过&#xff08;GPC就是将单引号转换为"反斜杠单引号"&a…...

HomeAssistant显示节假日

先看效果 步骤&#xff1a; 新建卡片时选择“Markdown 卡片”代码在文章最下方&#xff0c;当然你也可以自己修改 点击保存/完成 ### {% if now().hour > 6 and now().hour < 9 -%} 早上好&#xff0c; {%- elif now().hour > 9 and now().hour < 12 -%} 上午好…...

AI问答-HTTP:理解 Content-Disposition

本文背景 在下载arraybuffer文件时&#xff0c;想要获取文件名&#xff0c;这时引入本文内容Content-Disposition&#xff0c;我们在Content-Disposition获取到文件名就可以在下载后的文件以该文件名命名了。 一、简介 Content-Disposition是HTTP协议中的一个响应头字段&…...

kubernetes架构

kubernetes cluster由master和node组成&#xff0c;节点上运行着若干kubernetes服务Master节点&#xff1a; master是kubernetes cluster的大脑&#xff0c;运行着的Daemon服务包括kube-apiserver&#xff0c;kube-scheduler,kube-controller-manager&#xff0c;etcd和Pod网络…...

【隐私计算篇】中国剩余定理解释以及Paillier解密加速应用

1. 背景介绍 本篇主要关注中国剩余定理的原理以及在paillier同态加密系统中的应用。在很多工作中&#xff0c;都可以看到中国剩余定理的影子&#xff0c;特别是同态加密提升计算效率的优化工作中&#xff0c;将paillier与中国剩余定理进行结合&#xff0c;能够实现在加密状态下…...

保护您的隐私:隐藏 IP 地址的重要性

在当今的数字时代&#xff0c;我们的在线隐私和安全变得比以往任何时候都更加重要。浏览互联网时保护自己的一种方法是隐藏您的 IP 地址。 但是为什么要隐藏您的 IP 地址以及如何有效地做到这一点&#xff1f; 隐藏您的 IP 地址有助于保护您的在线匿名性。您的 IP 地址就像您的…...

nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink

完整错误信息 npm error Error: EPERM: operation not permitted, symlink npm warn cleanup Failed to remove some directories [ npm warn cleanup [ npm warn cleanup C:\\Users\\kingchuxing\\Documents\\IPFS\\orbit-db-set-master\\node_modules\\ipfs-cli, npm…...

Rsync未授权访问漏洞复现及彻底修复

一、什么是 Rsync&#xff1f; Rsync 是一种广泛使用的文件传输工具&#xff0c;它允许系统管理员和用户通过局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;在计算机之间同步文件和目录。Rsync 支持通过本地或远程 shell 访问&#xff0c;也可以作为守…...

影刀RPA实战:网页爬虫之携程酒店数据

1.实战目标 大家对于携程并不陌生&#xff0c;我们出行定机票&#xff0c;住酒店&#xff0c;去旅游胜地游玩&#xff0c;都离不开这样一个综合性的网站为我们提供信息&#xff0c;同时&#xff0c;如果你也是做旅游的公司&#xff0c;那携程就是一个业界竞争对手&#xff0c;…...

【UCB CS61C】Lecture 5 - Floating Point

目录 引入浮点数&#xff08;Floating Point&#xff09;定点表示法&#xff08;Fixed-Point Model&#xff09;科学记数法&#xff08;Scientific Notation&#xff09;记数法间的转换 IEEE 754 二进制浮点数算术标准实现目标单精度浮点编码阶码字段&#xff08;The Exponent …...

【Binlog实战】:基于Spring监听Binlog日志

【Binlog实战】&#xff1a;基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种不同的格式&#xff0c;通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式&#xff1a; 在 …...

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…...

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…...