[{"data":1,"prerenderedAt":561},["ShallowReactive",2],{"project-40041198":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":35,"aspects":36,"strip":45,"post_text":47,"what":48,"said":83,"maker_in_thread":165,"shape":176,"grid":181,"attempts":522,"same_week":523,"maker_shows":34,"maker_hidden":553,"reader_version":554,"card":555},"40041198","gypsum","Building a GPS receiver","title","Show HN: Building a GPS receiver","https:\u002F\u002Faxleos.com\u002Fbuilding-a-gps-receiver-part-1-hearing-whispers\u002F","axleos.com","codyd51",1713192130,2024,552,128,52,3515,2,"legend","learning_science","gps receiver signal processing","library",[24,25,26,27,28],"gps receiver","software defined radio","gnss","signal processing","rtl-sdr","loved",0.413,{"positive":32,"neutral":33,"mixed":34,"critical":34},16,11,1,29,{"execution":37,"design":39,"idea":41,"docs":42,"privacy":44},{"positive":38,"critical":34},3,{"positive":34,"critical":40},0,{"positive":18,"critical":40},{"positive":43,"critical":40},5,{"positive":40,"critical":40},[40,40,38,40,43,40,40,43,43,40,40,40,40,43,40,40,40,40,40,40,40,38,43,40,43,38,40,38,43,40,38,43,43,46,40,38,40,38,38,43],4,"Hi everyone!\n\nShortly after publishing my iOS 4 jailbreak last October[1], I got to work on my next hobby project: a from-scratch homebrew GPS receiver, which can solve the user’s location solely from billions of radio antenna samples.\n\nI took a commodity SDR (alongside the Python standard library and numpy) and built a signal processing pipeline that can detect and track GPS satellites over many minutes, drop and pick up satellites as they come in and out of view, and precisely determine the user’s position and clock inaccuracy.\n\nAll told, gypsum can go from a cold start to a fix on the user’",{"problem":49,"audience":55,"pricing":55,"motivation":56,"time_to_build":55,"stack":60,"openness":80,"stage":81,"team_size":82},{"value":50,"source":51,"evidence":52},"Computes a GPS position and time fix from raw radio samples without GPS-specific hardware","maker",[53],{"id":54},"post",null,{"value":57,"source":51,"evidence":58},"Hobby project to learn how GPS signals are detected and decoded",[59],{"id":54},[61,68,72],{"value":62,"source":51,"evidence":63},"Python",[64,65],{"id":54},{"id":66,"by":11,"text":67},"40042471","Hi! Yes, \"from scratch\" is definitely always a bit of a funny term. I also implemented the receiver in Python, which is quite far from \"scratch\" =). What I mean by it in this…",{"value":69,"source":51,"evidence":70},"numpy",[71],{"id":54},{"value":73,"source":74,"evidence":75},"RTL-SDR","commenter",[76],{"id":77,"by":78,"text":79},"40042064","AdamJacobMuller","Cool article. Whenever I see \"from scratch,\" I'm always curious to see how from scratch the author actually means so I'll admit I was a bit disappointed to see that the hardware…","unknown","launched","solo",{"praise":84,"objections":100,"requests":119,"questions":137,"alternatives":149},[85,96],{"value":86,"source":74,"evidence":87},"Impressive technical achievement from a self-taught programmer",[88,92],{"id":89,"by":90,"text":91},"40042615","sizzzzlerz","Brilliant! I have no idea what the technical background of the author is but for anyone to tease apart the vast, complex, details of the GPS universe is a massive feat. Coupled…",{"id":93,"by":94,"text":95},"40041993","noman-land","Really amazing piece of work. I look forward to digging into it. Thanks for sharing.",{"value":97,"source":74,"evidence":98},"Fast time to first fix is impressive",[99],{"id":77,"by":78,"text":79},[101,105],{"value":102,"source":74,"evidence":103},"Hardware is only an RTL-SDR, so not truly from scratch",[104],{"id":77,"by":78,"text":79},{"value":106,"source":74,"evidence":107},"Fast fix explanation questioned; brute force claim disputed",[108,112,116],{"id":109,"by":110,"text":111},"40042686","tialaramex","The fast TTFF on a typical modern device e.g. your phone is because the device has the Internet, and so it can obtain all the information it needs from the Internet up front, it…",{"id":113,"by":114,"text":115},"40044031","michaelt","You don't need to brute force the almanac - why would you? But it's very much feasible to 'brute force' your initial signal lock by searching for all gold codes at a range of…",{"id":117,"by":110,"text":118},"40045242","> You don't need to brute force the almanac - why would you? I have no idea, but the claim was that you get faster fix with brute force when I know that's not why it's fast in…",[120,131],{"value":121,"source":74,"evidence":122},"Support for Galileo and other GNSS constellations or the encrypted P(Y) code",[123,127],{"id":124,"by":125,"text":126},"40050159","kaitocross","Does it only support the US-made GPS (NAVSTAR GPS) or other GNSS systems like Galileo as well?",{"id":128,"by":129,"text":130},"40042597","pictureofabear","Now do it for the encrypted signal (the P(Y)-code)!",{"value":132,"source":74,"evidence":133},"Pseudorange comparison with a commercial receiver",[134],{"id":135,"by":114,"text":136},"40044099","Great project, thanks for posting it! It just so happens I've got an RTL-SDR, a GPS receiver that outputs raw pseudoranges, and a signal splitter that lets me put the signal from…",[138,142],{"value":139,"source":74,"evidence":140},"Does it support GNSS systems beyond NAVSTAR GPS?",[141],{"id":124,"by":125,"text":126},{"value":143,"source":74,"evidence":144},"How to run it on Windows with pip",[145],{"id":146,"by":147,"text":148},"40042491","CamperBob2","Anyone manage to get this working with pip in Windows? After installing the dependencies: ``` C:\\dev\\gps\\gypsum-release>gypsum-cli.py Traceback (most recent call last): File…",[150,158],{"value":151,"source":74,"evidence":152},"Commercial GPS receivers and Stanford GNSS course material",[153,157],{"id":154,"by":155,"text":156},"40043034","throw0101c","Standford has\u002Fhad a course that is available online on GPS\u002FGNSS and a lot of the nitty-gritty details: * https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLGvhNIiu1ubyEOJga50LJMzVXtbUq6CPo",{"id":77,"by":78,"text":79},{"value":159,"source":74,"evidence":160},"Ciechanow's GPS explainer",[161],{"id":162,"by":163,"text":164},"40041347","blobcode","A good, decently detailed look at signal processing required. I also like https:\u002F\u002Fciechanow.ski\u002Fgps\u002F, which has some fantastic visuals to go along with this explanation.",{"comments":166,"answered":167,"key":168},15,6,[169,172,173],{"id":170,"text":171},"40050999","This is amazing! I had no idea tech like this was available on the market. Thank you for the correction.",{"id":66,"text":67},{"id":174,"text":175},"40042946","Yes, I forgot to mention downloading the orbital parameters over the network! Thanks for mentioning this as well. In this case, I was meaning to refer to brute-forcing the…",{"commenters":177,"max_depth":178,"maker_replies":166,"first_comment_mins":179,"lifespan_hours":180},70,7,9,349,[182,186,190,192,195,198,200,204,206,210,213,216,218,222,224,228,229,232,233,234,237,239,242,245,248,250,253,257,261,264,267,270,272,275,277,279,282,285,287,290,292,295,296,299,300,303,306,310,313,316,318,321,324,327,330,333,336,338,340,342,345,347,350,352,355,358,360,362,365,369,373,376,378,381,383,386,388,389,391,394,397,399,401,403,405,409,412,417,421,423,425,427,431,433,435,439,441,443,446,450,455,457,461,463,467,470,473,477,479,481,483,486,488,490,492,494,496,499,501,503,508,511,513,515,517,521],[183,40,40,184,185,40],"40043323","commenter\u002Fneutral\u002Fdesign","amluto",[187,40,40,188,189,40],"40043653","commenter\u002Fneutral\u002Fnone","elevation",[191,40,40,188,185,40],"40043748",[193,40,40,188,194,40],"40045063","londons_explore",[196,40,40,184,197,40],"40044644","AnarchismIsCool",[170,40,40,199,11,34],"commenter\u002Fpositive\u002Fidea",[201,40,40,202,203,40],"40206905","commenter\u002Fpositive\u002Fnone","kragen",[77,34,38,205,78,40],"maker\u002Fmixed\u002Fexecution",[207,34,40,208,209,40],"40042137","other\u002Fneutral\u002Fdocs","rollulus",[211,34,40,212,78,40],"40042208","other\u002Fpositive\u002Fdocs",[214,34,40,208,215,40],"40042417","magnat",[66,34,40,217,11,34],"maker\u002Fneutral\u002Fperformance",[219,34,43,220,221,40],"40042635","maker\u002Fpositive\u002Fexecution","Cyph0n",[109,34,40,223,110,40],"commenter\u002Fneutral\u002Fperformance",[225,34,40,226,227,40],"40042807","other\u002Fneutral\u002Fnone","aaronax",[174,34,40,217,11,34],[230,34,40,223,231,40],"40043580","makomk",[113,34,40,223,114,40],[117,34,40,223,110,40],[235,34,40,223,236,40],"40045514","error503",[238,34,40,223,114,40],"40045733",[240,34,40,188,241,40],"40046951","myself248",[243,34,43,244,78,40],"40055686","maker\u002Fpositive\u002Fnone",[246,34,43,247,114,40],"40042930","project\u002Fpositive\u002Fdesign",[249,34,40,184,231,40],"40043416",[251,34,40,226,252,40],"40042931","shrx",[254,34,43,255,256,40],"40042939","project\u002Fpositive\u002Fidea","progbits",[258,34,40,259,260,40],"40043598","commenter\u002Fcritical\u002Fnone","epcoa",[262,34,40,188,263,40],"40043703","kube-system",[265,34,40,226,266,40],"40044616","sllabres",[268,34,40,269,194,40],"40045267","other\u002Fpositive\u002Fdesign",[271,34,40,259,241,40],"40045414",[273,34,40,188,274,40],"40046956","aspenmayer",[276,34,40,188,241,40],"40047626",[278,18,40,226,215,40],"40043343",[280,18,40,226,281,40],"40044101","nomel",[283,18,40,226,284,40],"40044820","opello",[286,18,40,226,194,40],"40045105",[288,18,40,226,289,40],"40045236","Scoundreller",[291,18,40,226,284,40],"40046995",[293,18,40,226,294,40],"40045912","analognoise",[162,38,40,212,163,40],[297,38,40,212,298,40],"40045445","klabb3",[89,46,43,220,90,40],[301,46,40,188,302,40],"40047998","AlexanderTheGr8",[304,46,40,305,11,34],"40051036","maker\u002Fpositive\u002Fidea",[307,43,40,308,309,40],"40042713","other\u002Fpositive\u002Fnone","tylerchr",[311,43,40,226,312,40],"40043632","d33",[314,43,40,226,315,40],"40044530","pomian",[317,43,40,244,11,34],"40051031",[319,167,40,226,320,40],"40043334","OmarShehata",[322,167,40,226,323,40],"40043428","jeffbee",[325,167,40,226,326,40],"40043719","outworlder",[328,167,40,226,329,40],"40044023","nix0n",[331,167,40,226,332,40],"40047842","seba_dos1",[334,167,40,226,335,40],"40048644","RF_Savage",[337,167,40,226,197,40],"40044717",[339,167,40,226,241,40],"40045478",[341,167,40,226,323,40],"40046032",[343,167,40,226,344,40],"40050745","mikewarot",[346,167,40,226,320,40],"40048803",[348,167,40,226,349,40],"40048957","globalise83",[351,167,40,188,263,40],"40043787",[353,167,40,188,354,40],"40056058","simplyluke",[356,167,40,188,357,40],"40044228","duskwuff",[359,167,40,188,241,40],"40045434",[361,167,40,188,332,40],"40047828",[363,167,40,188,364,40],"40050881","withinboredom",[366,178,38,367,368,40],"40046016","project\u002Fneutral\u002Fnone","wglb",[370,371,43,372,94,40],"40042134",8,"project\u002Fpositive\u002Fdocs",[374,371,40,375,11,34],"40051059","maker\u002Fneutral\u002Fnone",[377,371,43,244,94,40],"40059669",[379,179,40,226,380,40],"40042541","js2",[154,382,40,226,155,40],10,[384,382,40,226,385,40],"40049415","quibono",[387,382,40,226,11,34],"40051152",[135,33,43,244,114,40],[390,33,40,375,11,34],"40051117",[392,393,38,367,332,40],"40047743",12,[395,393,40,226,396,40],"40049767","tgsovlerkhgsel",[398,393,40,226,332,40],"40049929",[400,393,40,226,396,40],"40050124",[402,393,40,188,332,40],"40050329",[404,393,40,188,396,40],"40105281",[406,407,40,226,408,40],"40043991",13,"ck2",[410,407,40,226,411,40],"40052527","nayuki",[413,414,43,415,416,40],"40182297",14,"maker\u002Fpositive\u002Fdocs","ChuckMcM",[418,166,34,419,420,40],"40044096","project\u002Fcritical\u002Fexecution","NovemberWhiskey",[422,166,40,375,11,34],"40051167",[424,32,43,372,396,40],"40049744",[426,32,40,244,11,34],"40051024",[428,429,40,226,430,40],"40044802",17,"ruuda",[432,429,40,226,236,40],"40045029",[434,429,40,226,368,40],"40046196",[436,437,38,438,302,40],"40048007",18,"project\u002Fneutral\u002Fidea",[440,437,40,226,396,40],"40049772",[442,437,40,375,11,34],"40051105",[444,437,40,226,445,40],"40050043","minetest2048",[447,448,43,255,449,40],"40050511",19,"wkat4242",[451,452,43,453,454,40],"40048535",20,"project\u002Fpositive\u002Fnone","jeffypoo",[456,452,40,244,11,34],"40051099",[458,459,43,372,460,40],"40052349",21,"two_handfuls",[462,459,40,244,11,34],"40055236",[464,465,43,453,466,40],"40112741",22,"bArray",[146,468,38,469,147,40],23,"project\u002Fneutral\u002Fexecution",[471,468,40,188,472,40],"40042639","icegreentea2",[474,475,38,438,476,40],"40042416",24,"darkhorn",[478,475,40,438,11,34],"40042511",[480,475,40,188,129,40],"40042645",[482,475,40,188,236,40],"40045201",[484,475,38,438,485,40],"40042520","Rebelgecko",[487,475,38,438,476,40],"40042643",[489,475,40,226,485,40],"40045016",[491,475,40,226,476,40],"40046200",[493,475,40,188,236,40],"40045316",[495,475,40,188,129,40],"40042774",[497,475,38,367,498,40],"40043301","cromulent",[500,475,40,188,263,40],"40043506",[502,475,40,226,332,40],"40047856",[504,505,38,506,507,40],"40047028",25,"project\u002Fneutral\u002Fprivacy","emehrkay",[509,505,40,188,510,40],"40057386","martinky24",[124,512,38,438,125,40],26,[514,512,40,438,11,34],"40051093",[93,516,43,220,94,40],27,[518,519,43,415,520,40],"40076019",28,"hcfman",[128,35,38,438,129,40],[],[524,529,534,539,544,549],{"id":525,"name":526,"points":527,"category":528},"40003710","OptiGap sensor",886,"hardware",{"id":530,"name":531,"points":532,"category":533},"40017180","Mazelit",517,"games",{"id":535,"name":536,"points":537,"category":538},"40033490","markdowndown",441,"productivity",{"id":540,"name":541,"points":542,"category":543},"40067677","Effort",419,"ai",{"id":545,"name":546,"points":547,"category":548},"40028111","index advisor",417,"data",{"id":550,"name":551,"points":552,"category":528},"40014937","Recovery Kit 2",403,false,"v2",{"id":556,"name":5,"line":6,"ai":553,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":557,"top":18,"kw":558,"maker":11,"domain":10,"tier":19,"attempts":40,"strip":559,"url":9,"mix":560,"praise":86,"objection":102,"sub":21},40041198,0.41,[24,25,26,27,28],"0030500550000500000003505303503554030335",[32,33,34,34],1794036653140]