×

YolkaBot机器人开源分享

消耗积分:0 | 格式:zip | 大小:0.30 MB | 2023-07-11

卢表镜

分享资料个

描述

描述

如果您想让朋友在另一个国家参加您的新年派对,请构建一个远程呈现机器人!这比普通的 Skype 对话要好得多,因为你的朋友可以控制机器人并到处乱跑,这实际上感觉就像他和你在同一个房间里,而不是在屏幕后面。

请注意照片上的 USB 记忆棒。我的硬盘突然坏了,我正在从 USB 运行实时 Manjaro Linux。只需要安装几个包。它实际上是我们的“圣诞树”,因为我们懒得带一棵真正的圣诞树。TODO:添加 LED!

特征

  • 建筑简单,材料成本低(如果您已经有笔记本电脑)
  • 不需要电子威廉希尔官方网站 设计技能(实际上,您必须了解学校基础知识并焊接几根电线)
  • 适用于任何 Windows 或 Linux 笔记本电脑(如果您不害怕从 1.5 米高处掉落,那就更好了)

可以通过以下方式控制:

  • 键盘(Windows、Linux)
  • 带两根棍子的游戏手柄(Windows、Linux)
  • 安卓
  • 支持多个并发客户端(因此您可以在 Skype 中进行电话会议,并看到您的朋友争夺控制权!)

此文本是从项目的GitHub 页面导入的,并且丢失了大部分格式。我检查了它,但我确定我错过了一些东西。请在github上查看。

指示

机壳

使用的材料(没有价格,因为它们是₽):

  • 3个铝管用于三角架
  • 1 个用于底座的刨花板搁板
  • 2 个割草机轮子(和电机,见下文)
  • 1 个购物车车轮(带旋转支架)
  • 电工胶带、扎带、螺丝
  • 1 块小木头,大约 5x5x5 厘米

主要想法是制作稳定的三角形底座,带有 2 个电动轮和一个支撑“购物车”轮,然后凭经验找到笔记本电脑的重心。

我不知道如何将轮子连接到电机并使用环氧胶。不要那样做!找到更好的方法...然后使用穿过孔的电缆扎带将电机安装在底座下方。我还使用了一些螺丝来更好地固定。也安装第三个轮子。我很幸运,车轮高度相互匹配,所以我不需要平衡底座。然后用锤子将两个管子的末端弄平,弯曲它们并用螺丝固定在电动轮上方。穿过管子并决定要安装笔记本电脑的高度。切割比这个长度稍长的管子。在此之后,将第三个管子连接到第三个轮子上方并找到最适合它的长度,请记住笔记本电脑很重并且您希望将重心放在底部三角形的中间。最后,切割最后一根管子并使用小木头和螺丝将它们全部连接起来。在连接笔记本电脑并将电池放在底座上的情况下测试您的结构,看看它是否稳定。

电子产品

部分:

  • 1个Arduino(我用的是莱昂纳多)
  • 1 L298N 双 H 桥直流步进电机控制器模块
  • 2个直流电机(详见下文)
  • 1 个电压等于或高于电机电压的 UPS 电池(我有 6V 电机和 12V 电池,见下文)。还有一个充电器。
  • Arduino 电线(带连接器)
  • 电池和电机的通用电线(比 Arduino 的更粗),外加 2 个端子,可轻松拆卸电池
  • 任何带 WiFi、摄像头、免费 USB 端口和良好电池的笔记本电脑
  • 用于将 Arduino 连接到笔记本电脑的长 USB 电缆
  • (可选)便携式扬声器,如果您的笔记本电脑的扬声器不够强大

威廉希尔官方网站

 
pYYBAGOuNI2AMfv1AAGtAV9o9dM803.png
 

如何确定您需要哪些电机是一个很好的问题。非常推荐这么好的WiFi。最大的问题是摄像头通常水平指向,所以客户端不会看到轮子下面的东西,如椅子、宠物等。如果你不在家并且无法设置网络以使服务器端口可以从互联网访问,请参阅 NAT下面的部分。

代码

先决条件

我使用了 Arduino IDE、Visual Studio 2015 Community、MonoGame 和它们附带的默认 Android 模拟器。我不确定,但看起来 MonoGame 也自动安装了 Xamarin。所有这些工具都是免费的。您可以轻松找到它们。

依赖关系

该项目的 C# 部分具有正常的 NuGet 依赖项,因此它可以正常工作。Arduino 代码依赖于CmdMessenger ,它可以安装在 Arduino IDE 包管理器中。

建造

我无法让 Visual Studio 在构建时创建 .apk,因此您需要运行 Deploy 并在 bin 文件夹中找到 .apk。

调试

默认的安卓模拟器花了我一些时间来设置。如果您遇到错误,请使用谷歌。另外,如果应用程序没有启动,请在android中手动解锁屏幕并重新启动调试。

用法

阿杜诺

只需上传草图。它看起来很稳定,无需手动重置即可工作。

服务器

通过 USB 将 Arduino 连接到笔记本电脑并运行服务器。在 Linux 上:您将需要mono软件包。串行端口访问要求用户是特殊组的成员,或者只是以 root 身份运行。

桌面客户端

使用键盘或任何带两根棍子的游戏手柄。在 Linux 上:MonoGame 中有一个错误:它不喜欢真正的 PS3 控制器,只是崩溃。尝试另一个或重新映射它xboxrdv键盘控制:

键-动作

  • 1 - 左电机前进 100%
  • Q - 左马达前进 50%
  • A - 左电机向后 50%
  • Z——左电机后退100%
  • 2 - 右电机前进 100%
  • W - 右电机前进 50%
  • S——右电机后退50%
  • X - 右电机向后 100%
  • Esc——退出
  • Enter - 让机器人听这个客户的命令
  • Space - 强制电机立即停止

安卓客户端

使用两个虚拟摇杆(@符号)。[ACTIVATE]让机器人听取这个客户的命令。[STOP]强制电机立即停止。

错误、限制

这是一个快速编写的项目,所以有一些肮脏的黑客攻击,有时我会遇到挂起,不确定是在客户端还是服务器端。

笔记

你需要在这里或那里调整代码,因为它有一些硬编码的东西,最重要的是:

  • 客户端Program.Main和中的网络地址Activity1.OnCreate
  • 别针global.cpp
  • PWM 限制(在我的例子中是由于电池电压)和其他一些常量motor.cpp
  • Android 客户端不依赖于 Android,因为它基于可在便携式 Windows 和 iOS 上运行的 MonoGame。所以如果你愿意,你可以在 Lumia 或 iPhone 上运行它,这需要一些小的调整和适当的构建设置。

流量消耗应该非常小,因为我发送原始 TCP 数据包并且仅在客户端更改输入时发送。

如果您在随机位置运行机器人,则绕过 NAT

服务器绑定到 TCP 端口,可以与多个客户端一起工作。如果你把你的 YolkaBot 带到一个随机的地方,你可能会发现自己落后于 NAT。我用 SSH 反向端口 worwarding 绕过了它,但它需要一个具有 SSH 访问权限和公开可用 IP 的主机。你会需要:

  • 将主机的 IP 和所需端口硬编码到客户端
  • 设置 SSHd(有默认安全设置防止非本地 IP 上的反向绑定)
  • 在 YolkaBot 的笔记本电脑上使用 ssh -R
  • 运行服务器并监听 SSH 转发到的端口。

使用此设置,您需要在客户端上进行零配置,如果出现问题,您可以简单地重新启动服务器/ssh。

什么是“约尔卡”?

Ёлка在俄语中是圣诞树的意思。

学分

随时用英语或俄语提问或提交错误或 PM 我(学分链接)


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'YolkaBot机器人开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);