零差云控 ZeroErr eRob 电机 CAN、CANopen、EtherCAT、ROS2 机器人开发详细教程
系列文章目录
前言
eRob 实验室
可靠的运动,边界应用 - 欢迎访问 eRob 实验室易于使用
eRob 驱动器和演示与多协议集成,适用于各种平台。开箱即用
在不同平台上提供开箱即用的 eCoder 开发演示。由人工智能平台提供支持
结合人工智能平台,快速开发您的机器人。
一、欢迎访问 eRob Lab
eRob Lab 致力于让机器人技术更简单、更易用、更高效。我们的使命是提供尖端的机器人解决方案,专注于硬件和软件创新。无论您是机器人爱好者、开发人员还是工程师,eRob Lab 都能提供一个全面的平台,让用户轻松设计、控制和优化机器人系统。
1.1 主要功能
- 先进的机器人解决方案:eRob Lab 提供各种机器人关节模块和控制系统,旨在满足自动化、协作机器人甚至医疗机器人等不同行业的需求。
- 人工智能集成: 我们整合人工智能功能,提高机器人系统的智能和功能,使其更加智能,更能适应现实世界的挑战。
- 用户友好型平台: 我们的目标是通过提供易于使用的工具和教程,简化复杂的机器人任务,确保任何人,无论其技术背景如何,都能轻松上手机器人技术。
- 开放社区:eRob 实验室相信社区驱动开发的力量。我们鼓励合作、分享想法和贡献,以加速机器人技术的发展。
加入 eRob Lab,让我们一起创新机器人技术的未来!
更多信息,请访问我们的官方网站。
二、eRob 驱动程序
有三种不同的通信协议可在不同平台上驱动 eRob: CAN、CANopen 和 EtherCAT。
2.1 硬件
eRob 集成了两个通信接口:一个是 CAN,另一个是 EtherCAT。CAN 接口主要用于关节调试,而 EtherCAT 作为主要通信方式,能够以最高 2000Hz 的频率运行控制循环,满足大多数行业的要求。在本示例中,我们将说明如何使用 TwinCAT3 通过 EtherCAT 协议在不同模式下驱动 eRob。
本开发套件支持国内外众多知名厂商的控制器,让您轻松克服机器人硬件和通信协议栈构建过程中遇到的问题,高效完成机器人应用开发。
2.1.1 硬件的主要连接方式
eRob 连接:
eRob:
ePower:
RJ45 Cable:
CAN modulator:
Cable:
eCoder:
2.2 TwinCAT3 (Windows)
2.2.1.1 简介
TwinCAT 3(Windows 控制与自动化技术)是 Beckhoff 提供的开发平台,可将任何兼容 PC 转变为实时控制系统,用于管理各种类型的工业自动化系统,如 PLC(可编程逻辑控制器)、运动控制、机器人等。
2.2.1.2 安装 TwinCAT3
安装过程可参考 Beckhoff 官方网站提供的安装指南。
提示:如果需要使用 C++ 进行开发,请注意以下几点:
安装顺序应为:先安装 Visual Studio;再安装 TwinCAT3:
2.2.2 将计算机连接到 eRob
eRob 连接:
连接方式可参考视频-->>链接。
2.2.3. 创建 TwinCAT 项目
2.2.3.1 ESI 文件的位置
eRob 的 XML(ESI)配置文件名为
ZeroErr Driver3.2.0.xml -->> 下载链接
Beckhoff TwinCAT3 的 XML (ESI) 文件路径如下: C:\TwinCAT\3.1\Config\Io\EtherCAT
2.2.3.2 在 TwinCAT 中创建新项目
创建新的 TwinCAT 项目后,第一步是确保 IP 地址连接正确。第二步是右击 “Devices”(设备),选择 “Scan”(扫描)选项,自动扫描设备。
如果系统无法识别驱动程序 1(ZeroErr 驱动程序),则需要使用以下方法安装并选择兼容设备:
检查兼容设备:
自动扫描设备后,为确保轴能正常移动,需要配置轴参数。配置过程可参考《eRob CANopen 和 EtherCAT 用户手册》v1.9 第 6 章。手册下载链接
2.2.3.3 参数配置
有必要对每个轴的参数进行配置,以确保正确的运动。
单元配置: 在左侧的导航目录中,进入 TwinCAT 项目 > NC-Task 1-SAF > Axes(轴) > Axis 1(轴 1)。
a. 点击右侧的设置选项卡。
b. 轴的理想单位。
Enc 参数配置 在左侧导航目录中,转至 TwinCAT 项目 > NC-Task 1-SAF(数控任务 1-SAF)> Axes(轴)> Axis 1 > Enc(编码器)。
a. 点击右侧的参数选项卡。
b. 单击 “编码器评估 ”箭头查看选项。可在离线值下更改缩放因子分母和分母值。将缩放因子分母和缩放因子分母均设为 1,即当主控处于 NC 轴控制下时,发送 1 个单位,从伺服移动 1 个编码器脉冲位置(加)。
激活参数 点击菜单栏 TwinCAT->激活配置,弹出提示框,点击 “确定”。在线值 "显示修改后的值。
运动参数配置
在左侧导航目录中转入 TwinCAT 项目 > NC-Task 1-SAF>Axes(轴)> Axis 1(轴 1)。
a. 点击右侧的 “Parameter(参数)”选项卡。
b. 点击 “最大动力”、“默认动力 ”和 “手动运动和定位 ”箭头查看选项。
c. 修改 “离线值 ”中的值。
监控参数配置 在左侧的导航目录中,进入 TwinCAT 项目 > NC-Task 1-SAF >Axes > Axis 1。
1)点击右侧的 Parameter(参数)选项卡。
2)点击监控箭头查看选项。
3)在离线值中修改监控。
激活参数 点击菜单栏 TwinCAT->激活配置,弹出提示框,点击确定。在线值显示修改后的值。
2.2.3.4 PDO 配置
本节基于 Beckhoff 的 TwinCAT3master 对 PDO 进行动态配置的具体操作步骤如下。
在同步管理器输入和输出的 PDO 分配窗口中可以看到循环数据。默认 PDO 设置使用动态 PDO:“0x1600- RxPDO 映射参数,0x1A00-TxPDO 映射参数”。
TxPDO 配置: 选择所需的 TxPDO(0x1A00) 并在 PDO 内容窗口中单击右键,即可更改 TxPDO 映射。可以更改或删除现有条目,也可以在现有条目之间插入新条目或在末尾添加新条目。
3.显示可映射对象列表。该列表仅显示可按更改映射方向映射的对象。例如,尝试在输入 PDO 0x1A00 上插入对象时,只会显示可从从属驱动器映射到主控制器的对象。
插入的对象将显示在 PDO 内容 (0x1A00) 中。
选择所需的 RxPDO(0x1600) 并在 PDO 内容窗口中单击右键,即可更改 RxPDO 映射。可以更改或删除现有条目,也可以在现有条目之间插入新条目或将其添加到末尾。
显示可映射对象列表。该列表仅显示可按更改映射方向映射的对象。例如,尝试在输出 PDO 0x1600 上插入对象时,只会显示可从控制器映射到驱动器的对象。
插入的对象显示在 RxPDO 内容 (0x1600) 中。
当 PDO 映射发生变化时,TwinCAT 会自动更新启动脚本,并在 PREOP 到 OP 转换期间发送给从动驱动器。DSP402 标准条目的自动链接仅适用于使用标准对象的轴。DSP402 标准条目的自动链接仅适用于使用标准对象的轴,对于其他操作模式,则必须手动链接 PDO。
2.2.3.5 运动控制
必须在 “SM-同步 ”或 “DC-同步 ”之间选择 EtherCAT 接口的运行模式。本例中选择 “DC-同步”。
单击激活配置激活配置
单击是。
双击 Driver1(ZeroErr 驱动程序)。导航至 “NC-Online ”并单击启用菜单中的 “Set”(设置)。-> 单击 “All(全部)”设置启用
现在输入目标位置和目标速度,然后用 “F5 ”按钮将轴移动到目标位置。单击 “F1、F2、F3、F4 ”手动控制电机以快或慢的速度正转或反转。点击 "F8
2.2.4. PLC 编程
要使用 PLC 编程控制 eRob,必须了解 TwinCAT 中 NC 轴、PLC 轴和物理轴之间的关系。此外,对象字典和 NC 轴之间的映射关系可根据 Beckhoff 官方网站上提供的文档进行配置。
关系图仅供参考:
在此,需要深入了解 TwinCAT 的使用。如果需要,稍后将提供额外的配置说明,以确保使用 TwinCAT 的内置功能通过 PLC 轴连接 NC 轴来驱动 eRob。这里提供一个预先配置好的规划作为参考。
2.3 Python (Windows)
要使用 Python 连接 TwinCAT,可以利用 pyads 库,该库允许通过 ADS(自动化设备规范)协议与 TwinCAT 系统进行通信。通过该库,您可以直接从 Python 中读写变量、调用函数并与 TwinCAT 运行时交互。
以下是如何设置和使用 pyads 连接 TwinCAT:
我们提供了一个简单的演示。->>>连接
2.3.1. 安装 pyads
您可以使用 pip 安装 pyads 库:
pip install pyads
2.3.2. 为 ADS 通信配置 TwinCAT
在连接之前,请确保您的 TwinCAT 系统已配置为接受 ADS 通信:
获取 TwinCAT 设备的 AMS Net ID 和 IP 地址。
AMS Net ID 的格式通常为 x.x.x.x.x.1.1,其中 x.x.x.x 是 IP 地址。
您可以在 TwinCAT XAE 外壳中的系统 > AMS 路由器 > AMS Net ID 下找到它。
设置路由:
在 TwinCAT 系统中,为您的开发机器添加一条 ADS 路由。
使用 TwinCAT Remote Manager 或 TcAdmin 工具添加路由。
确保防火墙设置允许 ADS 通信。
2.3.3. 基本连接示例
下面是一个如何连接 TwinCAT 和读/写变量的示例:
import pyads
# Replace these with your actual AMS Net ID and IP address
PLC_AMS_NET_ID = '5.80.192.240.1.1'
PLC_IP_ADDRESS = '192.168.0.1'
# Establish a connection to the TwinCAT device
plc = pyads.Connection(PLC_AMS_NET_ID, pyads.PORT_TC3PLC1, PLC_IP_ADDRESS)
# Open the connection
plc.open()
# Read a variable from the PLC
# Assume there's a global variable named 'GVL.my_int_var' of type INT
value = plc.read_by_name('GVL.my_int_var', pyads.PLCTYPE_INT)
print(f"The value of 'GVL.my_int_var' is: {value}")
# Write a value to the PLC variable
plc.write_by_name('GVL.my_int_var', 42, pyads.PLCTYPE_INT)
print("Updated 'GVL.my_int_var' to 42.")
# Close the connection when done
plc.close()
解释:
pyads.Connection: 使用指定的 AMS Net ID、端口和 IP 地址创建连接对象。
AMS Net ID: TwinCAT 设备的唯一标识符。
pyads.PORT_TC3PLC1:TwinCAT 3 PLC 运行时 1 的默认端口。
plc.open(): 打开连接。
read_by_name(): 按名称读取 PLC 变量的值。
write_by_name():按名称读取 PLC 变量的值: 向 PLC 变量写入值。
plc.close(): 关闭连接: 关闭连接。
2.3.4. 读写不同的数据类型
pyads 支持各种 TwinCAT PLC 数据类型:
# Read a REAL variable
real_value = plc.read_by_name('GVL.my_real_var', pyads.PLCTYPE_REAL)
# Read a BOOL variable
bool_value = plc.read_by_name('GVL.my_bool_var', pyads.PLCTYPE_BOOL)
# Write to a STRING variable
plc.write_by_name('GVL.my_string_var', 'Hello TwinCAT!', pyads.PLCTYPE_STRING)
2.3.5. 读写数组
要读取或写入数组,请指定元素个数:
# Read an array of INTs with 10 elements
array_values = plc.read_by_name('GVL.my_int_array', pyads.PLCTYPE_ARR_INT(10))
# Write to an array of INTs
plc.write_by_name('GVL.my_int_array', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], pyads.PLCTYPE_ARR_INT(10))
2.3.6. 处理结构
对于结构,需要定义与 PLC 结构相匹配的 ctypes Structure:
import ctypes
# Define the structure in Python
class MyStruct(ctypes.Structure):
_fields_ = [
('int_var', ctypes.c_int16),
('real_var', ctypes.c_float),
('bool_var', ctypes.c_uint8),
]
# Read the structure
my_struct = plc.read_by_name('GVL.my_struct_var', MyStruct)
print(f"Structure values: {my_struct.int_var}, {my_struct.real_var}, {my_struct.bool_var}")
使用符号句柄 对于重复访问同一个变量,可以使用符号句柄来提高性能:
# Get a handle to the variable
handle = plc.get_handle('GVL.my_int_var')
# Read the variable using the handle
value = plc.read(handle, pyads.PLCTYPE_INT)
# Write to the variable using the handle
plc.write(handle, 100, pyads.PLCTYPE_INT)
# Release the handle when done
plc.release_handle(handle)
2.3.8. 错误处理
一定要包含错误处理功能来管理异常:
try:
plc.open()
# Perform read/write operations
except pyads.ADSError as err:
print(f"An ADS error occurred: {err}")
finally:
plc.close()
2.3.9. 资源和文档
pyads 文档:pyads.readthedocs.io
GitHub 存储库:GitHub 上的 pyads
TwinCAT 信息系统: Beckhoff 信息系统
2.3.10. 提示和最佳实践
确保网络连接: 您的 Python 环境和 TwinCAT 系统必须可以通过网络相互访问。
防火墙设置: 配置防火墙,允许在所需端口上进行 ADS 通信。
变量名称: 使用完全限定的变量名,必要时包括命名空间。
数据类型: 将 PLC 数据类型与适当的 pyads PLCTYPE 常量相匹配。
测试连接性: 使用 TwinCAT 的工具来验证路由是否设置正确,设备是否可以连接。
2.4 SOEM (Windows)
前提条件
1.Windows 操作系统: 64 位版本的 Windows 7、8、10 或更高版本。
2.Visual Studio: Microsoft Visual Studio 2017 或更新版本(社区版、专业版或企业版)。
3.WinPcap或Npcap: 一种数据包捕获库,允许应用程序绕过协议栈捕获和传输网络数据包。
系统内核同步不佳导致 ethercat 无法连续运行!
因此,除非能解决系统同步问题,否则不建议在 Windows 系统下运行。
步骤指南
2.4.1. 安装所需软件
a. 安装 Visual Studio
如果尚未安装 Visual Studio Community Edition,请下载并安装。
在安装过程中,确保包含 Desktop development with C++ 工作负载。
b. 安装 WinPcap 或 Npcap
WinPcap 已经过时,不再维护。建议使用 Npcap。
从官方网站下载 Npcap 并安装。
安装过程中,确保选择以下选项:
以 WinPcap API 兼容模式安装 Npcap
支持 WiFi 适配器的原始 802.11 流量(和监控模式)(如需要) 2.
2.4.2. 下载 SOEM 源代码
从 GitHub 克隆 SOEM 代码库:
git clone https://git.zeroerr.cn/Don/eRob_SOEM-windows
或者,从 SOEM GitHub 页面下载 ZIP 压缩包并解压缩。然后在电脑上解压缩。
2.4.3. 启动 Visual Studio 命令提示符
启动 Visual Studio 命令提示符(例如 VS 2017 的 x86 本地工具命令提示符):
cd "The path of SOEM file, e.g. D:\SOEM"
mkdir build
cd build
cmake .. -G "NMake Makefiles"
nmake
2.4.4. 运行 SOEM 主站
cd test/win32/simple_test
eRob_test.exe
它将打印出您的网络设备,包括您的 EtherCAT 设备。查找 EtherCAT 网络的以太网适配器并记下路径,例如 \Device\NPF_{A54146EA-CD6F-4A95-93E4-0919C4B2D685} 。
eRob_test.exe "\Device\NPF_{EFxxxxxxxxxxxxxx}" (your etherCAT device)
该规划可以使用 eRob 设备,但由于同步问题,长时间无法运行,希望开发人员能解决这个问题。
2.5 SOEM (Linux)
前提条件
开始之前,请确保您已具备以下条件:
Ubuntu 18\20\22 已安装在系统上。
步骤指南
2.5.1. 安装所需软件包
首先在你的 Ubuntu 系统上安装所需的依赖包:
sudo apt update
sudo apt install build-essential git libpcap-dev
libpcap-dev 对 SOEM 访问网络接口和处理 EtherCAT 帧至关重要。
2.5.2. 下载并构建 SOEM
克隆 SOEM 软件源并构建它:
git clone https://github.com/wdb-123/SOEM_eRob
mkdir build
cd build
cmake ..
make
sudo make install
这将在 Ubuntu 机器上下载、构建并安装 SOEM。
2.5.3. 验证网络接口
要通过 EtherCAT 驱动电机,必须确保连接到 EtherCAT 网络的网络接口配置正确。
使用以下命令列出所有网络接口
ifconfig
fconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet XXX.XXX.XXX.XXX netmask 255.255.252.0 broadcast XXX
inet6 XXXX:XXXX:XXXX:XXXX:XXXX prefixlen 64 scopeid 0x20<link>
ether XX:XX:XX:XX:XX:XX txqueuelen 1000 (Ethernet)
RX packets 12433221 bytes 3311308984 (3.3 GB)
RX errors 0 dropped 177668 overruns 0 frame 0
TX packets 1582150 bytes 313791056 (313.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
....
这里,eno1 是我的 EtherCAT 接口。
禁用 EtherCAT 接口上的 IP 栈:
sudo ifconfig eno1 down
sudo ifconfig eno1 up
将 eno1 替换为与 EtherCAT 网络连接的实际接口。
2.5.4. 检查 EtherCAT 网络
让我们检查一下 EtherCAT 网络,以确保 SOEM 和 EtherCAT 网络正常工作。
首先,检索机器上发现的以太网适配器列表。
cd ~/SOEM-master/build/test/linux/slaveinfo
sudo .\slaveinfo
SOEM (Simple Open EtherCAT Master)
Slaveinfo
Usage: slaveinfo ifname [options]
ifname = eth0 for example
Options :
-sdo : print SDO info
-map : print mapping
Available adapters
End program
现在再次使用以太网设备路径运行 slaveinfo,以列出在网络上发现了哪些 EtherCAT 从站控制器。您应该会看到与下面类似的信息,并检查这些细节是否符合您的环境。
cd ~/SOEM-master/build/test/linux/slaveinfo
sudo .\slaveinfo eno1
Slave:1
Name:simco drive 40028083-00-0
Output size: 48bits
Input size: 48bits
State: 4
Delay: 0[ns]
Has DC: 0
Activeports:1.1.0.0
Configured address: 1002
Man: 0000010a ID: 0262c7b3 Rev: 00010211
SM0 A:1000 L: 512 F:00010026 Type:1
SM1 A:1400 L: 512 F:00010022 Type:2
SM2 A:1800 L: 6 F:00010064 Type:3
SM3 A:1950 L: 6 F:00010020 Type:4
FMMU0 Ls:0000000a Ll: 6 Lsb:0 Leb:7 Ps:1800 Psb:0 Ty:02 Act:01
FMMU1 Ls:00000027 Ll: 6 Lsb:0 Leb:7 Ps:1950 Psb:0 Ty:01 Act:01
FMMUfunc 0:1 1:2 2:0 3:0
MBX length wr: 512 rd: 512 MBX protocols : 0c
CoE details: 27 FoE details: 01 EoE details: 00 SoE details: 00
Ebus current: 0[mA]
only LRD/LWR:0
PDO mapping according to CoE :
SM2 outputs
addr b index: sub bitl data_type name
[0x000A.0] 0x6040:0x00 0x10 UNSIGNED16 Controlword
[0x000C.0] 0x60FF:0x00 0x20 INTEGER32 Target Velocity
[0x0010.0] 0x0000:0x00 0x00
[0x0010.0] 0x0000:0x00 0x00
[0x0010.0] 0x0000:0x00 0x00
[0x0010.0] 0x0000:0x00 0x00
[0x0010.0] 0x0000:0x00 0x00
[0x0010.0] 0x0000:0x00 0x00
SM3 inputs
addr b index: sub bitl data_type name
[0x0027.0] 0x6041:0x00 0x10 UNSIGNED16 Statusword
[0x0029.0] 0x6064:0x00 0x20 INTEGER32 Position Actual Value
[0x002D.0] 0x0000:0x00 0x00
[0x002D.0] 0x0000:0x00 0x00
[0x002D.0] 0x0000:0x00 0x00
[0x002D.0] 0x0000:0x00 0x00
[0x002D.0] 0x0000:0x00 0x00
[0x002D.0] 0x0000:0x00 0x00
2.5.4. 运行 SOEM 主站
cd ~/SOEM-master/build/test/linux/simple_test
sudo .\eRob_test eno1
该规划将启用 eRob,稳定的运行需要系统的高度同步。
2.6 IGH EtherCAT (Linux)
EtherCAT 驱动程序 ROS2 协议栈
EtherCAT 为应用程序提供了在系统间进行可靠、实时通信的能力,因此是一种通用的工业标准。为了简化使用 EtherCAT 模块的新应用的开发/部署,该协议栈允许将这些模块与 ros2_control 结合使用。该驱动程序提供了一种通用方法,用于参数化和组装基于 EtherCAT 模块的硬件接口,这些硬件接口可使用参数文件进行定义。
项目 GitHub 代码库:ethercat_driver_ros2
快速入门
安装
前提条件
在开始安装之前,请确保您具备以下条件:
Ubuntu 20.04\22.04\24.04 已安装在系统上。
安装 EtherLab
拟议的开发基于IgH EtherCAT主站。安装步骤总结如下
验证是否可以运行未签名的内核模块 Etherlab 是一个默认未签名的内核模块。要允许内核加载未签名模块,需要禁用安全启动。
确认是否已启用安全启动(需要先安装“‘mokutil’”):
sudo apt-get install mokutil
mokutil --sb-state
就会打印出来:
SecureBoot disabled
如果打印出来了:
SecureBoot enabled
然后,您需要禁用安全启动。为此,请
重新启动计算机并进入 BIOS 设置。
在安全选项卡中,禁用安全启动。
保存并退出。
安装所需工具:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git autoconf libtool pkg-config make build-essential net-tools
为 EtherCAT 主站设置信号源:
git clone https://gitlab.com/etherlab.org/ethercat.git
cd ethercat
git checkout stable-1.5
sudo rm /usr/bin/ethercat
sudo rm /etc/init.d/ethercat
./bootstrap # to create the configure script
配置、构建和安装库和内核模块:
/configure --prefix=/usr/local/etherlab --disable-8139too --disable-eoe --enable-generic
make all modules
sudo make modules_install install
sudo depmod
配置系统:
$ sudo ln -s /usr/local/etherlab/bin/ethercat /usr/bin/
$ sudo ln -s /usr/local/etherlab/etc/init.d/ethercat /etc/init.d/ethercat
$ sudo mkdir -p /etc/sysconfig
$ sudo cp /usr/local/etherlab/etc/sysconfig/ethercat /etc/sysconfig/ethercat
提示
每次更新 Linux 内核时,都可能需要执行这 4 个步骤。在重新执行这 4 个步骤之前,可以尝试以下较轻的步骤:进入克隆 EtherCAT 项目的文件夹,在步骤 2(设置源代码)中执行以下操作
cd ethercat sudo rm /usr/bin/ethercat /etc/init.d/ethercat ./bootstrap
然后完全完成步骤 3(配置、构建和安装......)。从第 4 步(配置系统)开始运行:
sudo ln -s /usr/local/etherlab/bin/ethercat /usr/bin/ sudo ln -s /usr/local/etherlab/etc/init.d/ethercat /etc/init.d/ethercat
创建新的 udev 规则:
sudo gedit /etc/udev/rules.d/99-EtherCAT.rules
包含:
KERNEL=="EtherCAT[0-9]*", MODE="0666"
为 EtherCAT 配置网络适配器:
sudo gedit /etc/sysconfig/ethercat
在配置文件中指定要使用的网卡的 Mac 地址及其驱动程序
MASTER0_DEVICE="ff:ff:ff:ff:ff:ff" # mac address
DEVICE_MODULES="generic"
现在可以启动 EtherCAT 主站:
sudo /etc/init.d/ethercat start
应打印
Starting EtherCAT master 1.5.3 done
您可以检查已连接的从属设备:
ethercat slaves
它应打印所连接从属设备的信息:
$ <id> <alias>:<position> <device_state> + <device_name>
例如
0 0:0 PREOP + <device_0_name>
0 0:1 PREOP + <device_1_name>
构建 ethercat_driver_ros2
安装 ROS2 软件包。当前的开发基于 ROS2 Humble。安装步骤参见 ROS2 Humble 文档。
创建 ROS2` 环境:
source /opt/ros/humble/setup.bash
提示
ROS2 环境需要在每个使用的终端中都设置源代码。如果只使用一个 ROS2 发行版,可以将其添加到 ~/.bashrc 文件中。
安装 colcon 及其扩展:
sudo apt install python3-colcon-common-extensions
创建一个新的 ROS2 工作区:
mkdir ~/ros2_ws/src
调用相关软件包、安装依赖项、编译和使用源代码工作区:
cd ~/ros2_ws
git clone https://github.com/ICube-Robotics/ethercat_driver_ros2.git src/ethercat_driver_ros2
rosdep install --ignore-src --from-paths . -y -r
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --symlink-install
source install/setup.bash
2.7 CAN driver (Linux)
在 Linux 上安装 CAN 驱动程序
2.7.1. 检查 Linux 版本和系统类型(32/64 位)
运行以下命令检查 Linux 版本和系统类型:
uname -a
从输出结果可以看出,系统是 64 位的
Linux erobman 6.5.0-rt5 #1 SMP PREEMPT_RT Wed Oct 16 10:34:26
CST 2024 x86_64 x86_64 x86_64 GNU/Linux
2.7.2. 将相应的 USBCAN 驱动程序文件复制到系统中
确认系统类型后,将相应的 USBCAN 驱动程序文件复制到系统中。
(在本例中,将驱动程序文件放到 /home/eRob_CAN_driver/ 中)。
2.7.3. 获取管理员权限
要执行包括安装驱动程序在内的进一步操作,请获取管理员权限。
sudo su
(在 su 命令后输入 root 密码,以获得管理员访问权限)
2.7.4. 将驱动程序库复制到 GCC 编译目录
导航至 USBCAN 驱动程序文件夹,将 libusb.so、libusb-1.0.so 和 libECanVci.so.1 复制到 GCC 编译目录(默认路径为 /usr/lib)。
cp libusb.so libusb-1.0.so libECanVci.so.1 /usr/lib
2.7.5. 链接库
导航至 GCC 库文件夹,将 libECanVci.so.1 链接至 libECanVci.so。
ln -sv libECanVci.so.1 libECanVci.so
2.7.6. 编译 USBCAN 驱动程序
进入 USBCAN 驱动程序文件夹并编译驱动程序。
cd /your_file_path/linux64
make
2.7.7. 运行测试规划
运行测试规划以测试 USBCAN 传输。
./test
如果遇到以下错误,请安装所需的库:
sudo apt-get install libusb-0.1-4
提示
如果遇到以下错误,请安装所需的库:error while loading shared libaries: libusb-0.1.so.4: cannot open share ....
您可以通过 :
sudo apt-get install libusb-0.1-4
安装完成后,再次运行测试规划。如果成功,输出应如下所示:
第一个参数 16:
设备类型。单通道设备为输入 3,双通道为输入 4。
第二个参数 0:
设备索引。如果只连接了一个 USBCAN 设备,则输入 0。
第三个参数 3:
要打开的通道。输入 1 打开 CAN1,输入 2 打开 CAN2,输入 3 同时打开 CAN1 和 CAN2。
第四个参数 0x1400:
CAN 总线波特率。0x1400 表示 1000K 波特率。有关其他速率,请参阅 “EcanVCI 动态库手册”。
第五个参数 0:
运行模式。0 表示正常模式。有关其他模式,请参阅 “EcanVCI 动态库手册”。
第六个参数 1:
发送间隔(毫秒)。
第七个参数 1000:
发送次数。
2.7.8. 连接 USBCAN 设备
使用 lsusb 命令查看已连接的 USBCANI-V503。
运行测试(使用管理员权限):
./test 4 0 3 0x1400 2 0 3 1000
2.7.9. 为永久用户访问修改 Udev 规则
要永久授权普通用户访问 USBCAN 设备,请修改 udev 配置:
sudo gedit /etc/udev/rules.d/50-usbcan.rules
添加以下内容(根据 USB 的 ID 修改红色标记的值):
SUBSYSTEMS=="usb"
ATTRS{idVendor}=="0c66"
ATTRS{idProduct}=="000c"
GROUP="users"
MODE="0666"
重新加载 udev 规则并重新连接设备,以应用新权限:
sudo udevadm control --reload
2.7.10. 重新编译测试程序
以管理员权限重新编译测试程序,然后运行:
make
./test 4 0 3 0x1400 2 0 3 1000
至此,eRob 驱动程序的安装完成。
2.7.11. 编译并运行 eRobCAN 测试
进入 linux_test 文件夹,创建编译目录并编译程序:
mkdir build && cd build
cmake ..
make
编译后,您将看到三个可执行文件。
如果 USBCAN 设备无法工作,请尝试重新连接并运行以下命令:
./eRobCAN_sendCOB 0x641 "{01 00 00 00 00 01}"
如果返回值为 0x3e,则说明命令发送成功。
有关 CAN 报文命令,请参阅《eRunner 用户手册》: 下载链接
2.7.12.示例(速度模式)
下面是在速度模式下发送命令的示例:
./eRobCAN_sendCOB 0x641 "{00 4E 00 00 00 02}"
./eRobCAN_sendCOB 0x641 "{01 12 00 00 00 00}"
./eRobCAN_sendCOB 0x641 "{01 FD 00 00 00 00}"
./eRobCAN_sendCOB 0x641 "{00 88 00 00 75 30}"
./eRobCAN_sendCOB 0x641 "{00 89 00 00 75 30}"
./eRobCAN_sendCOB 0x641 "{01 FE 00 00 27 10}"
./eRobCAN_sendCOB 0x641 "{01 00 00 00 00 01}"
./eRobCAN_sendCOB 0x641 "{00 08}"
./eRobCAN_sendCOB 0x641 "{00 05 00 01}"
./eRobCAN_sendCOB 0x641 "{00 02}"
./eRobCAN_sendCOB 0x641 "{01 00 00 00 00 00}"
2.8 CANopen protocol (Linux)
CANopen 协议(Linux)
在 ROS2 中使用 CANopen 的综合指南 以下是在 ROS2 中使用 CANopen 驱动 eRob 的详细分步指南,包括 CAN 硬件建议。
2.8.1. 了解 CANopen 和 ROS2 的基础知识
CANopen 一种基于 CAN(控制器局域网)的高级通信协议,广泛应用于工业自动化、机器人控制等领域。它定义了设备之间的通信标准,包括节点管理、数据传输、同步等。ROS2:机器人操作系统的第二个版本,为机器人软件开发提供了一个模块化的分布式框架。它支持各种通信协议和中间件。
2.8.2. 环境设置
2.8.2.1 安装 ROS2
确保已安装 ROS2。下面是一个使用 ROS2 Humble 的示例:
# Source ROS2 environment
source /opt/ros/humble/setup.bash
# Create a workspace
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
source install/setup.bash
2.8.2.2 安装 CANopen 相关软件包
使用 ros2_canopen 软件包,它是 ROS2 中支持 CANopen 通信的主要软件包。
# Clone the ros2_canopen repository
cd ~/ros2_ws/src
git clone https://github.com/ros2-canopen/ros2_canopen.git
# Install dependencies
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
# Build the workspace
colcon build
source install/setup.bash
2.8.3. 硬件准备
兼容性: 确保硬件支持 SocketCAN,因为 ros2_canopen 依赖 SocketCAN 进行通信。驱动程序支持: 检查所选硬件是否具有良好的 Linux 驱动程序支持,尤其是对 SocketCAN 的支持。性能要求: 根据应用场景(如高频通信或多节点网络)选择适当的波特率和通道数。物理接口: 确认物理接口类型(如 USB、PCIe、SPI),确保与系统兼容。稳定性和可靠性: 对于工业应用,应选择经过验证的工业级硬件,以确保长期稳定运行。预算: 根据项目预算选择性价比高的硬件。初学者可选择 USBtin 或 CANtact 等价格较低、易于使用的选项。
2.8.4. 配置 CAN 接口
2.8.4.1 安装必要的驱动程序
根据所使用的 CAN 接口硬件,安装相应的驱动程序。例如,使用 SocketCAN:
sudo apt-get install can-utils
2.8.4.2 设置 CAN 接口
假设使用 can0 接口,请设置波特率(例如 500kbps):
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up
检查接口状态:
ifconfig can0
2.8.5. 配置 ros2_canopen
2.8.5.1 创建配置文件
在 ROS2 工作区中创建一个配置文件,用于定义 CANopen 网络参数和节点配置。
例如,创建 config/canopen_config.yaml:
canopen:
interface: can0
node_id: 1
bitrate: 500000
devices:
- node_id: 2
description: "Motor Controller"
# Additional device-specific configurations
- node_id: 3
description: "Sensor"
# Additional device-specific configurations
2.8.5.2 配置对象字典
CANopen 设备通过对象字典定义通信对象。确保每个设备的对象字典文件(通常为 .eds 或 .xdc 文件)配置正确,并在 ros2_canopen 配置中引用。
2.8.6. 启动 CANopen 节点
使用 ros2_canopen 提供的启动文件启动 CANopen 主节点:
ros2 launch ros2_canopen canopen_launch.py config:=<path_to_config_file>
例如
ros2 launch ros2_canopen canopen_launch.py config:=~/ros2_ws/src/your_package/config/canopen_config.yaml
2.8.7. 使用 ROS2 节点与 CANopen 设备通信
ros2_canopen 软件包提供了与 CANopen 设备交互的各种接口,包括
服务: 如节点管理、同步等。主题: 用于实时数据传输,如传感器数据、电机状态等。操作: 用于需要反馈和结果的操作,如位置控制。
2.8.7.1 示例 控制电机
假设电机控制器是节点 ID 为 2 的 CANopen 从站设备。您可以使用 ros2_canopen 提供的接口来发布目标位置:
# Publish target position to the motor controller
ros2 topic pub /motor_controller/target_position std_msgs/Float32 "data: 1.0"
2.8.7.2 示例 读取传感器数据
假设传感器是节点 ID 为 3 的 CANopen 从站设备,您可以订阅传感器数据主题:
ros2 topic echo /sensor/data
2.8.8. 故障排除
CAN 接口未启动: 确保 CAN 接口配置正确并处于 UP 状态。
节点 ID 冲突: 确保网络上的每个设备都有唯一的节点 ID。
对象字典配置不正确: 验证每个设备的对象字典文件是否正确,并与 ros2_canopen 配置相匹配。
通信问题: 使用 candump 工具检查 CAN 总线上的数据流:
candump can0
2.8.9. 参考文献
ros2_canopen GitHub 代码库
SocketCAN 官方文档
CANopen 协议规范
硬件供应商网站:
Peak Systems
Kvaser
IXXAT
BeagleBone
树莓派
社区论坛和支持:
ROS 论坛
CANopen 社区
摘要
按照上述步骤,您可以在 ROS2 中成功集成并使用 CANopen 与各种工业设备通信。选择合适的 CAN 接口硬件对系统的稳定性和性能至关重要。常见的选择包括 Peak Systems、Kvaser、IXXAT 等品牌的 SocketCAN 兼容设备,以及各种嵌入式开发板和工业级接口。根据具体的应用场景,您可能需要进一步调整配置文件和开发定制的 ROS2 节点,以满足特定要求。
如果在集成过程中遇到任何问题,建议参考相关文档、社区论坛或寻求开发人员支持。
三、eRob 开发人员
我们在此展示 eRob 开发项目,例如使用 MoveIt 控制 eRob 协作机器人,以及在 ROS2 平台上驱动 eRob。
3.1 Nvidia Isaac Sim
什么是 Isaac Sim?
Isaac Sim 是一个从头开始构建的软件平台,旨在为日益机器人化和自动化的世界提供支持。其目标是让您尽可能轻松地为真实的物理机器人设计、调整、训练和部署自主控制代理。[参考链接]
在 Windows 上安装 Nvidia Isaac Sim
您可以参考 Nvidia 网站安装 Isaac Sim 平台。
安装 Python 要求
成功安装 Isaac Sim 平台后,您可以导航到 Isaac Sim 目录。
例如,我的路径是 D:\Isaac_sim\OMNIVERSE\pkg\isaac-sim-4.1.0。
进入 Isaac Sim 目录后,需要启动终端并启动 Isaac Sim 自带的 Python 开发环境。
如果之后遇到软件包的依赖问题,可以按照以下步骤安装依赖包。
python.bat -m pip install pyads
python.bat -m pip install pyQT5
通过 Python 启动 Isaac Sim 并使用 eRob 的模型
您可以在此下载 eRob 的 usd 文件,并修改 Python 代码中的路径。
# Start Isaac Sim; required for Standalone mode
from omni.isaac.kit import SimulationApp
# Choose whether to run in headless mode
simulation_app = SimulationApp({"headless": False})
# Code execution
print("Simulation started")
# Load an existing scene
from omni.isaac.core.utils.stage import open_stage
#
file_path = "Your usd file path\\eRob_LLM_TC_MIN.usd"
open_stage(usd_path=file_path)
# Add a world
from omni.isaac.core import World
world = World()
# It's recommended by the official documentation to reset the world after adding objects
world.reset()
# Access a specific prim (primitive) at a given path
from omni.isaac.core.utils.prims import get_prim_at_path
prim = get_prim_at_path("/World/eROb110_ok/erob110h_i_SWG2/node_/mesh_/RevoluteJoint")
if not prim.IsValid():
print("Invalid prim")
else:
print("Valid prim")
# Set the target angular velocity for the RevoluteJoint
prim.GetAttribute("drive:angular:physics:targetVelocity").Set(0)
# Method 2: Using get_prim_property() function, with the first parameter as Prim path, and the second as attribute name
from omni.isaac.core.utils.prims import get_prim_property
# Delay function
import time
# Initialize start time
start_time = time.time()
delay_duration = 1.0 # Delay for 1 second
direction = 1
velocity_factor = 0
# Start rendering
while True:
# Retrieve pose and velocity attributes (placeholders)
# position, orientation = my_cube.get_world_pose()
# linear_velocity = my_cube.get_linear_velocity()
# prim = get_prim_at_path("/World/eRob3/Cylinder_01/RevoluteJoint")
# Get current time
current_time = time.time()
# Enable eRob rotation with acceleration and deceleration
if current_time - start_time >= 0.1 and direction == 1:
velocity_factor += 0.1
# Update start_time
start_time = current_time
if current_time - start_time >= 0.1 and direction == -1:
velocity_factor -= 0.1
# Update start_time
start_time = current_time
# Reverse direction if velocity factor reaches threshold
if abs(velocity_factor) >= 5:
direction = -direction
# Set velocity with speed limits
prim.GetAttribute("drive:angular:physics:targetVelocity").Set(velocity_factor * 10.0)
# Retrieve the angular target velocity and print it
angular_targetVelocity = prim.GetAttribute("drive:angular:physics:targetVelocity").Get()
print("drive:angular:physics:targetVelocity:", angular_targetVelocity)
print("\n")
# Step the simulation with rendering enabled
world.step(render=True)
3.2 MoveIt2
安装所需的依赖项
3.2.1. 在 Ubuntu 22.04 上安装 Preempt-RT 实时补丁程序
3.2.1.1 检查内核版本并安装必要的软件包
uname -a
3.2.1.2 安装必要的软件包
apt install autoconf automake libtool make libncurses-dev flex bison libelf-dev libssl-dev zstd net-tools
3.2.1.3 下载内核和补丁程序
https://mirrors.edge.kernel.org/pub/linux/kernel/
从链接下载 Linux 内核。找到你的版本--不是上面的小文件,向下滚动,找到以 “Linux ”开头的超过 100MB 的 Linux 内核文件。
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
从链接下载实时补丁。确保选择与内核版本相匹配的补丁。
3.2.1.4 提取并应用补丁
tar -zxvf linux-5.19.tar.gz
xz -d patch-5.19-rt10.patch.xz
cd linux-5.19/
patch -p1 < ../patch-5.19-rt10.patch
3.2.1.5 内核配置
make menuconfig
进入图形配置界面后,执行以下操作:
常规设置 -> 抢占模式 -> 完全抢占式内核(RT)
常规设置 -> 定时器子系统 -> 定时器刻度处理 -> 全 dynticks 系统
常规设置 -> 定时器子系统 -> 支持高分辨率定时器
处理器类型和功能 -> 定时器频率 -> 1000 HZ
记住保存并退出。
vi .config
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""
保存并退出。
3.2.1.6 编译和安装
make -j8`nproc`
完成后
make modules_install
make install
3.2.1.7 配置 GRUB 启动选项
vim /etc/default/grub
注释掉下面一行,以显示启动菜单:
GRUB_TIMEOUT_STYLE=hidden
调整超时值:
GRUB_TIMEOUT=5 # Timeout in seconds
更新 GRUB 配置:
update-grub
3.2.1.8 重新启动
1.9 测试
apt-get install rt-tests
cyclictest -t 5 -p 80 -i 1000
cyclictest 将在 5 秒钟内以最高优先级执行 1000 次循环测试,以测量 Linux 系统的实时性能。测试结束后,cyclictest 将输出有关测试结果的统计信息。
3.2.2. ROS2-Humble
只需学习 ROS2 文档,即可轻松安装: 谦卑
3.2.3. ROS2-Control
学习此链接即可轻松安装
3.2.4. MoveIt2
通过学习此链接可轻松安装
3.2.5. IGH-EtherCAT
3.2.5.1 安装 EtherLab
学习此链接即可轻松安装
3.2.5.2 安装 ethercat_driver_ros2
学习此链接即可轻松安装
3.2.6. ROS2_eRob_MoveIt
git clone https://github.com/wdb-123/ROS2_eRob_MoveIt
cd ROS2_eRob_MoveIt
colcon build
source ./install/seup.bash
ros2 launch erob_position_control demo.launch.py
3.3 与 eRob 聊天
使用英伟达 Isaac Sim 本地大型模型驱动 eRob 机器人
简介
本开发文档指导开发人员将本地部署的大规模机器学习模型与英伟达 Isaac Sim 仿真平台集成,以驱动 eRob 机器人执行自主任务。通过本指南,您将了解如何设置仿真环境、使用 Ollama 和 Llama3 配置大型模型接口,以及如何在仿真中实现机器人的自主控制。
前提条件
开始之前,请确保满足以下前提条件:
硬件要求:
配备英伟达™(NVIDIA®)图形处理器,最好支持 CUDA 11.x 或更高版本。
至少 16GB 内存。
足够的存储空间(建议 50GB 或更高)。
软件要求
操作系统 Windows 10 或更高版本。
NVIDIA Isaac Sim: 最新版本。
Ollama:已安装和配置。
Llama3 模型: 已下载并准备部署。
环境设置
安装 NVIDIA Isaac Sim
注册英伟达™(NVIDIA®)Omniverse:
访问 NVIDIA Omniverse 网站,创建账户并下载 Omniverse 启动器。
安装 Isaac Sim:
您可以访问英伟达™(NVIDIA®)网站安装 Isaac Sim 平台。
验证安装:
成功安装Isaac Sim平台后,请导航至Isaac Sim目录。例如,我的路径是 D:\Isaac_sim\OMNIVERSE\pkg\isaac-sim-4.1.0。
进入 Isaac Sim 目录后,需要打开终端并激活 Isaac Sim 提供的 Python 开发环境。如果之后遇到软件包依赖性问题,可以按如下步骤安装依赖性:
python.bat -m pip install pyads
python.bat -m pip install pyQT5
使用 Ollama 配置本地大型模型
安装 Ollama:
按照 Ollama 安装指南在本地计算机上安装 Ollama。
使用 Ollama 部署 llama3.1:latest 模型:
使用 Ollama 部署 Llama3.1 模型。
ollama deploy llama3.1:latest
等待部署过程完成。这可能需要几分钟时间,具体取决于您的网速和系统性能。
验证模型是否已成功部署并运行。
ollama list
你应该能在已部署模型的列表中看到 llama3.1:latest。
验证安装:
为确保 llama3.1:latest 模型已安装并正常运行,请执行一个简单的测试。
启动模型 如果尚未运行,请启动模型。
ollama run llama3.1:latest
与模型交互 使用 Ollama 界面向模型发送测试提示。
ollama prompt llama3.1:latest "Hello, how can you assist me today?"
将大型模型与 Isaac Sim 集成
导入 eRob 机器人模型
您可以在此下载 eRob 的 usd 文件,并修改 Python 代码中的路径。
# Start Isaac Sim; required for Standalone mode
from omni.isaac.kit import SimulationApp
# Choose whether to run in headless mode
simulation_app = SimulationApp({"headless": False})
# Code execution
print("Simulation started")
# Load an existing scene
from omni.isaac.core.utils.stage import open_stage
#
file_path = "Your usd file path\\eRob_LLM_TC_MIN.usd"
open_stage(usd_path=file_path)
# Add a world
from omni.isaac.core import World
world = World()
# It's recommended by the official documentation to reset the world after adding objects
world.reset()
# Start rendering
while True:
# Retrieve pose and velocity attributes (placeholders)
# position, orientation = my_cube.get_world_pose()
# linear_velocity = my_cube.get_linear_velocity()
# Step the simulation with rendering enabled
world.step(render=True)
开发大型模型界面
以下是启动本地大型模型的关键代码:
def get_model_output(prompt, conversation):
print("Interpreting command...")
context = """You are an AI assistant capable of chatting conversationally and controlling eRob based on commands.
For regular conversation, respond naturally.
For robot control commands, interpret and respond with specific parameter values in the exact format:
velocity=X
duration=Y
position=Z
continuous=True/False
angle=A
Only include parameters that are explicitly mentioned or directly inferred from the command.
Do not add any explanation or additional text.
For rotation commands, use the 'angle' parameter.
Example: 'rotate to 30 degrees' should be interpreted as 'angle=30'."""
recent_conversation = conversation[-3:]
for entry in recent_conversation:
context += f"{entry['role']}: {entry['content']}\n"
full_prompt = f"{context}\nHuman: {prompt}\nAssistant:"
try:
process = subprocess.Popen(
['ollama', 'run', 'llama3.1:latest', full_prompt],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding='utf-8',
errors='ignore'
)
stdout, stderr = process.communicate()
clean_output = re.sub(r'failed to get console mode.*\n?', '', stdout).strip()
return clean_output
except Exception as e:
print(f"Error running Ollama: {e}")
return None
我们提供了一个集成了大型模型的示例项目,仅供参考。
使用 TwinCAT3 启用 eRob Drive
操作: 运行 TwinCAT3,启用 eRob 机器人的驱动功能。
参考: 有关详细配置和驱动过程,请参阅 eRob_driver 中的 TwinCAT3 设置。
示例代码: 此处提供了一个示例代码库以供参考。
使用 Isaac Sim 的 python.bat 启动 gui_main.py
操作: 使用英伟达 Isaac Sim 提供的 python.bat 脚本启动 gui_main.py 例程。
目的:该脚本将初始化图形用户界面,并启动与 eRob 机器人交互的主控制循环。
安装所需的依赖项
操作 安装项目所需的 Python 依赖项。
命令
python.bat -m pip install XXX
注意:将 XXX 替换为项目所需的实际软件包名称。
更新代码中的文件路径
操作: 安装依赖项后,确保代码中的所有文件路径都指向项目目录中的正确位置。
命令:
python.bat your_project_path/gui_main.py
目的: 运行此命令将使用更新的路径执行 gui_main.py 脚本,使模拟和控制功能正常运行。
验证成功执行
结果: 执行成功后,将出现一个界面(如下图所示)。
互动: 现在,您可以通过对话框与本地大型模型进行交互。利用模型的理解能力来控制 eRob 机器人。
命令示例
设置速度 = 30000
能否返回位置 0?
设置速度 = 30000,持续 10 秒
半转
功能: 大型模型可解释这些指令,并自动输出相应指令来控制 eRob 机器人。
注:这是一个示例项目。若要完整实施,可能还需要更多改进和细节。
其他建议
测试和验证: 设置完成后,彻底测试每个组件,以确保 TwinCAT3、Isaac Sim 和 Ollama 托管的 Llama3 模型之间的无缝集成。
日志和监控: 在脚本中实施日志记录,以监控模型与机器人之间的交互。这有助于排除故障和优化性能。
文档: 根据配置、依赖关系或工作流程中的任何变化随时更新文档,以保持未来开发的清晰度。
安全性: 确保任何 API 端点或本地服务(如 Ollama)的安全,以防止未经授权的访问,尤其是在系统将用于生产环境的情况下。