CakeRobot - 一款支持 C#、Arduino 和 Kinect 的手势跟随机器人






4.98/5 (15投票s)
CakeRobot 是一款由手势驱动的机器人,可以根据你的手部动作进行移动。
在过去的几个周末,我花了一些时间构建了一个可以使用 Kinect 控制的简单机器人。你可以在下面看到它的实际操作。
- 源代码:在 Github 上 - Fork 一份 尽情玩耍吧!
前言
自从我 阅读了思科的一篇论文,其中提到物联网将创造高达 14.4 万亿美元的价值 以来,我重燃了对业余电子学的兴趣,并开始捣鼓 Arduino 和 Raspberry Pi 等 DIY 主板。这很有趣,最终就诞生了这个机器人。这篇帖子将提供通用步骤,而 GitHub 代码可以帮助你构建自己的机器人。
即使你没有 Kinect 作为控制器,你也可以轻松地使用你的手机(Windows Phone/Android/iOS)组装一个控制器,因为我们使用蓝牙与控制器和机器人进行通信。感谢我最小的孩子在下面的视频中提供的背景尖叫音效,她当时正追着机器人踢它。
在这里观看视频
现在,这是一个快速入门指南,教你如何构建自己的机器人。在这个例子中,我们有一个运行在笔记本电脑上的应用程序,它通过蓝牙与机器人通信,并根据 Kinect 的输入发送命令。你也可以轻松地构建一个手机界面。
如果你已经明白了,这是代码 – 你可以继续阅读以构建硬件部分。
1 – 熟悉基础知识
你需要对 Arduino 和/或 Netduino 有一定的了解——在这个例子中,我将使用 Arduino。
Arduino
探索 Arduino。最好的方法是:
-
- 下载并安装 Arduino IDE:http://arduino.cc/en/Main/Software
- 学习 Arduino 教程:https://learn.sparkfun.com/tutorials/what-is-an-arduino
- 购买一块 Arduino 板来玩——如果你在美国,可以尝试 Spark Fun;如果你在印度,可以尝试 Rhydolabz;如果你在其他国家,请自行搜索。
你主要需要了解 Arduino 板上的引脚。你可以使用 Arduino IDE 编写简单的程序(尝试 IDE 中的 Blink 示例来闪烁一个 LED:文件 -> 示例)。下方是来自 SparkFun 网站的引脚说明。
-
- GND (3):‘Ground’ 的缩写。Arduino 上有几个 GND 引脚,都可以用来接地。
- 5V (4) & 3.3V (5):5V 引脚提供 5 伏电压,3.3V 引脚提供 3.3 伏电压。大多数简单的 Arduino 组件都可以很好地运行在 5V 或 3.3V 下。如果不确定,可以查看 Spark Fun 的 数据手册教程,然后查找你使用的元件的数据手册。
- Analog (6):“Analog In” 标签下的引脚区域(UNO 板上的 A0 到 A5)是模拟输入引脚。这些引脚可以读取模拟传感器的信号(例如 温度传感器),并将其转换为我们可以读取的数字值。
- Digital (7):模拟引脚对面是数字引脚(UNO 板上的 0 到 13)。这些引脚可用于数字输入(例如判断按钮是否被按下)和数字输出(例如驱动 LED)。
- PWM (8):你可能已经注意到了一些数字引脚旁边的波浪线 (~)(UNO 板上的 3、5、6、9、10 和 11)。这些引脚可以作为普通数字引脚,但也可以用于一种称为脉冲宽度调制 (PWM) 的功能。我们有一个 关于 PWM 的教程,但目前,你可以将这些引脚视为能够模拟模拟输出(例如让 LED 逐渐亮起和熄灭)。
- AREF (9):代表 Analog Reference(模拟参考)。大多数情况下,你可以忽略这个引脚。它有时用于设置一个外部参考电压(0 到 5 伏特)作为模拟输入引脚的上限。
Kinect
-
- 如果你计划使用 Kinect 作为控制器,请下载并安装 Kinect SDK:http://www.microsoft.com/en-us/kinectforwindowsdev/default.aspx – 我使用的是 SDK 1.7
- Kinect 操作视频在此
协议
-
- 了解一些蓝牙协议知识:http://en.wikipedia.org/wiki/Bluetooth
2 – 获取组件
你可以在线商店购买这些组件。你也可以尝试附近的本地电子商店,购买一些面包板、跳线(准备一些公对公和母对母的线)等。以下是构建 CakeRobot 所需的组件列表。
- 底盘 – 我使用的是 Dagu Magician Chassis – 来自 Spark Fun,Rhydolabz – 它配有两个步进电机,可以由我们的驱动板控制。
- 带电机驱动的 Arduino 板 – 我使用的是 Dagu Mini Motor Driver – 在印度的 Rhydolabz 购买。在其他国家,你需要自行搜索查找。关于这块板子的更多描述 可以在这里找到 – 它还有一个特殊的插槽用于插入 dagu 蓝牙盾。你也可以使用 Micro Magician
- 你还需要一根 Micro USB 线来连接你的 PC 和电机驱动板以上传代码。
- 蓝牙盾 – 如果能找到 Dagu 蓝牙模块就购买它。我从 Rhydolabz 购买了一个 Class 2 Rn 42 蓝牙盾
- 几个 迷你模块化面包板
- 跳线 – 购买一个混合包装,包含公对公、母对母、公对母的线——就像这样
- 一台用于你的 PC/笔记本电脑的小型蓝牙适配器,就像这样,用于与机器人上的蓝牙盾通信(如果你没有内置蓝牙)。
- 一些传感器,如果你想玩得更开心——在我最终版本中,我使用了一个 超声波距离传感器 来避免碰撞。一个更好的选择是 Ping 传感器。
- 一个电池组和电池盒,应为 Mini Motor Driver 提供约 6V 的电压
- 其他组件,供你日后发挥创意/探索
- LED
- 电阻
- 更多传感器
- 工具
- 几把十字螺丝刀
- 强力胶带/橡皮筋(是的,我们正在原型开发,目前不进行焊接)
我发现这些资料很有用:
3 – 对组件进行编程
你需要花一些时间弄清楚如何对每个组件进行编程。
- 首先,尝试使用 Arduino,连接 LED、开关等。然后,了解一些关于数字和模拟引脚编程的知识。可以 玩玩示例。
- 如果你有超声波传感器,尝试使用 Arduino 通过串口套接字对其进行编程。如果你使用的是 Ping 传感器,请查看此教程。
- 尝试对蓝牙模块进行编程(我在下面的示例中使用了距离传感器和蓝牙模块的代码,但如果你能自己弄清楚会很棒)。
4 – 将组件组装在一起
组装 Dagu Magician Chassis,并将 mini motor driver 和蓝牙模块放置/拧/安装在上面。根据需要使用跳线/插件连接组件。下面是一个高层示意图。
这是我机器人的低分辨率俯视图。
5 – 编写 Arduino Mini Driver 代码
你可以在 Github 仓库 中探索完整的代码——不过,这里有一些要点。根据 Dagu Arduino Mini driver 的规格,以下数字引脚可用于控制电机:
- D9 是左电机速度
- D7 是左电机方向
- D10 是右电机速度
- D8 是右电机方向
要使电机移动,首先需要通过对方向引脚执行 HIGH 或 LOW(正转/反转)的 `digitalWrite` 来设置方向。然后通过对速度引脚执行 0~255 的 `analogWrite` 来设置电机速度。0 表示停止,255 表示全速。
在 Arduino 代码中,我们通过蓝牙初始化通信,以接受字符串形式的命令。例如,`speedl 100` 将左电机速度设置为 100,`speedr 100` 将右电机速度设置为 100。相关代码如下。
//Setting up the communication with Bluetooth shield over serial Serial.begin(115200); // rn42 bt .......more //Read the input In getSerialLine (shortened for brevity) while(serialIn != '\n') { if (!(Serial.available() > 0)) { return; } serialIn = Serial.read(); if (serialIn!='\n') { char a = char(serialIn); strReceived += a; } } ....more //Process the command (shortened for brevity) .... else if (command=="speedl") { val=getValue(input,' ',1).toInt(); analogWrite(leftMotorSpeed,val); } else if (command=="speedr") { val=getValue(input,' ',1).toInt(); analogWrite(rightMotorSpeed,val); } ......more
查看这个快速 Arduino 客户端的完整代码。然后,编译并将代码上传到你的 mini driver 板。
6 – 编写控制器和 Kinect 代码
本质上,我们只是在跟踪骨骼框架,并计算你的手部距离臀部的距离,以提供电机的方向和速度。骨骼跟踪 详情在此
我们利用 http://32feet.codeplex.com/ 来识别蓝牙盾并发送命令。请确保你的蓝牙盾已与你的 PC/笔记本电脑/手机配对——通常可以在 Windows 系统托盘中点击蓝牙图标,然后点击“添加设备”来完成。
//For each 600 ms, send a new command //_btCon is our instance variable for a blue tooth connection, built over the cool 32Feet library internal void ProcessCommand(Skeleton skeleton) { var now = DateTime.Now; if (now.Subtract(_prevTime).TotalMilliseconds < 600) return; _prevTime = DateTime.Now; Joint handRight = skeleton.Joints[JointType.HandRight]; Joint handLeft = skeleton.Joints[JointType.HandLeft]; Joint shoulderRight = skeleton.Joints[JointType.ShoulderRight]; Joint shoulderLeft = skeleton.Joints[JointType.ShoulderLeft]; Joint hipLeft = skeleton.Joints[JointType.HipLeft]; Joint hipRight = skeleton.Joints[JointType.HipRight]; Joint kneeLeft = skeleton.Joints[JointType.KneeLeft]; if (handRight.Position.Y < hipRight.Position.Y) { _btCon.SetSpeed(Motor.Left, 0); } if (handLeft.Position.Y < hipLeft.Position.Y) { _btCon.SetSpeed(Motor.Right, 0); } if (handRight.Position.Y > hipRight.Position.Y) { var speed = (handRight.Position.Y - hipRight.Position.Y) * 200; if (speed > 230) speed = 230; _btCon.SetSpeed(Motor.Left, (int)speed); } if (handLeft.Position.Y > hipLeft.Position.Y) { var speed = (handLeft.Position.Y - hipLeft.Position.Y) * 200; if (speed > 230) speed = 230; _btCon.SetSpeed(Motor.Right, (int)speed); } }
因此,它会根据你的手部动作设置速度。探索我编写的 ConnectionHelper 和 BluetoothConnector 类。
结论
代码在这里 Github 上。Fork 一份 尽情玩耍,并扩展它。