
Kile Mradi Huu Unafanya
self-driving-car ni uigaji kompakt wa uendeshaji wa kiotomatiki ulioandikwa kwa JavaScript tupu. Mtandao mdogo wa neva hujifunza kupitia mageuzi kuendesha kwenye barabara kuu yenye njia tatu zinazopinda, kubaki kwenye njia yake, kufunga breki kwa ajili ya magari, kutoa ishara, kuyapita magari yanayoenda polepole, na kurudi kulia inapofaa.
Hakuna dereva wa mfano anayeonyesha tabia sahihi. Badala yake, kila kizazi hutuma kundi la mitandao ya neva kwenye barabara ileile. Mitandao inayosafiri umbali mrefu zaidi hupata alama za juu za ustahiki na kuwa wazazi wa kizazi kinachofuata.
Mradi huu una takribani mistari 1,300 ya moduli za ES zinazoshughulikia barabara, fizikia ya gari, utambuzi, msongamano wa magari, mtandao wa neva, algoriti ya kijeni, mpangaji, uchoraji, na kiolesura cha mtumiaji. Hakuna vitegemezi vya wakati wa utekelezaji, na moduli zilezile za uigaji huendesha kwenye kivinjari na Node.js.
Unaweza kufungua onyesho la moja kwa moja kutazama dereva aliyefunzwa awali, kuendeleza kundi kwenye kivinjari, au kulidhibiti gari mwenyewe.
Jinsi Mfumo wa Uendeshaji Unavyofanya Kazi
Uigaji huendelea kwa kasi isiyobadilika ya hatua 60 kwa sekunde. Katika kila hatua, gari huchanganua njia za karibu, hubadilisha uchunguzi huo kuwa pembejeo 19 za mtandao wa neva, na kutoa matokeo mawili: amri ya kanyagio na njia inayotakiwa.
Utambuzi na Mtandao wa Neva
Mtandao hauchambui pikseli za kamera au miale ghafi ya umbali. Hupokea taarifa zilizopangwa zinazofanana na zile ambazo mfumo wa utambuzi unaweza kumpa mpangaji wa uendeshaji:
- Iwapo njia ya kushoto, ya sasa na ya kulia zipo.
- Gari lililo karibu zaidi mbele na nyuma katika kila njia husika.
- Kasi ambayo kila pengo linapungua.
- Kasi ya sasa ya gari linalojifunza.
- Mwinuko mkali zaidi katika mita 100 zijazo.
- Hali ya sasa ya mpangaji wa kubadilisha njia.
Muundo ni 19 · 12 · 8 · 2, hutumia uamilisho wa tanh, na una uzani 362. Tokeo moja hudhibiti kanyagio. Jingine huchagua njia: thamani iliyo juu ya +0.5 huomba njia ya kushoto, huku thamani iliyo chini ya -0.5 ikiomba njia ya kulia.
Mpangaji na Muundo wa Gari
Mtandao wa neva huamua lini na wapi kusogea, lakini hauendeshi usukani moja kwa moja. Mpangaji aliyeandikwa kwa mkono hubadilisha ombi la njia kuwa ujanja salama na laini. Hutoa ishara kwa sekunde 0.7, hukagua njia lengwa, hufuata mkondo wa S wa quintic kwa sekunde 2.6, na hutumia uendeshaji wa pure-pursuit kufuata njia iliyopangwa.
Ikiwa gari jingine lipo sambamba na gari au linakaribia kuingia kwenye eneo lake lisiloonekana, mpangaji huendelea kutoa ishara na kusubiri pengo lifunguke. Kuachilia ombi wakati wa awamu ya kutoa ishara hughairi ujanja huo.
Gari lenyewe hutumia muundo wa baiskeli wa kinematiki katika vitengo vya SI. Vigezo vyake vinafanana na gari dogo la hatchback: urefu wa mita 4.4, kutoka 0 hadi 100 km/h kwa sekunde 9.8, kasi ya juu ya 115 km/h, na breki za hadi 8 m/s². Mshiko unaopatikana wa kupinda huweka kikomo cha kasi ya kupita kwenye kona.
Msongamano wa Magari, Ustahiki na Mageuzi
Magari ya nyuma hufuata Intelligent Driver Model. Magari yana kasi zinazotakiwa kati ya 61 na 94 km/h, hupita upande wa kushoto, hurudi kulia baada ya kupita, hutoa ishara kabla ya kubadilisha njia, na huitikia gari linalojifunza.
Ustahiki kimsingi ni idadi ya mita zilizosafiriwa. Gari hupoteza alama 300 likigongana au likinaswa na mstari wa magari ya polepole unaosafiri juu ya barabara. Pia hupoteza mita nne kwa kila sekunde inayotumia kwenye njia ya kushoto wakati njia iliyo kulia kwake iko wazi kabisa. Hakuna tuzo ya moja kwa moja kwa kupita; kupita huwa na manufaa kwa sababu kuliwezesha gari kusafiri umbali mkubwa zaidi.
Mageuzi hutumia mbinu kuu nne:
- Elitism: mitandao minne bora huhamishwa bila kubadilishwa katika mafunzo ya mstari wa amri.
- Uteuzi wa mashindano: mitandao yenye nguvu ina uwezekano mkubwa zaidi wa kuwa wazazi.
- Mchanganyiko wa BLX-0.25: uzani wa wazazi huchanganywa kuunda vizazi.
- Mabadiliko ya Gaussian: kiwango na ukubwa wa mabadiliko hupungua kwa nusu ya vizazi 40.
Usakinishaji na Usanidi wa Ndani
Clone hazina na uanzishe seva yake tuli ya ndani:
git clone https://github.com/Stxqq/self-driving-car.git
cd self-driving-car
npm run serve
Amri ya serve huanzisha seva ya HTTP ya Python kwenye porti 5101. Fungua http://localhost:5101 kwenye kivinjari chako.
Hakuna vifurushi vya kusakinisha. Seva yoyote tuli ya wavuti inaweza kuhifadhi mradi huu, lakini kufungua ukurasa moja kwa moja kupitia file:// hakutafanya kazi kwa sababu vivinjari huzuia moduli za ES katika muktadha huo.
Node.js 22 au mpya zaidi inahitajika kwa hati za majaribio na za mstari wa amri. Endesha mkusanyiko wa majaribio kwa:
npm test
Kutumia Kiolesura cha Kivinjari
Tazama Dereva Aliyefunzwa Awali
Tumia hali ya kutazama kuona mtandao uliotolewa ukiendesha katikati ya msongamano wa magari. Ukurasa huonyesha pembejeo na matokeo yake, njia iliyopangwa, hali ya kubadilisha njia, na takwimu za gari. Utepe wa buluu unawakilisha njia iliyotengenezwa na mpangaji.
Endesha Mwenyewe
Katika hali ya Kuendesha, unachukua nafasi ya mtandao wa neva huku ukihifadhi mpangaji uleule. Gari huanza likiwa na udhibiti wa mwendo uliowekwa kwenye 70 km/h.
- Shikilia
↑kuongeza kasi iliyowekwa. - Bonyeza
↓kufunga breki na kupunguza kasi iliyowekwa. - Bonyeza
←kuomba kubadilisha njia kwenda kushoto. - Bonyeza
→kuomba kubadilisha njia kwenda kulia.
Kadi ya mtandao huendelea kuonyesha kile ambacho ubongo uliofunzwa awali ungefanya, hivyo hali hii ni muhimu kwa kulinganisha maamuzi yako na maamuzi yake.
Funza kwenye Kivinjari
Hali ya mafunzo huanzisha magari 60 yenye uzani wa mtandao wa nasibu. Magari yote hutumia barabara moja wakati wa kizazi, na msongamano wa magari huongezeka hatua kwa hatua katika vizazi 15 vya kwanza. Raundi za awali huanza kwa sekunde 45. Gari linapodumu hadi mwisho, raundi zinazofuata huongezwa kwa nusu ya muda huo hadi kufikia muda wa juu wa dakika tano.
Mafunzo ya kivinjari hugundua haraka tabia ya kushikilia njia na kufuata magari, lakini kupita ni kugumu zaidi. Majaribio yaliyoelezwa na mradi yaligundua kuwa idadi ya watu iliyoanzishwa kwa nasibu kwa kawaida ilifanya mabadiliko ya njia 0.1 hadi 0.5 kwa kila kilomita hadi kizazi cha 15. Dereva wa awali aliyefunzwa mapema alihitaji takriban vizazi 170 vyenye idadi ya watu 200 kabla mabadiliko ya njia hayajaanza kuwa na manufaa.
Chagua From pretrained unapotaka kubadilisha kidogo ubongo uliosafirishwa badala ya kuanza na uzani wa nasibu. Akili zilizofunzwa kwenye ukurasa zinaweza kutumwa kama JSON na kupakiwa baadaye kwa kutumia kidhibiti cha Import.
Mafunzo kutoka kwenye Mstari wa Amri
Mafunzo ya mstari wa amri huendeshwa bila kiolesura katika nyuzi za wafanyakazi. Mfano ufuatao hufunza idadi ya mitandao 120 kwa vizazi 10, huku kila mtandao ukitathminiwa kwenye barabara tatu zenye mbegu zilizowekwa na vipindi vya sekunde 60:
node scripts/train.mjs --generations 10 --population 120 --seeds 3 --seconds 60
Kwa chaguo-msingi, ubongo unaotokana huandikwa kwenye runs/brain.json. Hii hutenganisha majaribio na mtandao uliosafirishwa ulio kwenye src/brains/pretrained.json.
Kifundishaji huripoti takwimu kama vile umbali bora na wa wastani, idadi ya magari yaliyosalia, kiwango cha mabadiliko, na muda uliopita. Kizazi cha sifuri huenda tayari kikawa na magari yanayodumu kipindi kifupi kizima kwa sababu kipangaji huyahifadhi katikati ya njia zao. Kwa hiyo, maendeleo mara nyingi huonekana kwa urahisi zaidi katika ongezeko la wastani wa idadi ya watu kuliko katika matokeo bora ya gari moja.
Chaguo Muhimu za Mafunzo
--densityhubadilisha kiasi cha msongamano wa magari.--resumehuanza kutoka kwenye ubongo ulio kwenye njia iliyobainishwa na--outna hutumia mabadiliko madogo zaidi.--generationshudhibiti idadi ya raundi za mageuzi.--populationhudhibiti idadi ya akili zinazotathminiwa kwa kila kizazi.--seedshudhibiti idadi ya mbegu za barabara zinazotumika.--secondshuweka muda wa kila kipindi.
Mchakato wa mafunzo uliotumika kwa ubongo uliosafirishwa umehifadhiwa kwenye scripts/curriculum.sh. Unaendelea kutoka vipindi vya dakika mbili katika msongamano kamili wa magari hadi vipindi vya dakika tano kwenye barabara nyingi zaidi, kisha unamalizia kwa awamu ya uboreshaji wa kushikilia kulia. Kulingana na nyaraka za mradi, mtaala huu ulichukua takriban saa moja kwenye kompyuta mpakato yenye viini 14.
Kutathmini Ubongo Uliofunzwa
Tathmini hupima ubongo kwenye barabara za kubainishwa ambazo haukukutana nazo wakati wa mafunzo. Endesha mtathmini kwa orodha ya mbegu za barabara:
node scripts/evaluate.mjs --seeds 9001,9002,9003,9004,9005
Matokeo huripoti umbali, muda uliopita, kasi ya wastani, mabadiliko ya njia, na ikiwa kila uendeshaji uliisha kwa muda kuisha au gari kuanguka. Pia huhesabu thamani za jumla kama vile umbali wa wastani na wa kati.
Ili kutathmini mtandao uliotumwa au uliofunzwa upya badala ya ubongo uliosafirishwa, pitisha faili yake ya JSON kwa --brain:
node scripts/evaluate.mjs --brain runs/brain.json --seeds 9001,9002,9003
Matokeo rasmi yanaweza kuzalishwa upya kwa:
npm run evaluate -- --write
Amri hii huandika scripts/results.json, ambayo pia husomwa na kiolesura cha kivinjari.
Kuelewa Matokeo Yaliyochapishwa
Mtandao uliosafirishwa wenye uzani 362 ulijaribiwa kwa dakika tano kwenye mbegu 30 zilizotengwa, katika msongamano kamili wa magari. Ulipata umbali wa wastani wa kilomita 6.90, wa kati wa kilomita 7.23, na kasi ya wastani ya kilomita 87 kwa saa. Uendeshaji 28 kati ya 30 ulikuwa bado unaendelea baada ya dakika tano, na gari lilifanya wastani wa mabadiliko ya njia 5.1 kwa kila kilomita.
Mradi unalinganisha mfumo huu na toleo la awali lililoendesha moja kwa moja kwa kutumia vitambuzi 14 vya miale. Mtandao huo wa zamani ulipata wastani wa kilomita 4.05 na kilomita 56 kwa saa, huku uendeshaji 20 kati ya 30 ukiwa bado unaendelea baada ya dakika tano. Ulinganisho huu si kipimo kinachodhibitiwa kwa sababu mfano wa msongamano wa magari pia ulibadilika, lakini unaonyesha kwa nini kutenganisha maamuzi yaliyojifunzwa na uendeshaji uliopangwa kulifanya iwe rahisi kugundua upitaji.
Mtandao huchagua kanyagio na njia lengwa; kipangaji hushughulikia kutoa ishara, kukagua nafasi, na kuendesha kwa ulaini.
Vidokezo vya Juu
Tumia Mbegu Nyingi Kupunguza Uzoezaji Kupita Kiasi
Ubongo unaofanya vizuri kwenye barabara moja unaweza kushindwa kwenye nyingine. Ongeza idadi ya mbegu za mafunzo na tenga mbegu tofauti kwa uthibitishaji na tathmini ya mwisho. Kifundishaji kisicho na kiolesura hutathmini kila ubongo peke yake kwenye barabara yake kwa sababu msongamano wa magari huitikia gari linalojifunza; hii huzuia tabia ya mgombea mmoja kubadilisha alama ya mgombea mwingine.
Endelea Kabla ya Kuanza Upya
Ikiwa ubongo uliofunzwa tayari unashikilia njia na kuepuka msongamano wa magari, tumia --resume au chaguo la pretrained la kivinjari. Kuanzia na uzani wa nasibu kunafaa kwa kuchunguza mageuzi kutoka mwanzo, lakini tabia ya hali ya juu ya kupita inaweza kuhitaji vizazi vingi zaidi na idadi kubwa ya watu.
Ongeza Ugumu Hatua kwa Hatua
Fuata mbinu ya mtaala ya hifadhi: anza na vipindi vya muda unaoweza kudhibitiwa, kisha ongeza muda, aina mbalimbali za barabara, na kina cha tathmini. Vipindi virefu hutoa ushahidi bora wa uendeshaji thabiti, lakini hufanya kila kizazi kuwa ghali zaidi.
Hifadhi Uamuzi wa Matokeo
Uigaji huu una uamuzi thabiti hadi kwenye hatua zake za muda zisizobadilika: mbegu na akili zinazofanana hutoa njia zinazofanana. Vidhibiti vya kasi huendesha hatua nyingi zaidi za uigaji za sekunde 1/60 kwa kila fremu inayotolewa badala ya kubadilisha hatua ya fizikia. Hii huwezesha mafunzo ya kasi bila kubadilisha matokeo.
Jua Mahali pa Kurekebisha Mradi
src/sim/ina msimbo wa barabara, gari, utambuzi, mpangaji, trafiki, ulimwengu, ubongo na mageuzi bila utegemezi wa DOM.src/render/ina jukwaa la canvas, uonyeshaji wa mtandao, mwonekano wa anatomia na chati.src/ui/ina vipindi vya kutazama, kufundisha na kuendesha, hifadhi na ushughulikiaji wa kibodi.src/brains/ina mtandao uliofunzwa awali.scripts/ina faili za mafunzo, mtaala, tathmini na matokeo.test/ina majaribio ya Node.js, yakiwemo ukaguzi wa marudio yaliyotengwa.
Hitimisho
Mradi huu unaonyesha jinsi mtandao mdogo sana wa neva unavyoweza kujifunza maamuzi ya kiwango cha juu ya uendeshaji wakati mpangaji wa kawaida anashughulikia uelekezaji sahihi na utekelezaji wa mabadiliko ya njia. Anza kwa kuendesha onyesho la kivinjari, linganisha maamuzi ya mwongozo na ya neva, kisha utumie hati za Node.js kufunza na kutathmini akili zako mwenyewe. Utekelezaji wake usio na utegemezi na uigaji wake wa kubainika pia huufanya kuwa msingi wa msimbo unaofaa kwa kusoma ujifunzaji wa mageuzi, miundo ya magari, tabia za trafiki na upangaji.
