Category Archives: Uncategorized

在Unity环境中用强化学习训练Donkey Car

作者:Felix Yu

编译:Bing

Donkey Car是一种为模型车开源的DIY自动驾驶平台,它利用一个带有相机的树莓派单片机,让模型车可在赛道上自动驾驶,Donkey Car会学习你的驾驶方法,在训练后懂得自动驾驶。对于那些没有背景知识的人来说,该平台能提供你所需要的必要细节,它既包含硬件也带有软件。阅读完这一教程,你也可以无需硬件背景知识组装一辆自己的自动驾驶汽车。

现在,训练汽车进行自动驾驶最常见的方法就是行为克隆和路线跟随。在高级层面,行为克隆是利用卷积神经网络学习汽车前方摄像机所拍摄的图像之间的映射,并通过监督学习控制角度和throttle values。而路线跟随是利用计算机视觉技术跟踪路线,并且利用一个PID控制器让小车跟着该路线。我尝试了两种方法,它们都很有用!

用行为克隆训练Donkey Car避开障碍物

用强化学习训练Donkey Car

重要的一点是,Donkey Car的目标是搭建一辆在比赛中跑的最快的车(能以最快速度跑完一圈)。我认为强化学习是训练的好方法,只需设计一种奖励,让汽车的速度达到最快,并且让它能一直保持在轨道内即可。听上去很简单对吧?但事实上,很多研究表示在实体目标上训练强化学习是很困难的。强化学习主要通过试错法训练,放在汽车身上,我们只能保佑车子不会在一次次的实验中撞碎。另外,训练时长也是一个问题,通常,强化学习智能体都要训练个几百回合才能掌握些许规律。所以,强化学习很少用在现实物体中。

模拟现实

最近有一些科学家们研究对现实进行模拟,即先用强化学习在虚拟模拟器上训练小车,然后将其迁移到现实世界里。例如,最近OpenAI就训练了一个灵活的机械手臂,可以做出多种动作,整个过程就是在虚拟中训练的。除此之外,谷歌大脑也曾训练过一个四足机器人,可以用模拟现实的技术学习灵活的动作。在虚拟器中学习控制策略,然后再将其部署到真正的机器人上。这样看来,若想用强化学习训练Donkey Car,一个可行方案就是先用模拟器训练,再把学到的策略用在真的小车上。

OpenAI训练的机械手

Donkey Car模拟器

第一步是先为Donkey Car建造一个高保真度的模拟器。幸运的是,Donkey Car社区里一位爱好者在Unity中创建好了一个模拟器。但是它设计的目的主要针对行为学习(即将相机中的图片保存在对应的控制角度和throttle values文件中以进行监督学习),但是和强化学习无关。我希望的是有一个类似OpenAI Gym那样的交互界面,可以用reset( )重置环境、对其进行操作。所以,我决定在现有的Unity模拟器基础上对其进行修改,让它更适合强化学习。

4.1 创建一种能用Python和Unity沟通的方法

因为我们要用Python书写强化学习代码,所以我们首先要找到一种方法能让Python在Unity环境中使用。结果我发现这现有的模拟器也是用Python代码进行沟通的,但它是通过Websocket协议进行的,Weosocket和HTTP不同,它支持服务器和客户端之间进行双向通信。在我们的案例中,我们的Python“服务器”可以直接向Unity推送信息(方向和油门),而我们的Unity“客户端”也可以反向对服务器推送信息(状态和反馈)。

除了Websocket,我还考虑使用gRPC,这是一种高性能服务器-客户端通信框架,用谷歌在2016年八月开源。Unity将其用于机器学习智能体接口通信的协议。但是它的设置有点麻烦,并不高效,所以我还是选择Websocket。

4.2 为Donkey Car创建一个定制化的环境

下一步是创建一个类似于OpenAI gym的交互界面,用于训练强化学习算法。之前训练过强化学习算法的人可能对各种API的使用很熟悉。常见的就是reset( )、step( )、is_game_over( )等。我们可以将OpenAI gym的种类进行扩展,然后用上面的方法创建自己的gym环境。

最终成果能和OpenAI gym相媲美,我们科用类似的指令与Donkey环境交互:

env = gym.make("donkey-v0")
state = env.reset()
action = get_action()
state, action, rewards, next_state = env.step(action)

环境同样可以让我们设置frame_skipping,并且用headless模式训练智能体(也就是无需Unity GUI)。

同时,Tawn Kramer还有3中Unity场景可用:生成道路、仓库和Sparkfun AVC,都可以用于训练。在我们开始运行自己的强化学习算法之前,我们要么自己搭建Donkey Car的Unity环境,要么下载预先搭建好的环境可执行程序。具体的环境设置和训练指导可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl

4.3 用DDQN训练Donkey Car

准备好了对强化学习友好的环境,我们现在就可以搭建自己的强化学习算法啦!我采取的是用Keras书写的Double Deep Q学习算法,这是DeepMind开发的经典强化学习算法,易于测试,编写简单。我已经在OpenAI gym中的cartpole和VizDoom中测试了,所以如果有什么问题,应该是Unity环境的问题,算法没有问题。关于DQN的文章,大家可以参考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

4.3.1 状态空间

我们用Donkey Car前方安装的摄像机所拍摄的像素照片,执行以下转换:

  1. 将尺寸从(120, 160)改为(80, 80)
  2. 变为灰度图像
  3. 框架堆叠:去前面几个步骤中的4个框架堆在一起

最后的状态维度应该是(1, 80, 80, 4)。

4.3.2 动作空间

现实和虚拟世界中的Donkey Car都是将持续的方向控制和油门数值作为输入。为了简介,我们将油门数值设为常量(例如0.7),仅仅改变控制方向。控制方向的值从-1到1,但是,DQN只能处理分离的动作,所以我将方向的值分为15个种类。

4.3.3 Q网络框架

我们的Q网络是一个3层卷积神经网络,以堆叠的框架状态为输入,输出表示方向值分类的15个值。

4.3.4 奖励

奖励是有关汽车偏离中线程度的函数,它由Unity环境所提供。奖励函数用以下公式表达:

其中max_cte是一个归一化常数,所以奖励的范围在0到1之间。如果abs(cte)大于max_cte,循环即终止。

4.3.5 其他重要变量

Frame skipping设置为2以稳定训练。Memory replay buffer的值为10000.Target Q网络在最终训练时会更新。CNN训练时的Batch size为64。贪婪函数用于探索。Epsilon初始值为1,逐渐在10000次训练后会成为0.02。

4.3.6 结果

经过上面的设置,在单个CPU和一个GTX 1080 GPU上,我训练了DDQN差不多100次。整个训练用了2到3个小时。可以从上面的视频中看到,小车跑得很好!

去除背景噪声

我们想让我们的强化学习智能体只根据路线的位置和方向进行决策输出(即方向控制),不要受环境中的其他因素影响。但是,由于我们的输入是全像素的图像,它可能对背景模式过度拟合,而无法认出行进路线。这在现实中尤其重要,因为旁边的车道可能会有障碍物(例如桌子、椅子、行人等)。如果我们想从虚拟世界将学习策略进行迁移,我们应该让智能体顾略背景中的噪音,只关注于车道。

为了解决这个问题,我创建了一个预处理通道,可以将行车路线从原始像素图像中分离出去,再输入到CNN中。分割过程受@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee” title=”这篇博文”>这篇博文的启发。这一过程概括如下:

  1. 用Canny Edge检测器检测并提取所有边框
  2. 用Hough直线转换确定所有直线
  3. 将直线分成positive sloped和negative sloped两类
  4. 删除所有不属于车道的直线

最终转换出的图片应该有最多2条直线,具体情况如下:

接着我把分割后的图像重新调整到(80, 80)的,将4个连续的框架堆叠在一起,用它们作为新的输入状态。我使用新状态再次训练了DDQN,生成的强化学习智能体可以学习良好策略进行驾驶!

然而,我注意到不仅仅训练时间会变长,学习策略也会变得不稳定,车子会经常在转弯的时候摇晃。我想可能是因为在训练的时候丢掉了有用的背景信息。不然的话,智能体应该不会过度拟合。

下一步

在这篇文章中,我们介绍了一种能和OpenAI gym相比的环境,用来训练Unity模拟器中的Donkey Car。还用DDQN训练它自动成功地自动驾驶。接下来,我计划让小车通过训练加速到最大值,并且将这一策略迁移到现实中。

新手学堂之电池选购常识

任何模型车,都不可避免的需要使用电池,本文介绍一些常见模型车用的主流电池知识。
FunRC Studio原创资料,只发RCFANS,如需转载务必注明出处。

本文旨在为新手解决电池的常识问题。

电池的选购不外乎几个方面:
电池类型 / 电压 / 容量 / 放电C数 / 外形尺寸 / 插头类型

电池类型常见的有: NiCd / NIMh / LiPo / LiFe

    NiCd,镍镉电池,老掉牙的类型,造价低廉,容量低,污染大,带记忆效应,现在只能在一些廉价的套装车上找到,强烈不推荐
    NiMh,镍氢电池,在AA和AAA电池中,nimh绝对是主流,但是在遥控模型的电池中,绝对有廉颇老矣的感觉
    LiPo,锂聚合物电池,是现在模型中的主流类型,使用广泛,各种型号琳琅满目,是本文需要介绍的重点
    LiFe,锂铁电池,不算太主流,一般用在遥控器,或者油车接受电,很少用做电车的动力电

NiCd由于太老了,已经没有介绍的必要。不建议玩家选购。
NiMh则还有用武之地,例如油车接受电,很多都还是6V的电压,单节电压1.2V的镍氢电用5节串联起来,就组成了6V电池组刚好。
    而电车上,NiMh则是6节串联,成为7.2V电池组。也有一些大脚车是使用7节串联组成8.4V的。
LiFe使用场合目前不多,单节电压3.3V,多数为圆柱形,2S封装成6.6V的情形多见,主要用于遥控发射电,或者油车接受电。

本文重点介绍模型车上用的最广泛的LiPo 锂聚合物电池。

LiPo,全称Lithium-Polymer Battery,锂聚合物电池外壳为软包,由Li-ion锂离子电池进化而来。
    锂离子单节电压3.6V,由于活性太高,爆炸几率较大,目前已几乎让LiPo取代,现在我们手机使用的几乎都是LiPo。

电压:LiPo单节电芯标称电压为3.7V,充满电时,目前主流电芯均为4.2V单节,目前模型上高压电芯开始逐渐显现,高压电芯充满为4.35V单节。
    每节电芯的电压3.7V我们称之为1S,但是我们的车子往往3.7V是不够的,主流电池电压都是需要7.4V,于是把电芯串联起来,提高电压就行了。
    而多少S则是把多少个3.7V串联起来,电压就是3.7V乘以多少S,例如2S就是3.7*2=7.4V;3S就是3.7*3=11.1V,以此类推。

锂电池还涉及到封装的问题,买电池时会看到有些写着2S1P,有些写着2S2P,这又是什么意思呢?
    2S就是上面说过的了,2S=3.7*2=7.4V,那么2P又是什么呢?
    由于工艺/体积/成本等限制,每个电芯的容量有限,如何最简单地提升容量呢?就是把2个同型号的电芯并联起来,就是多少P的概念。
    例如2个电芯并联起来组成1个3.7V,就称之为2P;而假如用3个电芯并联起来组成一个3.7V,那么就是3P了。
    于是,2S2P,可以理解为有4个一样的电芯,先把其中2块并联起来,组成1S,然后把另外2块并联起来,组成另外1S,再把这2个1S串联起来,成为2S,这个电池就称为2S2P
    例如一个电芯只有3.7V,2000MAH,那么就可以通过2S2P的形式,组成7.4V 4000MAH的电池。
    至于购买时,我们是建议购买1P的产品,例如2S1P,3S1P之类的。这样的电池出现问题的几率相对低一些。但是对于一些极限顶级电池来说,可能没有1P的选择,因为1P受限于技术/工艺限制,未必做得出来。于是2P之类的就成为了不得已的选择。

容量:每个电池都有自己的额定容量,电池的容量就像汽车的油箱大小,容量越高,能使用的时间就越长,条件允许的情况下,当然是买容量大的。
    但是也不是必须都选择容量大的,因为有些时候我们会特意选择容量小的以对车架进行减重,提升车架性能。因为容量小意味着重量一般都会轻一些。

容量的鉴定:电池的容量,往往只是产品外壳的一个标签。实际里面有多少我们如何得知?
    有些玩家在使用电池后,拿电池进行充电,例如一个5000MAH的电池,玩完之后,一充,怎么只有3000MAH?
    这个未必是电池容量不足,这可能只是因为你只用掉了3000MAH而已。

    电池的容量,如上面所写,就像汽车的油缸,如果一个5000MAH的电池,你只用掉了3000MAH就拿去充电,那么你肯定只能充进去3000MAH。极端的例子就是假设你刚充满,用都没用,你又拿去充电,那么你可能只能充0MAH。

    容量的鉴定方法:需要一台带放电功能的充电器。先将电池充满电,然后使用充电器的放电功能,将放电截止电压设置为3.0V/cell(每节3.0V),然后开始放电。
        到放电完成,看充电器上显示放出了多少容量,基本就是电池容量的90~95%左右。很少可以达到100%,因为按照电池厂的正常标法,大部分都是指充满到2.75V/cell(单节2.75V)下测出的容量,加上电池用过之后都会有损耗。所以如果要测量电池容量,最好在新买的时候就测量。
        (充电器显示放出多少容量,最终也只能大概参考,因为充电器本身也未必100%准确,但是误差一般不会太大。如果经过这个方法测量的数值与你电池的标签相差太远,那么这个标签就是很有水份的了,一些杂牌常见。而好的品牌很少会这样砸自己招牌,所以好的品牌往往都会贵一些,因为不会怎么虚标)

放电C数:也就是放电能力。C数越大,表示电池能在越短的时间内放完自身的容量。
    1C,就是在1个小时内放完自身容量。多少C,就是在多少份之一的小时内放完自身容量。例如60C就是1/60小时,也就是1分钟内,放完自身容量。
    C数越大的电池,其性能越高,价格越贵。
    对于同一台车来说,C数大的电池,与C数小的电池使用上的区别是:C数越大,其起步越暴力,尾速高一些,电池玩完之后发热越小。

    如何鉴定电池C数:一般玩家没有办法鉴定,因此网上很多虚标的电池,就是冲着新手去的。那些便宜,容量大,C数高,却很便宜的电池,往往就是为新手准备。很简单:新手没用过好的电池,他们不知道有什么区别。
        以下是比较简单的(对比法)鉴定方法:使用大品牌的电池进行对比。同C数接近容量,操作的手法与动力相同的情况下,发热大的电池,C数低,发热小的电池C数高。如果某杂牌40C玩起来发热比一些大品牌的30C还要热,那么并不是这个大品牌故意标低C数,而是杂牌恶意标高C数而已。

    放电C数的小猫腻:正常品牌标C数,都是标电池能长期持续工作的C数。但是一些小品牌,可能会标瞬间电流(常见是持续3~5秒),瞬间电流往往能达到持续电流的1.5~2倍。玩家在选购时应该注意。

说完C数,说一下放电电流:C数可以理解为一个单位,并不是电流。电流还要跟容量搭配。C数乘以容量才是放电电流。
    例如5000MAH 30C的电池,其放电电流为5000*30=150000MA,也就是150A,同理,一个3000MAH 50C的电池,放电电流也是一样的,150A。区别是:3000MAH能用的时间会更短。

    有些玩家可能会问:我的电调只有120A,或者60A,我买个有150A电流的电池,我的电调会烧掉吗?答案当然不会了。你家外面的供电线动辄有几千千瓦,你的电脑可能只有300瓦,你把300瓦的电脑接到几千千瓦的线上,电脑有烧掉了吗?

    因此,电池的放电电流只是电池具备的能力,但是实际使用时,消耗的电流大小则是由电调和马达决定的。只要买比你电调和马达消耗的电流大的电池就可以了,大多少都可以,只要你资金足。

外形与尺寸:玩家只要按照自己的要求去购买对应尺寸和形状的就可以了。LiPo大部分都是长条形,但是有一些旧车型则是圆柱形的,那么只能选择镍氢电或者圆柱形容量较低的锂电型号。

插头类型:主流是T插头,田宫插,JST插头,XT60插头,JST插头,香蕉插头(99%的4MM香蕉插加1%的5MM香蕉插),其他如小田宫,XT90之类的也有,但相对很少
    插头的选择,就根据自己动力设备的插头去选择对应的就可以了,记住目前主流是T插,如买错插头,则会造成用电设备与电池无法连接。

关于LIPO电池的保养:
    为什么一些比赛玩家或者老手的电池怎么玩都不涨,新手的很容易就发涨了呢?
        可能的原因有:新手可能被误导或者被无良商家瞒骗买了虚标的产品,或者不懂搭配的商家给搭配了不符合使用条件的电池,甚至是玩家自己根本不懂然后乱买这几种情况,都可能造成电池发涨之类的问题。

    最大的原因在于:保养。

        主要有充电,使用,以及存放三种情况

        充电:锂电池,除1S外,2S及以上的电池,都一定要使用锂电平衡充电器,插上锂电上的白色平衡小插头,使用平衡充电模式。多个S的电池,多少都会因为生产时,造成每片电芯的容量会有少许误差,这些误差就会造成电池在用过之后,电压出现不平衡,少则0.01V,多则可能有1V之大,越好的电池,差别越小,越差的电池,差别越大。而锂电平衡冲,则是在充电时平衡电压,让电压高的不要超电压,让电压低的迅速补充电压。

            充电涉及到充电电流的问题,建议电流是电池容量的一半至2倍的电流为妥,也就是0.5C~2C之间,例如5000MAH的电池,0.5C就是5000*0.5=2500MA=2.5A,2C就是5000*2=10000MAH=10A,那么这个电池最好使用2.5A~10A之间的电流。完全不用担心电流大了对电池有什么负面影响,现在的大品牌电池随便都能支持5C~6C的电流,区区10A 8A对于好的电池来说根本微不足道。

        使用:使用时,无论何时,都一定要记得设置好锂电保护电压,不要让单节电芯的电压低于2.75V这个极限电压。低于这个电压,会对电池容量和放电能力产生负面影响。一般建议将锂电保护电压设置到3.0V~3.2V之间就可以了。多数电调的保护电压都是指电池在短时间内达到保护值,就会切断输出。因此电调保护之后,电压是会有回升的。假设设置了3.0V,保护之后我们测量电压可能有3.4V也不奇怪。
            网上一些玩家说电池电压不要低于3.7V,这个是毫无必要的。对于模型电池来说,因为C数大,容量大,其极限也更高,玩到3.0V每节对电池来说毫不足道。重点是后面说的存放。

        存放:存放状态对于一个电池来说至关重要。锂电不使用,或者不充电,都是处于存放状态,占一个电池寿命的最多时间。只要做到存放时,电池的单节电压处于3.85V左右,那么对电池来说就是最佳的。也就是说,如果你的电池不是在车上使用,也不是在充电器上充放电的时候,都要尽快让电池的电压变成3.85V每节,这样的电池寿命最长。
            尽快要多快?用完之后,等电池凉快了就充电到3.85V就可以了。然后到你下次要使用之前,再把电池充满。3.85V的电池要充满也很快的,不要贪方便提前一晚就充好电。可能你今晚充满的电池,到明天中午想用的时候,发现电池已经微涨了,也毫不奇怪的。
            但是如果我刚充满了,今天又不用了,怎么办?这还要问吗?马上放电啊,放到3.85V每节,然后等下次要使用的时候再充满吧。如果这点保养都做不好,那电池提前说88就不是电池的错了。

            友情提示:如果电池用完了,一定要记得从电调上拔掉插头哦,不然电调会偷偷的把电池的电压榨干的。

                如果不小心过放(电压低于2.75V)了咋办?如果充电器还能正常识别,那没问题,赶紧充到保存电压。但是如果充电器不认这个电池了,说电压低,那就要人肉加电压让电池起死回生了。操作方法:把锂电池的平衡插头不接到充电器,只接电池的正负极那2根粗线,然后用镍氢或者镍镉电模式,小电流冲几分钟,仔细看电压变化,当电压高于3V每节的时候(假如2S就是总6V),就可以用回正常的锂电平衡冲啦!
                    如果是简易平衡充电器,没有镍氢电模式,但是又无法识别了怎么办?那就要暴力加电压了。假设2S 7.4V的无法识别了,要让电池电压回升到6V以上,不超过8.4V,那么就找个直流电压器,电压在6~8.4V之间的,如果没有,就用几个五号电池串起来变成这个电压值,然后直接正极对正极,负极对负极接到你的锂电池上等片刻就OK了。注意正负极对准啊,接反后果不堪设想。

论坛也有些帖子,教导大家说锂电池新买的时候还要激活。其实这是毫无必要的,现在的锂电池容量大,C数高,寿命有限,每一次循环,就是电池少一次寿命。新到手的电池完全不会比所谓激活过的电池性能差。激活既无必要,又浪费时间。

AI赛车联盟的成功启动

我们为AI Racing League举办了一场令人难以置信的首场比赛。观众包括来自AI社区,研究人员,教师和学生的利益相关者。

昨天我们成功启动了新的明尼苏达州AI赛车联盟!这是一次故意的“软启动”,只有极少的宣传和营销,因为我们不想让我们的第一次活动不堪重负。优先考虑了双城区STEM领导层中有影响力的人,我们将重点放在邀请能够接触到妇女和少数民族社区的人们身上。这也是在一个工作日,所以我们意识到许多人不能休息一天,这限制了许多人的参与。

该活动在明尼苏达州国际学校的体育馆举行。特别感谢Zach Sheffert建立联系。这是一个很棒的设施,我们有足够的空间来分散和测试非常受欢迎的DonkeyCars自我注意:教人们如何在开始驾驶前限制最高速度

我们的赞助商是Optum Tech University(OTU)。无论保罗马利尼科尔·斯旺森 OTU的做了巨大的工作量,使在很短时间内量这一事件的成功。OTU为10辆DonkeyCars购买了零件,打印了轨道,完成了所有后勤工作,甚至付了咖啡和午餐!他们在两周内完成了这一切!

我们吸引了来自Optum和其他公司的志愿者。Optum Advanced Technology Collaborative的许多员工帮助组装汽车并成为我们的第一轮导师。我们的夏季实习生和Optum 技术开发计划的成员积极参与。

我们的第一个活动的目标是向人们介绍课堂上围绕AI的想法。我们希望活动有趣而灵活,即使教师和利益相关者只能在活动中停留一小时。我们与CodeSavvyMNCodes等组织合作,确保我们与有影响力的利益相关者建立联系。

当参与者进入健身房时,他们可以选择进入一组“分组表”,或者他们可以直接加入其中一个让DonkeyCar上班的团队。我们有以下突破表:

  1. 硬件 – 我们有两个表格显示样品Raspberry Pi和Nvidia Nano硬件以及样品伺服器,电机,电池和脉冲宽度调制的可视化演示。
  2. Python – 用于通过http://trinket.io教授Python的笔记本电脑的表。
  3. UNIX Shell – 包含示例UNIX shell演示的表。
  4. GPU服务器 – 用于显示我们的GPU服务器如何用于从图像进行培训的表格。
  5. Jupyter笔记本电脑 – 带有PC的桌子,向人们展示如何编写Jupyter笔记本来分析他们的图像文件。
  6. 计算机视觉 – 具有许多计算机视觉演示的表格,例如人脸识别。Nvidia Nano实时运行这些演示。
  7. 机器学习 – 包含机器学习步骤的总体图表以及如何使用TensorFlow库的表格。

虽然我们在许多表格上都有很多活动 – 其中一些表缺乏足够的训练导师和材料 – 所以我们仍然有大量的内容和培训可供使用。

我们还有一些表格,参与者在校准DonkeyCars时,将车辆用于赛道周围的试驾,试图收集训练数据并训练他们的模型。说实话,我们遇到了一些技术挑战,只有一辆车得到了充分的培训。然而,每个人似乎都玩得很开心,我想很多人都知道这些事件可以带来什么。

我们要求参与者填写“概念卡”表格,在这些表格中他们可以命名一个概念并描述学习目标和资源可能是什么。我们正在收集这些内容,以开始为其他活动构建可重用的学习组件。我们现在处于“汇报”阶段,并将整理一份任务清单,以使下一次活动更加顺利。

特别感谢所有参与的人,特别是Jon HerkeRob RossmillerParker EricksonSean LearyPaith Philemon为这次活动的辛勤工作而努力。我应该提一下Rob的团队是第一辆完成第一圈的车,所以他们在技术上是我们学习比赛的“赢家”!

我们还要向DonkeyCar 社区成员表示衷心的感谢。如果没有您的辛勤工作以及您愿意分享您的代码,文档和您的经验,这项活动将永远不可能实现!我们希望通过创建一组便携式概念资源来回馈,这些资源可以加载到现代学习管理系统(LMS)中,该系统使用AI来推荐有趣的学习AI的方法。有点像递归!

我们在这里为AI Racing League的CoderDojoTC GitHub回购发布资源。拉请求正在被接受!您可以随意将项目添加到任务列表中,以查找您希望查看的任何新概念。

LEGO MindStroms

 

LOGO社が販売している学習用のロボットのキットです。
これを使ったロボットのコンテストが世界中で開催されています。

Android と MindStroms の間の通信には Bluetooth を使用した。
Android の傾きセンサーを使って、MindStroms の進む方向を制御することができます。

Android のプログラムには、JAVA ではなく、App Inventor を使用します。