|
| 1 | +# 智能车机械臂控制教程 |
| 2 | +--- |
| 3 | +>该教程无法涵盖小车机械臂控制调试过程中出现的所有情况。 |
| 4 | +如果按照该教程无法复现结果,或者对其他内容有任何疑问,欢迎在@第二届具身智能挑战赛FAQ 里提出 |
| 5 | + |
| 6 | +>本篇教程以thuei-1/sdk-python/Functions/ColorSorting.py为例, |
| 7 | +帮助大家在跑通程序的同时理解机械臂控制的基本机制 |
| 8 | + |
| 9 | +## 预先准备 |
| 10 | +--- |
| 11 | + |
| 12 | +### 首先一定检查是否做好以下操作: |
| 13 | +--- |
| 14 | + |
| 15 | +1. 小车的硬件连接**正确无误且稳固** |
| 16 | +(猜猜是谁被杜邦线连接不牢硬控一晚上); |
| 17 | + |
| 18 | +>出现形如`Input/output error`的报错,极可能是硬件的问题,具体见下文“常见问题” |
| 19 | +
|
| 20 | +2. 拓展板和香橙派都是开启状态(香橙派亮两个黄灯,拓展板亮红灯) |
| 21 | + |
| 22 | + |
| 23 | +### 香橙派连接,激活conda环境 |
| 24 | +--- |
| 25 | + |
| 26 | +1. 使用vscode的remote-ssh/MobaXTerm的Session/HDMI连接香橙派 |
| 27 | + |
| 28 | +2. 确保以sudo权限(即root用户访问):打开香橙派的终端,如果显示 |
| 29 | + ``` |
| 30 | + (base) HwHiAiUser@orangepiaipro-20t: |
| 31 | + ``` |
| 32 | + 则在终端输入:`sudo -i`,此时可以看到终端显示为 |
| 33 | + ``` |
| 34 | + (base) root@orangepiaipro-20t: |
| 35 | + ``` |
| 36 | + >当然,如果原先使用ssh连接,使用`root@xxx.xxx.xx.xxx`而非`HwHiAiUser@xxx.xxx.xx.xxx`,就不存在此问题 |
| 37 | +
|
| 38 | +3. 确保已经克隆thuei-1的代码到香橙派上(已经克隆过的同学可以跳过此步骤) |
| 39 | + #### 关于如何将github上的仓库clone到本地/远程连接的设备 |
| 40 | + --- |
| 41 | + 1. 进入想要克隆的仓库;例如现在我们想要克隆的是[科协的thuei-1仓库](https://github.com/thuasta/thuei-1) |
| 42 | + 2. 点击仓库右上方的绿色图标`<> code`,在http一栏下复制仓库的web URL字符串;例如`https://github.com/thuasta/thuei-1.git`(选用ssh一栏的URL下载更快,但前提是你的设备已经保管有ssh-key) |
| 43 | +  |
| 44 | + 3. 回到你希望克隆到的设备的终端,进入到你希望放置仓库的路径下;此处,因为上一步中我们以root用户访问,所以现在只需要在终端输入`cd ~`,回到root目录下。或者,你也可以右键左边栏的root文件夹,选择`Open in Integrated Terminal`,直接打开一个位于root文件夹的终端 |
| 45 | + 4. 输入`git clone [URL_that_you_have_copied]`;例如此处我们输入: |
| 46 | + ``` |
| 47 | + git clone https://github.com/thuasta/thuei-1.git |
| 48 | + ``` |
| 49 | + 5. 显示`Cloning into 'thuei-1'...`等待文件传输好即可 |
| 50 | +
|
| 51 | +
|
| 52 | +4. 激活masterpi的环境,输入`conda activate masterpi`,可以看到如下变化: |
| 53 | +
|
| 54 | + ``` |
| 55 | + (base) root@orangepiaipro-20t:~# conda activate masterpi |
| 56 | + (masterpi)root@orangepiaipro-20t:~# |
| 57 | + ``` |
| 58 | + 如果输出形如`EnvironmentNameNotFound`的提示,则需要先创建masterpi环境: |
| 59 | + ``` |
| 60 | + (base) root@orangepiaipro-20t:~# conda create -n masterpi --copy base |
| 61 | + ``` |
| 62 | + 然后按照上文方式激活这个环境 |
| 63 | +
|
| 64 | +>关于环境管理的知识点,可以回看[培训文档第三讲](https://github.com/thuasta/thuei-2/blob/main/%E5%9F%B9%E8%AE%AD%E6%96%87%E6%A1%A3/3_Camera%20and%20Ultrasound/L3.md) |
| 65 | +
|
| 66 | +### 打开可视化界面 |
| 67 | +--- |
| 68 | +
|
| 69 | +>如果原先使用vscode或者MobaXTerm连接香橙派,请按照如下步骤打开tightvnc,原先使用HDMI则可以跳过此步骤。 |
| 70 | +>Tightvnc的安装,依旧参考[第三讲](https://github.com/thuasta/thuei-2/blob/main/%E5%9F%B9%E8%AE%AD%E6%96%87%E6%A1%A3/3_Camera%20and%20Ultrasound/L3.md)(给第三讲ljgg加鸡腿) |
| 71 | +
|
| 72 | +1. 在香橙派终端输入以下指令: |
| 73 | +``` |
| 74 | +# 杀掉可能原先存在的会话 |
| 75 | +vncserver -kill :1 |
| 76 | +# 启动新的VNC服务器会话,指定显示编号为1(显示在5901端口)、分辨率为1920×1080像素 |
| 77 | +vncserver :1 -geometry 1920x1080 |
| 78 | +``` |
| 79 | +2. 打开TightVNC Viewer,Remote Host填[香橙派ip]:1(如下图所示),输入密码(第三讲中推荐设为123456),进入会话界面 |
| 80 | +  |
| 81 | +>如果Viewer会话中途出现卡顿乃至死机,请返回vscode/MobaXTerm,在香橙派终端杀掉会话,重新开启VNC。 |
| 82 | +
|
| 83 | +
|
| 84 | +## 运行Demo |
| 85 | +--- |
| 86 | +
|
| 87 | +1. 在可视化界面(TightVNC Viewer or HDMI显示器)安装路径打开文件夹:`~\thuei-1\sdk-python\Functions` |
| 88 | +右键空白处新建终端 |
| 89 | +2. 再次激活masterpi环境 |
| 90 | + ``` |
| 91 | + conda activate masterpi |
| 92 | + ``` |
| 93 | +3. 运行程序 |
| 94 | + ``` |
| 95 | + python3 ColorSorting.py |
| 96 | + ``` |
| 97 | + 如果程序正常运行,在终端可以看到: |
| 98 | + ``` |
| 99 | + ColorSorting Init |
| 100 | + ColorSorting Start |
| 101 | + ``` |
| 102 | + 同时弹出摄像头窗口。 |
| 103 | + 将积木放置在摄像头拍摄范围内,物体被彩色框框选,机械臂抓取积木并分拣到对应位置。 |
| 104 | +
|
| 105 | +4. 该系统采用了**双线程**架构: |
| 106 | +- 主线程运行`run()`函数,负责图像处理和颜色检测 |
| 107 | +- 子线程运行`move()`函数,监听颜色检测结果,并控制机械臂执行完整的抓取-放置动作序列 |
| 108 | +- 子线程在程序加载时就创建并启动,同时__isRunning 控制子线程是否实际执行操作 |
| 109 | +
|
| 110 | +
|
| 111 | +
|
| 112 | +## 常见问题 |
| 113 | +--- |
| 114 | +
|
| 115 | +1. 运行ColorSorting.py(或者其他程序)时终端报错: |
| 116 | +
|
| 117 | +``` |
| 118 | +OSError: [Errno 5] Input/output error |
| 119 | +``` |
| 120 | +
|
| 121 | +这大概率是硬件上的问题,请检查: |
| 122 | +
|
| 123 | +1. 小车底部电池电量充足,电池壳上的开关为开 |
| 124 | +2. 拓展板开关在on挡且指示灯亮 |
| 125 | +3. 各个接头(尤其是三根杜邦线)连接正确且良好(参考[板子安装教程](https://github.com/thuasta/thuei-2/blob/main/%E5%9F%B9%E8%AE%AD%E6%96%87%E6%A1%A3/0_%E5%B0%8F%E8%BD%A6%E5%AE%89%E8%A3%85/2-%E5%B0%8F%E8%BD%A6%E5%AE%89%E8%A3%85.pdf)) |
| 126 | + |
| 127 | +**如果依然无法避免报错,有可能是杜邦线公头与开发板排针母座之间的*插接配合松动*,导致I2C通信信号中断,可以尝试拆除并更换杜邦线。** |
| 128 | +
|
| 129 | +2. 运行ColorSorting.py时终端报错: |
| 130 | +``` |
| 131 | +AttributeError: module 'Board' has no attribute xxx |
| 132 | +``` |
| 133 | +这里的xxx可能是PixelColor或者set_rgb等等,请**一并注释掉**ColorSorting.py中所有包含`rgb`、`buzzer`字样的代码行。这些代码与拓展板RGB灯和蜂鸣器有关,我们用不到它们。 |
| 134 | +
|
| 135 | +## 机械臂控制的代码结构 |
| 136 | +--- |
| 137 | +
|
| 138 | +### **整个小车的机械臂控制由以下三个从简单到复杂的功能(包)实现:** |
| 139 | +
|
| 140 | +1. 基本运动控制 |
| 141 | + - 夹爪舵机以及四个机械臂关节舵机的**分离控制** |
| 142 | + - 夹爪舵机和四个舵机的servo_id依次是:1,3,4,5,6 |
| 143 | + - 由thuei-1\sdk-python\HiwonderSDK\Board.py中的setPWMServoPulse(servo_id, pulse = 1500, use_time = 1000)实现精确控制 |
| 144 | +2. 高级运动控制 |
| 145 | + - 由thuei-1\sdk-python\ArmIK中文件实现整合机械臂**整体运动**控制以及逆运动学计算 |
| 146 | + - thuei-1\sdk-python\ArmIK\ArmMoveIK.py中关键函数接口: |
| 147 | + ``` |
| 148 | + def setPitchRangeMoving(self, coordinate_data, alpha, alpha1, alpha2, movetime = None) |
| 149 | + #给定坐标coordinate_data和俯仰角alpha,以及俯仰角范围的范围alpha1, alpha2,自动寻找最接近给定俯仰角的解,并转到目标位置 |
| 150 | + ``` |
| 151 | +3. 接口应用 |
| 152 | + - thuei-1\sdk-python\Functions中的ColorSorting.py ColorDetect.py都有应用机械臂控制,调用的接口既有setPWMServoPulse(),也有setPitchRangeMoving()。 |
| 153 | +
|
| 154 | + 应用层 (ColorSorting.py,CubeCatchByDigits.py) |
| 155 | + ↓ 调用 |
| 156 | + 高级接口层 (ArmMoveIK.py) |
| 157 | + ↓ 调用 |
| 158 | + 逆运动学计算层 (InverseKinematics.py) |
| 159 | + ↓ 使用 |
| 160 | + 坐标变换层 (Transform.py) |
| 161 | + ↓ 输出到 |
| 162 | + 底层硬件控制 (Board.py) |
| 163 | + |
| 164 | +
|
| 165 | +>**最后,祝大家比赛顺利!** |
0 commit comments