• 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21
  • 查看: 21645|回复: 27
    打印 上一主题 下一主题

    [项目分享] 四足两轮小车二合一??鼗魅耍ǖ诙嫱旯?,可下代码)

        [复制链接]
    第一个版本,用了上网本做机器人主机,通过其它终端???。实现其它确实很简单,还能独立完成一些复杂任务。但是??氐慕嵌壬匣故怯行┖芏啾锥?,比如视频和控制都有明显延时,psp容易,上网本耗电过多,如果选择从机器人的电池获得供电,一次充满玩不了多久就没电了?;谏鲜銮榭?,决定把??馗牧?。
    喜欢该贴的、下载代码的顺手点个支持吧

    第一版:
    材料清单:
    2020铝型材若干
    32路舵机控制板一块
    Arduino uno控制板一块
    上网本一台
    11个180度舵机
    2个360度舵机(当直流电机用)
    舵机支架若干
    usb摄像头一个配红外镜头
    4个红外led灯
    12V锂电池一块同时为上网本和控制板供电

    搭好的机器人:











    模式切换的测试视频:


    wifi??兀ù悠荡洌┦强梢杂每缮招吹奈尴呗酚善魇迪值?,例如TP Link703N,也可以在网上买已经烧写好openwrt的。
    手上没有这类路由器,偷个懒就用5年前的上网本来实现好了。上网本和uno利用串口通信,上网本上的程序用c语言编写??汕崴墒迪旨淌录?。这样偷懒有个好处,可以利用移动设备直接对上网本???,从而控制机器人,比如使用windowsphone上的应用pcremote。也可以利用其他计算机对机器人实现远程???。简单的桌面托管(例如qq)就可以了,当然也可以自己编写。另外还可以用c语言和opencv实现视频识别等,让机器人独立完成一些任务。

    手上有台闲置已久的psp。这里就是用psp disp来完成???,带视频流。

    关于C语言的按键反应和串口通信,简单做下介绍。
    这里以clr项目为例,示例代码如下,非常简单
    1. #include "stdafx.h"
    2. #include "windows.h"


    3. using namespace System;
    4. using namespace System::IO::Ports;


    5. int main(array<System::String ^> ^args)
    6. {
    7. Console::WriteLine(L"Serial test");

    8. SerialPort^ arduino;
    9. arduino = gcnew SerialPort("COM3",9600);
    10. arduino->Open();


    11. int i=1;
    12. while(1){
    13. if(i%2==1)
    14. arduino->WriteLine("H");
    15. else
    16. arduino->WriteLine("L");

    17. Sleep(1000); //延时1秒,其头文件为window.h
    18. i=i+1;
    19. }


    20. return 0;
    21. }

    22. 前面提到过opencv。为了以后的任务,如视频识别等,决定直接使用opencv。对于这里的??厝挝穸?,可以直接打开usb摄像头,而且自带了键盘事件函数。示例代码如下
    23. #include "stdafx.h"
    24. #include <opencv2/opencv.hpp> // opencv库函数


    25. using namespace System;
    26. using namespace System::IO::Ports;
    27. using namespace cv;


    28. int main(array<System::String ^> ^args)
    29. {
    30. Console::WriteLine(L"Serial test");


    31. cvNamedWindow( "window1", CV_WINDOW_AUTOSIZE);


    32. SerialPort^ arduino;
    33. arduino = gcnew SerialPort("COM3",9600);
    34. arduino->Open();


    35. int i=1;
    36. while(1)
    37. {
    38. char c = waitKey(1000); //延时1秒,等待键盘事件,返回键值
    39. switch(c)
    40. {
    41. case 'h':
    42. arduino->WriteLine("H");
    43. break;
    44. case 'l':
    45. arduino->WriteLine("L");
    46. }
    47. }

    48. cvDestroyWindow("window1"); // 销毁窗口
    49. return 0;
    50. }
    复制代码


    要使用opencv的函数,需要对项目做一些配置,可以参考中国官网上的安装教程。另外需要注意的是
    waitKey()函数只有在打开了一个cv窗口的情况下有效。所以在主函数里第二行添加了语句:
                   cvNamedWindow( "window1", CV_WINDOW_AUTOSIZE); //创建一个cv窗口
    再放几张界面的图片和截屏






    两个四足模式的视频





    局域网???br />

    完整的c语言程序代码可以在附件下载



    第二版:
    还是继续要视频传输,和wifi???。这次用一个刷了openwrt的路由代替上网本,今后图像处理等任务可以交由上位机完成。因为不需要负载上网本,对机器人的结构做了些改动。



    我选择了一个mini无线路由器。拆开壳改装的时候才发现主板和tp link 703n是一样的。然后就是把板子上的tp_in和tp_out接出两根线用于和arduino串口通信。供电不用miniusb口,还要跳出两根电源线,电源线负极也是串口通信的共地线。为了扩大点wifi信号范围,放弃了原有的wifi贴片天线,连接了一个外接天线。


    硬件全部改造完成了,然后就是漫长的刷机过程。不多说了,网上资料教程多的是。嫌麻烦也可以从网上直接买个烧写好的路由器。连上摄像头和arduino就可以测试了。目前测试用的是网上的上位机软件(计算机和手机)。这些软件支持按键自定义,还不错,下位机部分就可以完全保持不变了。pc端上位机软件,过于花哨了,有的功能不需要的也放在上面。android端自定义功能不算太全面。




    着手自己编写程序。等程序完成后再跟大家分享。最后还是要回归到psp控制,psp程序现在也只能自己编写了。程序的编写难点有两个,一个视频传输,另一个是数据的传输。


    C++和opencv方案
    前面说了,之后图像处理的任务会交给上位机。第一版中,控制端的计算机就是用的C++搭opencv的方案。所以继续沿用该方案设计pc端程序。建立一个C++ console项目,添加相关opencv库的添加和路劲配置,可以参考网上的资料。
    如果按照网上的资料进行路由器烧写,那么视频流的地址为
    //192.168.1.1:8080/?action=stream
    路由器成功烧写openwrt的话,可以用firefox浏览器在改地址下成功打开摄像头。opencv里的VideoCapture是可以利用ip地址打开网络摄像头的
    如果直接使用视频流的地址是打不开的,因为VideoCapture的参数需要一个文件拓展名,所以在使用的时候给它加上一个虚拟变量。烧写了openwrt的路由器传输的视频流是mjpg。我们新的视频流地址就是
    //192.168.1.1:8080/?action=stream&type=.mjpg
    现在来看这部分的完整代码,轻松打开摄像头。
    1. #include "stdafx.h"
    2. #include "opencv2/opencv.hpp"
    3. #include "highgui.h"
    4. #include "iostream"

    5. using namespace System;
    6. using namespace cv;
    7. using namespace std;

    8. int main(array<System::String ^> ^args)
    9. {
    10.     Console::WriteLine(L"Hello World");
    11.         
    12.         cvNamedWindow( "camera", CV_WINDOW_AUTOSIZE);
    13.         cvMoveWindow("camera",0,0);
    14.         
    15.         const string cameraAddress = "//192.168.1.1:8080/?action=stream&type=.mjpg"; //带虚拟参数的视频流ip地址


    16.         VideoCapture vcap;
    17.         Mat frame;


    18.         if(! vcap.open(cameraAddress))
    19.         {
    20.                 Console::WriteLine(L"ERROR");
    21.                 return -1;
    22.         }

    23.         while(1)
    24.         {
    25.                 char c = cvWaitKey(10);

    26.                 vcap.read(frame);
    27.                 imshow("camera",frame);

    28.                 if(c==27)
    29.                         break;
    30.         }

    31.         cvDestroyWindow("camera");
    32.     return 0;
    33. }
    复制代码


    控制部分。
    按照网上的资料给路由器烧写openwrt后,控制地址为  http:\\192.168.1.1
    端口号为:2001路由默认的通信波特率为9600
    控制的实现使用C/C++的Network编程。首先需要添加头文件 System.dll
    然后添加下面的命名空间
    1. using namespace System;
    2. using namespace Sytem::Net;
    3. using namespace Sytem::Net::Sockets;
    复制代码

    定义一个IPAddress类对象来解析控制地址。
    1. System::String^ controlip = "192.168.1.1";   // 不能包含 http:\\
    复制代码

    定义一个IPEndPoint类对象,建立控制地址的端点。
    1. System::String^ port = "2001";
    复制代码

    最后定义一个Socket类对象,用Socket类的函数完成建立连接,数据发送和接收。
    1. Socket^ c = gcnew Socket(ipe->AddressFamily,SocketType::Stream,ProtocolType::Tcp);
    复制代码

    其中scode和rcode的类型是字节数组,scode是要发送的数据,rcode用于保存要接收的数据
    1. array<Byte>^ scode = Encoding::UTF8->GetBytes("arduino");  //arduino是要发送的数据,转换为Byte数组,保存到scod
    复制代码

    用下面的Arduino代码来测试路由器的串口控制。
    1. int led = 13;

    2. void setup(){
    3.   pinMode(led,OUTPUT);
    4.   Serial.begin(9600);
    5. }

    6. void loop(){
    7.   char c;
    8.   
    9.   if(Serial.available())
    10.   c = Serial.read();
    11.   
    12.   if(c == 49)
    13.   digitalWrite(led,HIGH);
    14.   else
    15.   digitalWrite(le,LOW);
    16. }
    复制代码
    下面是包含摄像头打开和发送测试数据的代码。
    1. #include "stdafx.h"
    2. #include "opencv2/opencv.hpp"
    3. #include "highgui.h"
    4. #include "iostream"

    5. #using <System.dll>

    6. using namespace System;
    7. using namespace System::Net;
    8. using namespace System::Net::Sockets;
    9. using namespace System::Text;
    10. using namespace cv;
    11. using namespace std;

    12. int main(array<System::String ^> ^args)
    13. {
    14.     Console::WriteLine(L"Hello World");
    15.         
    16.         cvNamedWindow( "camera", CV_WINDOW_AUTOSIZE);
    17.         cvMoveWindow("camera",0,0);
    18.         
    19.         const string cameraAddress = "//192.168.1.1:8080/?action=stream&type=.mjpg";
    20.         System::String^ controlip = "192.168.1.1";
    21.         System::String^ port = "2001";

    22.         VideoCapture vcap;
    23.         Mat frame;

    24.         if(! vcap.open(cameraAddress))
    25.         {
    26.                 Console::WriteLine(L"ERROR");
    27.                 return -1;
    28.         }

    29.         IPAddress^ ips = IPAddress::Parse(controlip);
    30.         IPEndPoint^ ipe = gcnew IPEndPoint(ips,Convert::ToInt32(port));
    31.         Socket^ c= gcnew Socket(ipe->AddressFamily,SocketType::Stream,ProtocolType::Tcp);

    32.         c->Connect(ipe);
    33.         array<Byte>^ scode = Encoding::UTF8->GetBytes("1");
    34.         array<Byte>^ rcode = gcnew array<Byte>(256);

    35.         while(c->Connected)
    36.         {
    37.                 scode = Encoding::UTF8->GetBytes("0");
    38.                 c->Send(scode,scode->Length,SocketFlags::None);

    39.                 //c->Receive(rcode,c->Available,SocketFlags::None);

    40.                 char k = cvWaitKey(10);

    41.                 vcap.read(frame);
    42.                 imshow("camera",frame);

    43.                 scode = Encoding::UTF8->GetBytes("1");
    44.                 c->Send(scode,scode->Length,SocketFlags::None);

    45.                 if(k==27)
    46.                         break;
    47.         }

    48.         cvDestroyWindow("camera");
    49.         c->Close();
    50.     return 0;
    51. }
    复制代码
    最后可以看到Arduino控制板上的led等L在闪烁。现在来控制机器人。Arduino的代码完全不需要改动。把第一版的c++代码移植到上面的代码里就完成了。完整的代码可以从下面附件下。C++程序运行截图




    安卓控制端的代码也完成了。相比之下,代码简单得多,就不多解释了。大家可以直接下载源码。稍微说明下,如果以我的安卓代码继续做的话,注意我用了自定义的SurfaceView类,其次Manifest文件里要添加以下代码,这是网络通信协议
    1. <uses-permission android:name="android.permission.INTERNET" >
    2.     </uses-permission>
    3.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    4.     </uses-permission>
    5.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >
    6.     </uses-permission>
    复制代码
    安卓控制界面照片



    用安卓平板??氐氖悠?。PC端的??厥悠稻筒环⒘?br />

    下一阶段就是PSP的控制了,正在酝酿中。完成后再跟大家分享??赡芑够岜嘈磜indowsphone版本的。

    喜欢该贴的、下载代码的顺手点个支持吧






    沙发

    何处不江南  初级技匠

    发表于 2014-1-21 10:45:34

    楼主自己做的吗? 好牛B的玩法。。
    板凳

    Fantc  初级技匠
     楼主|

    发表于 2014-1-21 19:44:51

    何处不江南 发表于 2014-1-21 10:45
    楼主自己做的吗? 好牛B的玩法。。

    恩 自己做的。就是把手上的东西凑了凑
    地板

    lauren  高级技师

    发表于 2014-1-21 20:26:52

    我擦很逗啊,这货能跑吗哈哈,让我想到一台日本出的变形机器人
    分享下://www.tudou.com/programs/view/CvGEzBNPCZM/

    完爆他吧,楼主
    5#

    Fantc  初级技匠
     楼主|

    发表于 2014-1-22 01:48:25

    lauren 发表于 2014-1-21 20:26
    我擦很逗啊,这货能跑吗哈哈,让我想到一台日本出的变形机器人
    分享下://www.tudou.com/programs/vie ...

    前进、后退、转向是没问题的。但跑不起来,每个脚上还差一个自由度,必须要再加一个舵机。没有多余的舵机和舵机支架了
    6#

    cj2q  中级技匠

    发表于 2014-1-23 10:31:46

    有很大的发展空间~~~~
    7#

    jerry嘉  学徒

    发表于 2014-1-27 03:37:55

    顶楼主 很有趣的玩法
    8#

    looi  学徒

    发表于 2014-1-29 05:55:46

    这个要装上omni轮就更牛bi了
    9#

    naiwapow  学徒

    发表于 2014-2-2 19:36:39

    不错哦 楼主下次改装变形金刚吧
    10#

    xixiyu  中级技师

    发表于 2014-2-7 22:07:30

    好东西:)
    11#

    xixiyu  中级技师

    发表于 2014-2-7 22:07:31

    好东西:)
    12#

    xixiyu  中级技师

    发表于 2014-2-7 22:07:32

    好东西:)
    13#

    erdenuss  学徒

    发表于 2014-2-17 18:36:42

    楼主,是不是可以改成用无线路由实现wifi控制
    14#

    云端之上  学徒

    发表于 2014-3-1 22:39:42

    第二种方案给力
    15#

    JOJO  学徒

    发表于 2014-3-2 20:25:28

    我是来下资料的。终于在这找到代码了
    16#

    Fantc  初级技匠
     楼主|

    发表于 2014-3-2 20:41:30

    JOJO 发表于 2014-3-2 20:25
    我是来下资料的。终于在这找到代码了

    收好不谢
    17#

    白色影子  学徒

    发表于 2014-3-9 03:18:46

    我是来下资料的
    18#

    专业龙套  学徒

    发表于 2014-3-9 20:18:52

    能用外网??孛?/td>
    19#

    szmmgg  学徒

    发表于 2014-3-10 13:47:10

    有没有编译好的,
    20#

    Fantc  初级技匠
     楼主|

    发表于 2014-3-11 19:13:17

    szmmgg 发表于 2014-3-10 13:47
    有没有编译好的,

    编译没问题啊,都是亲测过的
    21#

    COLDMOUNT  学徒

    发表于 2014-4-15 11:04:40

    请问完整代码哪里能下?没有找到
    12下一页
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    为本项目制作心愿单
    购买心愿单
    心愿单 编辑
    wifi气象站

    硬件清单

    btnicon
    我也要做!
    点击进入购买页面
    上海智位机器人股份有限公司 沪ICP备09038501号-4

    © 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

    浙江6加1开奖结果
  • 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21