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

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装

rvctools下载地址:rvctools下载
截图如下,点击红色箭头指示的Download Shared Folder即可下载

下载之后进行解压,解压到D:\MATLAB\toolbox这个工具箱目录,这个安装路径根据自己的情况来选择,没有安装MATLAB,感兴趣的可以查阅:MatLab的下载、安装与使用(亲测有效)

然后我们打开MATLAB,打开上面解压的这个机器人工具箱,双击startup_rvc.m,点击运行,如下图:

这样就愉快的安装好了这个机器人工具箱了,其中startup_rvc.m的代码如下: 

function startup_rvcdisp('Robotics, Vision & Control: (c) Peter Corke 1992-2020 http://www.petercorke.com')if verLessThan('matlab', '7.0')warning('You are running a very old (and unsupported) version of MATLAB.  You will very likely encounter significant problems using the toolboxes but you are on your own with this');endtb = false;startup_path = fileparts( mfilename('fullpath') );[~,folder]=fileparts(startup_path);if strfind(folder, 'common')% startup_rvc is in common folderrvcpath = fileparts(startup_path);else% startup_rvc is in folder above commonrvcpath = startup_path;endrobotpath = fullfile(rvcpath, 'robot');if exist(robotpath, 'dir')addpath(robotpath);tb = true;if exist('startup_rtb') == 2startup_rtbendendvisionpath = fullfile(rvcpath, 'vision');if exist(visionpath, 'dir')addpath(visionpath);tb = true;if exist('startup_mvtb') == 2startup_mvtbendendif tb% RTB or MVTB is present% add spatial math toolboxp = fullfile(rvcpath, 'spatial-math');if exist(p, 'dir')tryfp = fopen( fullfile(p, 'RELEASE'), 'r');release = fgetl(fp);fclose(fp);catch MErelease = [];endif releaserelease = ['(release ' release ')'];elserelease = '';endfprintf('- Spatial Math Toolbox for MATLAB %s\n', release)addpath(p);end% add common filesaddpath(fullfile(rvcpath, 'common'));elsefprintf('Neither Robotics Toolbox or MachineVision Toolbox found in %s\n', rvcpath);end% check for any install problemsrvccheck(false)
end

后期如果关闭了MATLAB,想要运行机器人的话,运行函数startup_rvc即可

2、运动学

机器人或者说飞行器,随着时间而发生动作变换,叫做运动学(kinematics),这个跟动力学(dynamics)是不一样的,动力学是研究影响运动的因素,而动力学是不考虑作用力和质量等因素,研究的是随着时间在空间中的位置问题。对于运动基本上就是平移和旋转了,就会牵涉到坐标系和角度等转换,接下来我们来学习下

2.1、平移

物体的平移比较简单,就是沿着XYZ三轴平移
沿着X轴平移:transl(2,0,0)

沿着Y轴平移:transl(0,2,0) 

沿着Z轴平移:transl(0,0,2) 

当然也可以在XYZ轴都进行平移:transl(1,3,2) 

我们对最后这个画图看下效果:trplot(transl(1,3,2)),如下图:

我标注红点的位置是(1,3,2),因为是在三维空间的展示,所以看起来XYZ轴的数值不对,其实是对的,大家可以在MATLAB中的这张图进行拖动旋转,然后就会发现红点的坐标就是(1,3,2) 

2.2、旋转

旋转就是绕轴做圆周运动

绕X轴旋转:Rx = rotx(pi/2) 

绕Y轴旋转:Ry = roty(pi/2)

绕Z轴旋转:Rz = rotz(pi/2) 

旋转叠加:Rxy = Rx * Ry

动画演示:tranimate(Rxy),这样看起来非常清晰直观。 

我们来看下点(3,4),旋转60度的情况:

T1=SE2(3,4,pi/3)T1 = 0.5000   -0.8660         30.8660    0.5000         40         0         1

对其画图:trplot(T1),如下:

我们也可以使用transforms3d库中的结果,用来验证在MATLAB中生成的结果,代码如下:

import transforms3d as tfs
import math
print(tfs.euler.euler2mat(math.pi/3,0,0))
/*
[[ 1.         0.         0.       ][ 0.         0.5       -0.8660254][-0.         0.8660254  0.5      ]]
*/

 MATLAB中的结果如下:

T2=rotx(pi/3)
/*
T2 =1.0000         0         00    0.5000   -0.86600    0.8660    0.5000
*/

上述是弧度制,也可以使用角度制, 指定deg参数:rotx(60,'deg')

3、六轴机器人

3.1、Link关节连杆

这里我们使用更改的D-H参数,也就是接下来的Link函数指定modified参数 

L = Link([1 2 3 4],'modified')
%L = Revolute(mod): theta=q, d=2, a=3, alpha=4, offset=0

Link函数里面的参数分别表示为,关节角度[L1.theta]、连杆偏距[L1.d]、连杆长度[L1.a]、连杆旋转角度[L1.alpha],参数modified表示的是改进版本的DH参数
这里附带介绍下D-H的相关知识:
DH参数是一种描述机器人关节之间关系的参数化方法,由Denavit和Hartenberg提出。DH参数法可以用4个参数来表示刚体之间的相对关系,包括沿Z轴的平移长度a、沿共同法线的旋转角度α、在XZ平面内的偏移距离d、绕Z轴的旋转角度θ。
DH参数在ROS中被广泛应用,用于描述机器人关节和坐标系之间的关系,主要用于正向运动学计算,可以通过DH表获取每个关节的变换矩阵,将所有变换矩阵相乘,最终获得从基准坐标系到末端执行器坐标系的变换矩阵。
这个D-H方法是在运动学中求解比较通用的,其余还有李代数方法等。

连杆类型

L.type()
%ans =    'R'

也就是说这个是旋转的R(revolute)关节类型,除此之外还有一种是柱状形(prismatic)的关节

接下来就是分别创建6个关节,也就是为6轴的机械臂做准备:

L1 = Link([0 0 0 0],'modified')
L2 = Link([0 0.138+0.024 0 -pi/2],'modified')
L3 = Link([0 -0.127-0.024 0.42 0],'modified')
L4 = Link([0 0.114+0.021 0.375 0],'modified')
L5 = Link([0 0.114+0.021  0 -pi/2],'modified')
L6 = Link([0 0.09+0.021  0 pi/2],'modified')

3.2、SerialLink机械臂

上面定义好了6个关节,接下来我们使用SerialLink将这些关节连接起来成为一个六轴机械臂的机器人。 

MyBot = SerialLink([L1,L2,L3,L4,L5,L6],'name','Six Axis Robot')

我们先来看下SerialLink有哪些方法:help(SerialLink)

--- SerialLink 的帮助 ---

 SerialLink Serial-link robot class
 
  A concrete class that represents a serial-link arm-type robot.  Each link
  and joint in the chain is described by a Link-class object using Denavit-Hartenberg
  parameters (standard or modified).
 
  Constructor methods::
   SerialLink    general constructor
   L1+L2         construct from Link objects
 
  Display/plot methods::
   animate       animate robot model
   display       print the link parameters in human readable form
   dyn           display link dynamic parameters
   edit          display and edit kinematic and dynamic parameters
   getpos        get position of graphical robot
   plot          display graphical representation of robot
   plot3d        display 3D graphical model of robot
   teach         drive the graphical robot
 
  Testing methods::
   islimit       test if robot at joint limit
   isconfig      test robot joint configuration
   issym         test if robot has symbolic parameters
   isprismatic   index of prismatic joints
   isrevolute    index of revolute joints
   isspherical   test if robot has spherical wrist
   isdh          test if robot has standard DH model
   ismdh         test if robot has modified DH model
 
  Conversion methods::
   char          convert to string
   sym           convert to symbolic parameters
   todegrees     convert joint angles to degrees
   toradians     convert joint angles to radians

SerialLink类提供的方法,我们了解到可以用来描述机器人的连杆结构:SerialLink类描述机器人的连杆结构,包括每个连杆的长度、方向和旋转轴。有了这些信息,我们可以用于计算机器人的运动学模型,从而对机器人做出控制和运动规划。 

显示连接参数:MyBot.display()

MyBot = Six Axis Robot:: 6 axis, RRRRRR, modDH, slowRNE                  
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|          0|          0|
|  2|         q2|      0.162|          0|    -1.5708|          0|
|  3|         q3|     -0.151|       0.42|          0|          0|
|  4|         q4|      0.135|      0.375|          0|          0|
|  5|         q5|      0.135|          0|    -1.5708|          0|
|  6|         q6|      0.111|          0|     1.5708|          0|
+---+-----------+-----------+-----------+-----------+-----------+

 操作机械臂:MyBot.teach()

 这样就会生成六轴机械臂的机器人,然后我们就可以通过操作不同关节来操作机器人的机械臂了,如下图:

我们操作左边q1~q6,就会看到机械臂的运动以及XYZ轴和RPY欧拉角的变化

4、运动学

4.1、正运动学

运动学分为正解和逆解,正运动学(Forward kinematics):已知每个关节的位姿与连杆的长度等参数,求解末端执行器的位姿。
我们来看下正解

MyBot.fkine([pi/2 -pi/4 pi/2 pi/3 -pi/2 pi/6])
/*
ans = -0.8660    0.5000         0    -0.146-0.4830   -0.8365    0.2588    0.46050.1294    0.2241    0.9659     0.1740         0         0         1
*/

生成的是对应关节角度的末端的齐次变换矩阵。

4.2、逆运动学

逆运动学(Inverse kinematics)跟正运动学是反过来的,根据机器人的末端执行器的位姿,计算出机器人各个关节的位姿等运动参数。这个要复杂点,因为它的求解可能是不确定的唯一解,会产生多重解的问题,当然也可能得不到解析解的情况。

迭代法:

%起始状态
init = [0.795 0.257 -0.135 0 0 -pi/2]
%目标状态
targ = [0 0.836 -0.135 0 -pi/3 -pi/2]
T0=MyBot.fkine(init)
/*
T0 = 0.0852    0.6951   -0.7139    0.35010.0869    0.7086    0.7003    0.72390.9926   -0.1217         0   -0.28640         0         0         1
*/
TF=MyBot.fkine(targ)
/*
TF = 0.6450    0.3821   -0.6618    0.40760    0.8660    0.5000    0.20150.7642   -0.3225    0.5586   -0.59470         0         0         1
*/
%每次迭代的末端执行器相对于首端的齐次变换矩阵
step =50
%ctraj是Matlab中机器人轨迹(trajectory)规划的函数
TC=ctraj(T0,TF,step)
%比如迭代到第50次
/*
TC(50) = 0.6450    0.3821   -0.6618    0.40760    0.8660    0.5000    0.20150.7642   -0.3225    0.5586   -0.59470         0         0         1
*/
qq = MyBot.ikine(TC,'mask',[1 1 1 0 0 0])

返回的就是50*6的双精度数组,长度是50:length(qq)

    0.7951    0.1852    0.0167   -0.0314    0.0432         0
    0.7946    0.1853    0.0174   -0.0303    0.0422         0
    0.7931    0.1856    0.0196   -0.0267    0.0394         0
......
   -0.1278    0.6478    0.4212    0.2245   -0.2429         0
   -0.1317    0.6494    0.4203    0.2230   -0.2419         0
   -0.1330    0.6500    0.4201    0.2226   -0.2416         0 

接下来我们使用ctraj来规划轨迹,使用ikine函数来做逆解,沿着轨迹进行运动。 

5、直线轨迹规划

这里使用标准的DH参数来测试下,三个自由度的机械臂如何做运动规划的,一起来了解下:

%这里是第一次开启MATLAB时,运行这个函数,启动rvc:startup_rvc
%参数:关节角、偏置距离、连杆长度、连杆扭角、sigma为0表示旋转关节
L1 = Link([0 84.72 41.04 pi/2 0]);
L2 = Link([0 0 200 0 0]);
L3 = Link([0 0 214.8 0 0]);% 可以限制旋转角度范围
L1.qlim = [deg2rad(-170) deg2rad(170)];
L2.qlim = [deg2rad(-60) deg2rad(85)];
L3.qlim = [deg2rad(-90) deg2rad(10)];Bot2 = SerialLink([L1 L2 L3], 'name', '机械臂运动学');
%手动操作关节进行旋转
Bot2.teach()%起点
T1 = transl(100,-10,50);
%终点
T2 = transl(300,-30,200);
%规划轨迹(trajectory)
T = ctraj(T1,T2,50);
Tj = transl(T);
%输出末端轨迹
plot3(Tj(:,1),Tj(:,2),Tj(:,3));
%当反解的机械臂自由度少于6时,要用mask掩码减少自由度,否则无法直接调用ikine作为运动学反解函数
q = Bot2.ikine(T,'mask',[1 1 1 0 0 0]);
Bot2.plot(q);

 这样就会看到沿着规划好的直线,自动进行运动了,简单起见截个图如下(实质是运动的):

6、圆轨迹规划

N = (0:0.5:100)'; 
center = [200 -150 -50];
radius = 60;
theta = (N/N(end))*2*pi;
points = (center + radius*[cos(theta) sin(theta) zeros(size(theta))])';  
plot3(points(1,:),points(2,:),points(3,:),'r');%沿着圆的轨迹平移
T = transl(points');
q2 = Bot2.ikine(T,'mask',[1 1 1 0 0 0]);
Bot2.plot(q2);

这样就会看到沿着规划好的圆,自动进行运动了,简单起见截个图如下(实质是运动的):

 

7、常见用法

其余的一些常见用法,如下:
关节数:MyBot.n
画出机械臂:MyBot.plot([0 0 0 0 0 0])
机器人的结构类型:Mybot.config
关节范围:MyBot.qlim
连杆向量(更直观):MyBot.links
重力方向([gx gy gz]):MyBot.gravity
连杆的动力学属性:MyBot.dyn
是否是旋转关节:MyBot.isrevolute
是否是移动关节:MyBot.isprismatic
是否是球关节:MyBot.isspherical
关节与连杆是否有符号参数:MyBot.issym
可以编辑动力学参数:MyBot.edit

 

8、小结

文章主要介绍了机器人工具箱rvctools,以及它的用法,了解运动学的相关知识,对坐标的变换,轨迹的规划等有个直观的了解,最后在进行运动规划的时候,有时候会出现下面这样的错误:
警告: failed to converge: try a different initial value of joint coordinates 
收敛失败:尝试不同的关节坐标初始值
这样的情况一般是关节不能到达那个坐标,所以需要更改坐标为合理值即可。
另外仔细观察代码中会出现一些矩阵带单引号',这个表示转置的意思,比如:
size(N)的形状是1 x 201,而size(N')的形状就是201 x 1
元素个数numel(N) 结果:201,维度ndims(N) 结果:2 

相关文章:

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装 rvctools下载地址:rvctools下载 截图如下,点击红色箭头指示的“Download Shared Folder” 即可下载 下载之后进行解压,解压到D:\MATLAB\toolbox这个工具箱目录,这个安装路径根据自己的情况来选择&#xff0c…...

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能,实现了无人机的自主降落和起飞,在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台,还具备自动换电或充电等功能,为无人机的自动化提供了关键支持。为更有效地操作无…...

【蓝桥杯】带分数

带分数 题目要求用一个ab/c的形式得到一个值&#xff0c;而且只能在1~9里面不重复的组合。 可以对1~9进行全排列&#xff0c;然后不断划分区间。 #include<iostream> #include<vector> using namespace std; int st[15]; int num[15]; int res; int n;int calc(i…...

软件工程 课堂测验 选择填空

系统流程图用图形符号表示系统中各个元素&#xff0c;表达了系统中各个元素之间的 信息流动 喷泉模型是一种以用户需求为动力&#xff0c;以 对象 为驱动的模型。 软件生存周期中最长的是 维护 阶段。 变换流的DFD由三部分组成&#xff0c;不属于其中一部分的是 事务中心 软…...

计算机网络的分类

目录 一、按照传输介质进行分类 1、有线网络 2、无线网络 二、按照使用者进行分类 1、公用网 (public network) 2、专用网(private network) 三、按照网络规模和作用范围进行分类 1、PAN 个人局域网 2、LAN 局域网 3、MAN 城域网 4、 WAN 广域网 5、Internet 因特…...

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度&#xff0c;作为中国最大的搜索引擎&#xff0c;其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中&#xff0c;了解自己网站…...

select选择框里填充图片,下拉选项带图片

遇到一个需求&#xff0c;选择下拉框选取图标&#xff0c;填充到框里 1、效果展示 2、代码 <el-form-item label"工种图标" class"Form_icon Form_label"><el-select ref"select" :value"formLabelAlign.icon" placeholder&…...

轨道交通数字孪生可视化平台,助力城市交通运营智慧化

随着经济和科技的快速发展&#xff0c;轨道交通运营管理在日常操作者面临各种挑战。数字孪生技术被认为是未来轨道交通运营管理的重要手段之一。它可以提高轨道交通的运营效率和安全性&#xff0c;助力城市交通运营智慧化。以城市轨道交通运维管理业务需求为导向,从数据感知、融…...

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…...

善网商城上线洁柔产品 公益人专享爱心价官方正品

近日&#xff0c;中国善网慈善商城&#xff08;以下简称善网商城&#xff09;系统经升级后重新上线。目前善网商城线上销售的中顺洁柔旗下慈善产品已顺利获得中顺洁柔纸业股份有限公司授权&#xff0c;双方就合作事宜达成共识&#xff0c;并于近日签订线上经营授权书。 &#x…...

禁止谷歌浏览器自动更新

禁止谷歌浏览器自动更新 在使用Python包selenium的时候浏览器版版本发生变化后产生很多问题如&#xff1a; 1、直接版本不对应无法运行 2、版本不一致导致debug启动浏览器超级慢 这里是已谷歌浏览器为代表的。 禁止自动更新的方法如下&#xff1a; 1、WinR调出运行&#x…...

Oracle存储过程返回DataSet(多个DataTable)给C#

一、存储过程 CREATE OR REPLACE PROCEDURE GET_SENDEXCEL_XY ( ZGJ182X OUT SYS_REFCURSOR , ZGJ182Y OUT SYS_REFCURSOR , ZXN182X OUT SYS_REFCURSOR , ZXN182Y OUT SYS_REFCURSOR , ZLH182X OUT SYS_REFCURSOR …...

如何往excel中写子表?

with pd.ExcelWriter("C:/last_date.xlsx") as writer:for i in range(0, 10):df pd.DataFrame()df.to_excel(writer, indexFalse, sheet_namestr(days[i 1]))...

Flutter 控件查阅清单

为了方便记录和使用Flutter中的各种控件&#xff0c;特写此博客以记之&#xff0c;好记性不如烂笔头嘛&#xff1a;&#xff09; 通过控件的首字母进行查找&#xff0c;本文会持续更新 控件目录 AAppBar BCContainerColumn &#xff08;列&#xff09; DDivider (分割线) EElev…...

【高效开发工具系列】gson入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Python中的缺失值

Python中的缺失值 1、情景描述2、Python中的缺失值 1、情景描述 在使用Pandas中的文件读取API读取Excel、CSV或TXT等文件时&#xff0c;我们可能需要对读取到的数据进行简单清洗。例如&#xff0c;将其中的表示空值的字符串替换为真正意义上的缺失值 来看一个例子&#xff1a;…...

JVM 字节码

JVM概述 问题引出 你是否也遇到过这些问题&#xff1f; 运行着的线上系统突然卡死&#xff0c;系统无法访问&#xff0c;甚至直接OOM&#xff01;想解决线上JVM GC问题&#xff0c;但却无从下手。新项目上线&#xff0c;对各种JVM参数设置一脸茫然&#xff0c;直接默认吧&…...

ComfiUI API调用随记

来进行知识接力了&#xff1a; 首先了解下ComfiUI的APIstable diffusion comfyui的api使用教程-CSDN博客 对于ComfiUI&#xff0c;接口比较简单。查询接口比较容易看明白。 对于发起prompt的请求&#xff0c;如果需要图片的&#xff0c;则需预先上传图片给ComfiUI&#xff0c…...

Dockerfile讲解

Dockerfile 1. 构建过程解析2. Dockerfile常用保留字指令3. 案例3.1. 自定义镜像mycentosjava83.2. 虚悬镜像 4. Docker微服务实战 dockerfile是用来构建docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 dockerfile定义了进程需要的一切东西&…...

Ansible及其优势是什么?

Ansible是一款极其简单的开源的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。实现了批量系统配置&#xff0c;批量程序部署&#xff0c;批量运行命令等功能。同时Ansible是基于模块工作&#xff0c;…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码&#xff0c;使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…...