65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (15投票s)

2013 年 10 月 22 日

CPOL

7分钟阅读

viewsIcon

36308

CakeRobot 是一款由手势驱动的机器人,可以根据你的手部动作进行移动。

在过去的几个周末,我花了一些时间构建了一个可以使用 Kinect 控制的简单机器人。你可以在下面看到它的实际操作。

  • 源代码:在 Github 上 - Fork 一份 尽情玩耍吧!

前言

自从我 阅读了思科的一篇论文,其中提到物联网将创造高达 14.4 万亿美元的价值 以来,我重燃了对业余电子学的兴趣,并开始捣鼓 Arduino 和 Raspberry Pi 等 DIY 主板。这很有趣,最终就诞生了这个机器人。这篇帖子将提供通用步骤,而 GitHub 代码可以帮助你构建自己的机器人。

即使你没有 Kinect 作为控制器,你也可以轻松地使用你的手机(Windows Phone/Android/iOS)组装一个控制器,因为我们使用蓝牙与控制器和机器人进行通信。感谢我最小的孩子在下面的视频中提供的背景尖叫音效,她当时正追着机器人踢它。

在这里观看视频

Watch The Video

现在,这是一个快速入门指南,教你如何构建自己的机器人。在这个例子中,我们有一个运行在笔记本电脑上的应用程序,它通过蓝牙与机器人通信,并根据 Kinect 的输入发送命令。你也可以轻松地构建一个手机界面。

如果你已经明白了,这是代码 – 你可以继续阅读以构建硬件部分。

1 – 熟悉基础知识

你需要对 Arduino 和/或 Netduino 有一定的了解——在这个例子中,我将使用 Arduino。

Arduino

探索 Arduino。最好的方法是:

你主要需要了解 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

协议

2 – 获取组件

你可以在线商店购买这些组件。你也可以尝试附近的本地电子商店,购买一些面包板、跳线(准备一些公对公和母对母的线)等。以下是构建 CakeRobot 所需的组件列表。

  • 底盘 – 我使用的是 Dagu Magician Chassis – 来自 Spark FunRhydolabz – 它配有两个步进电机,可以由我们的驱动板控制。
  • 带电机驱动的 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 和蓝牙模块放置/拧/安装在上面。根据需要使用跳线/插件连接组件。下面是一个高层示意图。

image

这是我机器人的低分辨率俯视图。

image

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);
            }

        }

因此,它会根据你的手部动作设置速度。探索我编写的 ConnectionHelperBluetoothConnector 类。

结论

代码在这里 Github 上。Fork 一份 尽情玩耍,并扩展它。

© . All rights reserved.