本帖最后由 小志 于 2017-12-10 13:50 编辑
在游戏中学会学习,在学习中学会享受。
这个小项目是之前在学校实验室根据奥松论坛的一篇技术贴做的,已成功运行,现在把相关的资料记录下来,便于日后察阅。
大家也可以动手做一下,还是很有意义的,虽然Kinect停产了,网上还是可以买到的。如果你们实验室有Kinect的话,那就太棒了!你可以省一点钱,毕竟这玩意儿还是小贵的。
体感智能车的原理非常的简单,就是利用Kinect采集人体的姿体信息,然后通过蓝牙串口向Arduino发送字符命令。Arduino通过相应的字符命令控制双H桥电机驱动模块实现小车的前进后退等动作。项目主要用到小车底盘套件、蓝牙、控制器等…
1.Arduino实现串口控制小车
下面按照制作过程为大家介绍如何来弄:
首先你得组装一辆4WD小车,小车是纯金属的外壳比较抗撞不容易损坏,亚克力的也行,视自己情况而定。
安装好小车地盘后再小车地盘内部安装双H桥驱动和电池将控制引脚用3P杜邦线接到Arduino上,连接好电源向Arduino内烧录程序(编译软件为Arduino IDE)。
部分代码如下(PS:代码有点长,文章里就不贴全部的代码了,有需要的小伙伴可以在文章末留言,我通过后台发给你): - #define pinI1 9 //定义I1接口
- #define pinI2 8 //定义I2接口
- #define speedpin 10 //定义EA(PWM调速)接口
- #define pinI3 4 //定义I3接口
- #define pinI4 5 //定义I4接口
- #define speedpin1 6 //定义EB(PWM调速)接口
- #define SPEED 150
- char opt = ' ' ;
- void setup()
- { Serial.begin(115200);
- pinMode(pinI1,OUTPUT); //初始化电机控制引脚为输出
- pinMode(pinI2,OUTPUT);
- pinMode(speedpin,OUTPUT);
- pinMode(pinI3,OUTPUT); //初始化电机控制引脚为输出
- pinMode(pinI4,OUTPUT);
- pinMode(speedpin1,OUTPUT);
- }
- void loop()
- {·······}
- ·····
复制代码
程序下载好后安装蓝牙模块,通过串口助手进行测试,确定字符命令可以控制小车。
2.Kinect与Arduino进行串口通信
下面进行Kinect的代码编写,我采用的是processing软件,使用前需要安装Kinectqu驱动OpenNI_NITE_Installer-win32-0.27和kinect的链接库SimpleOpenNI-0.27,(点击“阅读原文”获取下载地址)。
解压驱动包,首先安装OpenNI,然后安装SensorKinect,最后Sensor全部安装完成以后,重启电脑。将你的Kinect连接上电脑插好电源,可以通过查看控制面板中的设备管理器,检查你的电脑是否已经识别Kinect。
驱动安装完成后下载processing软件双击打开,打开后会在我的文档中出现processing文件夹讲下载的库文件SimpleOpenNI-0.27解压后复制到processing下的libraries下如果没有新建一个即可。重新打开processing就可以进行Kenect的程序编写了。
控制小车的代码如下(部分): - import SimpleOpenNI.*;
- SimpleOpenNI kinect;
- import processing.serial.*;
- Serial port;
- ·····
- void setup()
- {
- size(640, 600);
- ·····
- kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL);
- myFont = createFont("黑体", 32);
- myStr = "····机器人研究所";
- Str_w = "前进";
- ·····
- Str_x = "停止";
- Str_temp_NO = "未识别";
- Str_temp_Yes = "连接成功";
- ····
- println(Serial.list());//定义串口
- String portName = Serial.list()[0];
- port = new Serial(this, portName, 115200);//波特率
- }
- void draw()
- {
- ·····
- kinect.getUsers(userList);
- if (userList.size() > 0)
- {
- int userId = userList.get(0);
- onEndCalibration(userId, true);
- if ( kinect.isTrackingSkeleton(userId))
- {
- ·····
- kinect.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_RIGHT_HAND,right_hand);
- kinect.convertRealWorldToProjective(right_hip, right_hip);
- kinect.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_HEAD,head);
- kinect.convertRealWorldToProjective(head, head);
- ·····
-
- /***************************************************************
-
- ellipse(right_hand.x, right_hand.y, 15, 15);
- ****************************************************************/
- // user-tracking callbacks!
- void onNewUser(int userId) {
- println("start pose detection");
- kinect.startPoseDetection("Psi", userId);
- }
- ···············
- }
-
复制代码
这是Kinect捕捉到的人体火柴人图(从网上找了一张示意图):
程序编写完成后连接蓝牙串口(注意没有串口时程序会报错)这样一个体感智能车就制作完成了,接下来你就可以愉快的玩耍了!
有任何问题欢迎留言交流,开始你的学习之旅吧!
PS:如果你觉得本文对你有一点帮助,点赞、转发,不胜感激。
-- END --
Copyright © 2017 Robotkang. 转载请联系作者
|