更新 Docs/2024-10-25/README.md
parent
e3566639e8
commit
dd381b4392
|
@ -44,6 +44,196 @@ PlatformIO库管理的例子:
|
||||||
|
|
||||||
此时,在platformio.ini中加入下面的代码,然后点击‘√’进行编译,就可以在控制台看到结果。
|
此时,在platformio.ini中加入下面的代码,然后点击‘√’进行编译,就可以在控制台看到结果。
|
||||||
|
|
||||||
|
|
||||||
|
2.SolidWorks安装与使用
|
||||||
|
|
||||||
|
2.1. URDF文件
|
||||||
|
|
||||||
|
URDF(统一机器人描述格式)文件是用于描述机器人的结构和属性的XML格式文件。它包含机器人的关节、链接、传感器和其他组件的信息。基本结构包括:
|
||||||
|
|
||||||
|
1. **链接(link)**:定义机器人的每个部件的形状、质量、惯性等属性。
|
||||||
|
2. **关节(joint)**:定义链接之间的连接方式,包括类型(如旋转或滑动)和运动限制。
|
||||||
|
3. **传感器(sensor)**:描述机器人上安装的传感器,如摄像头或激光雷达。
|
||||||
|
|
||||||
|
以上的组件定义名称确定保持唯一。例如:
|
||||||
|
|
||||||
|
```
|
||||||
|
<robot name="example_robot">
|
||||||
|
<link name="base_link">
|
||||||
|
<inertial>
|
||||||
|
<mass value="1.0"/>
|
||||||
|
<inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
|
||||||
|
</inertial>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<box size="1 1 1"/>
|
||||||
|
</geometry>
|
||||||
|
</visual>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<joint name="joint1" type="revolute">
|
||||||
|
<parent link="base_link"/>
|
||||||
|
<child link="link1"/>
|
||||||
|
<axis xyz="0 0 1"/>
|
||||||
|
<limit lower="0" upper="1.57" effort="10" velocity="1"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name="link1">
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<cylinder radius="0.1" length="1.0"/>
|
||||||
|
</geometry>
|
||||||
|
</visual>
|
||||||
|
</link>
|
||||||
|
</robot>
|
||||||
|
```
|
||||||
|
|
||||||
|
2.2. SolidWorks
|
||||||
|
|
||||||
|
SolidWorks 是一款强大的 3D 计算机辅助设计(CAD)软件,广泛应用于工程和产品设计。它提供了多种功能,包括:
|
||||||
|
|
||||||
|
1. **3D建模**:用户可以创建复杂的3D模型,通过拉伸、旋转、切割等操作。
|
||||||
|
|
||||||
|
2. **装配**:允许将多个零件组合成一个完整的装配体,并进行运动分析。
|
||||||
|
|
||||||
|
3. **工程图**:从3D模型生成2D工程图,提供详细的尺寸和注释。
|
||||||
|
|
||||||
|
4. **仿真**:可以进行结构分析、热分析和流体动力学分析等,验证设计的性能。
|
||||||
|
|
||||||
|
5. **零件库**:提供标准零件库,方便快速设计和装配。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
安装:[SolidWorks2022 安装教程_solidworks2022安装教程-CSDN博客](https://blog.csdn.net/Dustinthewine/article/details/125711729?ops_request_misc=%7B%22request%5Fid%22%3A%2290DD7D2E-0FF2-441B-A71F-D32063C056B7%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=90DD7D2E-0FF2-441B-A71F-D32063C056B7&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-125711729-null-null.142^v100^pc_search_result_base2&utm_term=SolidWorks&spm=1018.2226.3001.4187)
|
||||||
|
|
||||||
|
如果遇到文章描述的问题,可以参考:[【亲测有效】无法获得下列许可 SOLIDWORKS Standard 无效的(不一致的) 使用许可号码 (-8,544,0)_无法获得下列许可solidworks standard-CSDN博客](https://blog.csdn.net/weixin_41717861/article/details/136000671?ops_request_misc=&request_id=&biz_id=102&utm_term=SolidWorks安装 无效的许可号码-8544&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-136000671.142^v100^pc_search_result_base2&spm=1018.2226.3001.4187)
|
||||||
|
|
||||||
|
![image-20241024011734839](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410240117028.png)
|
||||||
|
|
||||||
|
安装插件URDFexporter:
|
||||||
|
|
||||||
|
![image-20241024104319660](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241043698.png)
|
||||||
|
|
||||||
|
![image-20241024104724792](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241047875.png)
|
||||||
|
|
||||||
|
安装成功后,会多出来一个插件:
|
||||||
|
|
||||||
|
![image-20241024104921939](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241049986.png)
|
||||||
|
|
||||||
|
3.编码器与PID控制
|
||||||
|
|
||||||
|
3.1.编码器
|
||||||
|
|
||||||
|
编码器是一种传感器,用于测量和获取机器人运动的信息,例如位置、速度或角度等。
|
||||||
|
|
||||||
|
码盘:码盘是用于测量角位移的数字编码器。
|
||||||
|
|
||||||
|
编码器主要有绝对式编码器和增量式编码器两种类型:
|
||||||
|
|
||||||
|
3.1.1 绝对式编码器
|
||||||
|
|
||||||
|
通过对码盘的各个位置设计特定的编码,可以输出转动轴的绝对位置信息。
|
||||||
|
|
||||||
|
![image-20241024145232819](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241452871.png)
|
||||||
|
|
||||||
|
1.每个位置都有唯一的编码值,通常以二进制、十六进制或其他编码方式表示。
|
||||||
|
|
||||||
|
2.能够在任何时候提供绝对位置,断电后也不丢失信息。
|
||||||
|
|
||||||
|
3.适合需要高精度和可靠性的应用。
|
||||||
|
|
||||||
|
3.1.2 增量式编码器
|
||||||
|
|
||||||
|
无法直接得到轴的绝对位置信息。对于轴的每一圈转动,增量式编码器提供一定数量的脉冲(通常编码器参数中用n线/n脉冲来表示)。通过测量脉冲的数量可以得到旋转的角度,或者测量单位时间内的脉冲数可以得到轴的转速。
|
||||||
|
|
||||||
|
脉冲的个数也可以用于表示位移的大小。但是增量式编码器断电后可能会丢失部分信息。
|
||||||
|
|
||||||
|
![image-20241024152622800](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241526855.png)
|
||||||
|
|
||||||
|
**2-相脉冲**(Two-phase Pulse)是一种编码器或传感器的输出信号类型,通常用于检测旋转或线性运动的方向和速度。它广泛应用于增量式编码器中。在2-相脉冲信号中,编码器产生两路方波信号,分别称为 **A相** 和 **B相**,并且这两个信号之间有一个90度的相位差。通过比较A相和B相的脉冲顺序,可以确定旋转的方向,而通过计算脉冲数可以得到运动的速度。
|
||||||
|
|
||||||
|
可以通过相位的关系判断旋转的方向;可以通过比较两个相位的先后顺序判断运动的方向。
|
||||||
|
|
||||||
|
可以通过一段时间的脉冲数量计算出运动的速度。
|
||||||
|
|
||||||
|
编码器的分辨率越高,每转的脉冲数越多,检测的精度也越高。
|
||||||
|
|
||||||
|
![image-20241024152635500](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241526573.png)
|
||||||
|
|
||||||
|
3.1.3 4倍频
|
||||||
|
|
||||||
|
**4倍频**指的是控制器在处理编码器信号时,不仅检测每个信号的上升沿或下降沿,而是检测**A相和B相的每一个上升沿和下降沿**,从而将编码器的分辨率提高到4倍。对AB相的上升沿和下降沿均作检测,这样在一个周期内有四种状态:
|
||||||
|
|
||||||
|
![image-20241024153348494](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241533534.png)
|
||||||
|
|
||||||
|
在这一个周期中,四个状态按照顺序分别为:
|
||||||
|
|
||||||
|
A相上升沿对应B相低电平;B相上升沿对应A相高电平;A相下降沿对应B相高电平;B相下降沿对应A相低电平
|
||||||
|
|
||||||
|
此时旋转方向为正向。
|
||||||
|
|
||||||
|
相应地:
|
||||||
|
|
||||||
|
旋转方向为反向时,B相上升沿对应A相低电平 -> A相上升沿对应B相高电平 -> B相下降沿对应A相高电平 -> A 相下降沿对应B相低电平。
|
||||||
|
|
||||||
|
3.1.4 测试代码 实现4倍频
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <Arduino.h>
|
||||||
|
#define Phase_A 2
|
||||||
|
#define Phase_B 3
|
||||||
|
|
||||||
|
unsigned long time;
|
||||||
|
long Position = 0;
|
||||||
|
|
||||||
|
boolean A = false;
|
||||||
|
boolean B = false;
|
||||||
|
//定义A相引脚
|
||||||
|
//定义B相引脚
|
||||||
|
|
||||||
|
void Interrupt_A(){
|
||||||
|
if(A == false){
|
||||||
|
if( B == false){Position = Position + 1;A = true;}
|
||||||
|
else{Position = Position - 1;A = true;}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if( B == false){Position = Position - 1;A = false;}
|
||||||
|
else{Position = Position + 1;A = false;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Interrupt_B(){
|
||||||
|
if(B == false){
|
||||||
|
if( A == false){Position = Position - 1;B = true;}
|
||||||
|
else{Position = Position + 1;A = true;}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if( A == false){Position = Position + 1;B = false;}
|
||||||
|
else{Position = Position - 1;B = false;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
pinMode(Phase_A, INPUT_PULLUP);//内部上拉,防止信号干扰
|
||||||
|
pinMode(Phase_B, INPUT_PULLUP);
|
||||||
|
attachInterrupt(0, Interrupt_A, CHANGE);//检测上升沿、下降沿
|
||||||
|
attachInterrupt(1, Interrupt_B, CHANGE);//检测上升沿、下降沿
|
||||||
|
Serial.begin(115200); //初始化Arduino串口
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){
|
||||||
|
time = millis();
|
||||||
|
if(time%30 == 0){
|
||||||
|
Serial.println(Position,DEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
与文档中的代码不一样,在Interrupt_A()和Interrupt_B()中,更新A/B相信号的代码中使用了‘==’,实际上应该是赋值语句,所以改为了‘A=true’。除此之外,将这两个处理信号的函数设置在setup()之前,保证程序正常编译。
|
||||||
|
|
||||||
|
![image-20241024181003880](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410241810948.png)
|
||||||
|
|
||||||
![{5AA73C5D-0E01-45d3-8597-174674DD57FE}](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410231945949.png)
|
![{5AA73C5D-0E01-45d3-8597-174674DD57FE}](https://raw.githubusercontent.com/wwjiefei/pictureBed/main/202410231945949.png)
|
||||||
|
|
||||||
然后,发现库可以正常调用了:
|
然后,发现库可以正常调用了:
|
||||||
|
|
Loading…
Reference in New Issue