First Book Scan ======================================================= A G15 PMN FCM Open Robotics SUBPAGE Program including source and entrainment databases: {{{PROGRAM IN PROGRESS: SOME parts of it done.}}} {{{What's fully finished is this tool: RECTUNE}}} G15 PMN FCM ROBOAPP First Book Scan: App# 5550010 get it here This is roboapp update #1 at June 14th 2018. Progress keywords these weeks: still more movement entrainment {from k:101 to k:107}. We are also working on Avenuege robot hardware incl electronics in between work on this. {{{At the completion of each roboapp,}}} {{{a Linux autostart version provided}}} {{{as separate .zip, all .sh's included.}}} *****NEONG15WAYS & G15RWX: *****Easily set a PC to autostart G15 roboapps *****eg w/the KdeNeon w/Wayland: *****neong15ways.zip *****Just read instructions in 015inneon.txt, *****to supplement instructions in OpenRobotics page. *****Sometimes (also in Ubuntu) old xorg login *****is wanted: add g15rwx.zip to the package. *****Alternative: an ubuntu offering Wayland can use theg15ways.zip *****setup info for this: 015setup.txt. SUITABLE ROBOHARDWARE FOR PERFORMING THIS: AL5d roboarm, SSC32U card, and one extra free servo eg HJ S3315D with a 'plate', here called 'handle #1', plugged into channel #29. And three cameras, two placed over the book, one mounted on the roboelbow of the AL5d. SUITABLE ENVIRONMENT FOR RUNNING THIS ROBOAPP: In a room with a desk and a book; as always, unless a robot is specificially designed to be safe for children, keep children away from robots. On this page you find detailed instructions for setup and they contain additional normal security precautions that ought to be followed before this roboapp is started; those who start up a roboapp have responsibility for what happens. {To main page: genifun.com/openrobotics} ======================================================= First Book Scan This task is about getting a book scanned {in order to 'backup' books for private purposes, not to upset anyone's copyright}. Robohardware here: a standard AL5D arm, a standard SSC32U card, a light camera mounted on roboelbow, the two others placed above and to the right of book: camera#2 bottom of bookpage, camera #3 top of it; a handle, 'handle#1', composed of a single servo which has a plate suitable for holding pages and which is plugged into channel #29 of the card. Degree of practicality and generality: this is chiefly a pedagogical task but it is meant to be useful for a suitable range of books given an intense willingness not just to set it up in identical fashion, but also to modify the matching numbers and such so that the program will tolerate different lights, colors and so on. Even if you are in a hurry to try this roboapp, carefully read through all the setup info given after the program, at the completion of this page. ======================================================= FIRST BOOK SCAN =======================================================
======================================================= COMMENTS ABOUT THIS ROBOTIC TASK/SET ======================================================= FIRST: IS THE ROBOHARDWARE HERE USED THE IDEAL ONE FOR THIS TASK/TASK SET? Thanks to the handle we've added, and with the condition that the human interactor is willing to manually take up the book and turn it on its head--so that the app can scan all the right pages twice over to get all the book scanned--it is fairly ok equipment for getting it right: but that on the condition that the TYPES of books are suitable for this type of leafing and so it is not an ultra-general roboapp. As for the images, we get the computer to sort out the scanned images rightly enough afterwards. We COULD say, though, that this is a task that should have, ideally, a whole bundle of roboarms and several more cameras as well--or the cameras should be moved by the extra roboarms. The reasons are simple: As we know, the dynamics of turning pages in a book, and keeping the book open without applying pressure, are more art than science. This, for some reason, is especially so when books are to be photographed --it is exactly then that we find that pages roll over, the book starts folding completely, and so on, as if it were frightened that somebody is about to steal its soul. This varies not only from book to book but from, well, chapter to chapter, making fun of a programmer trying to construct a systematic approach to it. In addition, let us clearly get it said that we are starting out with a series of G15 PMN roboapps with this app, and this app is very much tied up to getting the robotic environment and setup precisely as we have it here--and even then, be prepared to do initial adjustments before it works practically. Anyway. The way we set it up, though, works fairly well in case of books that "don't protest" too much and on the condition you are okay with turning the book around on its head after all the right pages have been photographed, so it gets to photograph all its left pages (the program will handle the sorting and turning back of the images). Whatever the case, it is doable, and, despite or because of all its little challenges, it is an interesting task to program and the result, it may seem, is practical and useful enough. The robot, it is true, has to spend a lot of time with each book to get it scanned. But then, it means that we humans can get other and more interesting things done, in the knowing that machines around us slave for us. In some cases, while most of the book gets photographed this way, manual photographing may have to supply the collection due to a bunch of unruly pages that stick together when the roboarm AL5D tries to flip from one page to the next. Example of what VUROBOCAM2 or VUROBOCAM3 can pick up--after a shift of the photo ninety degrees followed by an contrast adjustment to make it more easy for us to see what's actually of information there--and which the OCR (Optical Character Reader) program should be able to dechipher with some correctness. (The bits of French in italic won't make it easier, but then, that's literature.) THEN, LET'S DO IT! The book shown on the photo is a much-loved old Wodehouse pocket book, presently in danger of being 'read to pieces'. The program and its entrainment databases, however, are made with an orientation to handle a range of books. But this is a "first" book scan also in the sense that there are a lot of dependencies here on angles, on light intensities, on book size, on placement of camera#1, and so on. It is only to be assumed as normal that this app requires fine-tuning of various kinds before startup. So, to rescue an old PGW masterpiece from 1925, I exercise my right to make private backups of my bought literary property and step one is--very cleverly I must admit--to acquire some highly classical pieces of rubber erasers, cut them up to roughly square size, and don them to the AL5 roboarm as accessories in this first momentous task for it. Two pieces of rubber, then, are picked up by the AL5D robogripper and suddenly the AL5D can leaf through the book as with a very slightly damp finger, not causing damage to the pages. We are not exactly talking of the gentle touch, with finesse, and if it were a first printing, I would have paid my secretary overtime to do it instead. {More experiments with unruly books show that some extra simple folded cardboard-work is usually a good idea to help keep the left pages of the book in place when the right pages are photographed--consult photos underneath in this webpage, and more text there.} Indeed, such pieces can be used to keep the pages suitably in check while the photographing goes on, and these can be moved around by the AL5D roboarm. At least, that is the idea. In practise, the roboarm may have to "navigate" the book fairly much to get the scanning work done, and the pieces may have to be put here, then there, and if they roll away the process halts until assistance from a human is brought on. But, then, this is a "first" book scan, and for very simple equipment, to get us going in various ways--also as regards getting to grips with the overall structures of roboapps. Cameras #2 and #3 is placed above on one side of the book, and together they will photograph the right-hand page of the book--given that this page doesn't curl or bend too much. When done with all one side of the book, it is turned upside-down and the program does exactly the same thing over again, getting all the remaining pages photographed. The camera #2 should get the bottom of the page, and camera #3 takes the top of it; and they should be positioned individually so as to give as much sharpness as they can give. For a book of hundreds of pages, given that it works out without too much clutter, that's still greatly more simple than to leaf through the book correspondingly many times in order to scan each page. The resulting image series must to be sorted adequately and put to an OCR program [[[which is not directly part of the scope of this example; however we will very soon link to a G15 PMN solution for that, too]]]. In that way, hardly anything has to be done in the nature of boring tasks on the part of the human being--and this is in alignment with the idea that robots are there to do what would be excessively boring (or dangerous) to do for humans. The beauty of this example from the viewpoint of starting out with robotic programming is that, at least during initial construction of the app, one can get going without any matching through the cameras. But, as said, books behave differently when leafed through and the program, through camera input, must be able to match over the possibility that the pages aren't getting in the proper position and by adjusting motions handle that as well as it can do, without the ranges of actions possible, in some cases by by calling, through the PC screen, on assistance from a human operator. When it does adjustments of its own, relative to its prerecorded task snippets, it does so within its socalled "FCM" matrix. We are putting the recorded, or entrained, moves, to the K disk, to K100, K200 and so on (a roomy solution, as it's typically a question of a dozen or a few dozen cards in each case). These entrained moves are made into what we could call 'task snippets' so that it is easy for the program to get in between them with adjustments when called for. Adjustments and the matching or feature analysis is done, of course, in what the Third Foundation G15 PMN labels "FCM". This is an abbreviation of a grand name--First-hand Computerised Mentality--but it is also a summary of a philosophical insight, derived from Kurt Goedel's famous second incompleteness theorem: that we mustn't try and codify intelligence. As a result, FCM is a framework that is entirely and very consciously unfinished. It must be programmed anew each time we wish to apply it. So, we are calling on our own conscious creative perception-action, and are not trapped within the goedelian incompleteness. In other words, we are not entertaining any hypocrisy around the idea of trying to codify 'intelligence'. Rather, we are EXPRESSING our natural intelligence in suitably concrete robotic algorithms, each time anew. That means that, in contrast to the general falseness surrounding those who wish to do thing under the slogan of "machine intelligence" (or "machine learning" or "machine awareness" or any of their many other easy, cheap terms), we have an honest approach, with integrity, and respect for the human mind, and yet with adequate realism and passion as for making good robotic programs. Let us, when these points are made here, clearly state that the point about the goedelian incompleteness and the necessity of applying human creative intelligence and intuitive perception-action is really applying to far more advanced cases. But we are making the point here, in what is almost a 'Hello world!' type of simplest robotic task possible, because, when it comes to eg making a robot that drives a bus-train in, say, a special-made tunnel--with tunnel stations allowing admittance and exit of human passengers--we know what's what about the grand themes of not assuming that machines can be smart. No matter how cleverly we program a robot, the context must be well-defined and related to completely by the human beings doing the programming. And so, robots can be given the task of driving in special-made tunnels, because there the context is well-defined, but they should not be given the role of driving along open roads where all sorts of natural fluctuations can take place. In having clear minds about the limits of algorithms right from the very simplest starting-point, we are 'travelling light' and can go very far. To return to the present robotic task (or, more precisely, "task set", for there are always more to the robot program than merely a single 'task' in a narrow sense). So while there are many 'output-only' phases, apart from camera#2 & #3 used to photograph the pages, there must be a regular check with camera#1 as for what moves should come next. Also, there will be a different handling of the beginning of the book, the middle of the book, and the completion of the book, concerning how the pages are to be leafed and how the pages are to be kept properly in place to allow the scan. So, indeed, it is an input/output robotic program, both with elements of entrained robotic tasks, and with elements of pattern matching, and with some elements of specially programmed movements as suitable adjustments once in a while. ======================================================= COMMENTS ABOUT THIS G15 PMN FCM PROGRAM ======================================================= First of all--the program as listed here is long, yes, but the exact specific part that actually does the First Book Scan job is minuscle. It is the concise set of FCM nodes for the feature analysis and task definitions and so on that make up the content specific to this roboapp. Just compare with the next roboapp in this list--you'll see that it is just the final bunch of cards that is changed, even though it has got nothing to do with books. One could argue that, given the simple overall description of the input/output requirements in this case, one should put up with a very simple and short type of program. However, you and me are in this for the long haul, and we want to get acquainted with a program structure that can handle both the simplest cases and the most complex cases. We want the full FCM matrix up, nothing less; we want every robotic movement to be re-presented as 60bit numbers--for these are beautifully handled in the matrix, and can be decoded and re-encoded so as to make new movements; and we want every result of the feature analysis of the input camera views to be presented also as 60bit numbers, on "the other side" of the FCM matrix. This requires a bit of coding: in a sense, a lot. But the beauty of it is that once we go to the NEXT task set, and the task set after that, and so on, all we have got to do is to completely rewrite the bit that does the pattern matching and the task changing inside the FCM (in other words, we must always relate to the new context by creative programming, there is no general pattern matching function). The whole 'building' around it, in terms of a FCM matrix, is however subject to much the same coding cards as in this first example. However, of course, when we go to medium advanced and then also advanced FCM examples, the complexity within that building, and the size of the matrix in RAM, too, is considerably bigger. So, in short, while this robotic task involves a clear jump in the quantity of program cards compared to the core on the main Open Robotics page of ours, the next tasks, or task sets, do not have such a clear jump, but rather builds on this. So this is a long-term fruitful approach, so we stick to doing things in a GENERAL way, right in the beginning. So, after the photos next comes the whole program, with the new FCM parts after the core--the core, that is, which is more or less exactly identical to that which is listed at our main Open Robotics page. Tips as to how to get it to work on your own robot after the program. BE SURE TO READ THROUGH ALL THE SETUP INFO AFTER THE PROGRAM BEFORE YOU TRY THE PROGRAM. THERE ARE IMPORTANT THINGS TO NOTE THERE--BOTH ABOUT THE HARDWARE AND ABOUT HOW TO RE-ENTRAIN INPUT AND OUTPUT TO/FROM THIS PROGRAM. ======================================================= PHOTO SERIES W/UPCOMING ROBOPROGRAM IN ACTION ======================================================= Installation instructions have two parts: the photos, shown next, and the suitable portions of the text that come after the program code--towards the completion of this page. Note that pieces of squarish rubber erasors are used, a number of precise adjustments of heights of roboarm relative to book and lights may be in place; and that, in addition, the handler we've added is used on the left pages to hold them in place when the right pages are photographed.
[[[Also: photos from camera#1, #2, and #3 to come here]]] ======================================================= THE ROBOTIC G15 PMN FCM PROGRAM ITSELF ======================================================= FULL SOURCE {WHERE CARDS <i1> UP TO CA <i430> MAKE UP THE CORE--CHANGED ONLY AT A COUPLE OF PLACES WHERE NOTED TO ALLOW FOR PARALLEL CHANNEL WORK WITH RECACT; APART FROM THAT, ONLY THE CARDS AFTER THIS SET ARE SPECIFIC TO THIS APP, AND OF THEM, REALLY ONLY THE LAST DOZENS OF CARDS ARE ENTIRELY SPECIFIC TO THIS APP}. NOTE THAT THE LINK TO THE PROGRAM SO YOU CAN RUN IT AS AN APP IN G15 PMN IS AT THE TOP OF THIS PAGE; PLS READ THE SETUP INSTRUCTIONS AFTER THE PROGRAM LISTING BEFORE USING THIS G15 PMN APP TO DRIVE ROBOTIC EQUIPMENT. HERE IS THE SOURCE {BEST READ IN THE G15 CAR EDITOR, THOUGH}: <i1> |Open robotics |Extends the |g15 pmn fcm |g15 pmn |app: first |open robotics |book scan, |app{5558889} |app#5550010; |and meant to |by srw; for |be run in an |al5d w/extra |environment |handler&3cams |like g15robot <i2> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Next, we |to/from robot |have config |are set up; & |cards, where |config for |the commands |what the robo |to put and |app does, in |get signals |general |() |() () <i3> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Note that the |changed to |g15 pmn |fit various |functions |hardware, and |to interact |these funcs |w/roboparts |are gathered |are easily |together |() |() () <i4> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |a few changes |how robohw is |of core near |to be set up |updchanpos to |is given |allow plural |about 430 |channel use |cards ahead, |eg in rectune |and onwards |() |() () <i5> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Note that |initial rest |some robots |position |need a rather |accurately |intensive |fit the info |initprocedure |in channel |to make its |electronics |() |() () <i6> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Also note |you must use |that, because |creative |of Goedel, |perception of |there is no |context&robot |canonical fcm |to program it |setup:rather |suitably |() |() () <i7> rg1tx= |A config card &incam.bmp&. |File made by |command rg1 |and fetched |by this app |as caminput, |robopart#1 <i8> rg2tx= |A config card &in2cam.bmp&. |File made by |command rg2 |and fetched |by this app |as caminput, |robopart#1 <i9> rg3tx= |A config card &in3cam.bmp&. |File made by |command rg3 |and fetched |by this app |as caminput, |robopart#1 <i10> cmdrg1= |a config card ^. cmdrg1 longtxt* kl ./incam.sh *txtcomplete |gets input |from part#1 |of robot: cliptrail |camera #1 <i11> cmdrg2= |a config card ^. cmdrg2 longtxt* kl ./in2cam.sh *txtcomplete |gets input |from part#1 |of robot: cliptrail |camera #2 <i12> cmdrg3= |a config card ^. cmdrg3 longtxt* kl ./in3cam.sh *txtcomplete |gets input |from part#1 |of robot: cliptrail |camera #3 <i13> pr1tx= |A config card &pr1.txt&. |File made by |this app & |used by |cmdpr1 to |send signals |to robopart#1 <i14> cmdpr1= |a config card ^. cmdpr1 longtxt* kl cat pr1.txt > /dev/ttyUSB0 |sends the *txtcomplete |signalpackage |to part#1 of cliptrail |the robot <i15> crlnmarker= |a config card &~&. crlnnumber= 13. |when the "~" |As configured |char is used, |here: in "put |it becomes |robot" {pr} |ascii line- |calls, |shift <i16> pr1aresttx= ^. *txtcomplete longtxt* |config card #0 p1500 #4 p7 cliptrail 50 t1800~ pr1aresttx kl |robopart#1a: |rest position <i17> pr1bresttx= ^. *txtcomplete longtxt* |config card #1 p1700 t1800 cliptrail ~ pr1bresttx kl |robopart#1b: |rest position <i18> pr1cresttx= ^. *txtcomplete longtxt* |config card #3 p1750 #2 p1 cliptrail 700 t2000~ pr1cresttx kl |robopart#1c: |rest position <i19> pr1aswingtx= ^. *txtcomplete longtxt* |config card #0 p750 #4 p22 cliptrail 20 t1800~ pr1aswingtx kl |robopart#1a: |a swing pos <i20> pr1bswingtx= ^. *txtcomplete longtxt* |config card #1 p1850 t1800 cliptrail ~ pr1bswingtx kl |robopart#1b: |a swing pos <i21> pr1cswingtx= ^. *txtcomplete longtxt* |config card #3 p1950 #2 p1 cliptrail 950 t2000~ pr1cswingtx kl |robopart#1c: |a swing pos <i22> pr1stdmovtim= |This is used 1900. |as ms timer |parameter |when robopart |#1 moved by |some of the |std config |commands <i23> actarraylen= |a config card 33333. |Must be roomy |The command |robomovs via |"recact" |keyboard;this |allows you to |number sets |record a |maxlen of |sequence of |recorded act <i24> maxqtychan= |a config card 333. |Can be roomy; |number used |to make array |with a number |for each |robochannel <i25> pauseaftervu= |a config card 65. |When the g15 |a slight wait |calls command |eg 65ms will |line of a |ensure proper |kind that |screen update |pauses g15, |when looping |eg get video, |such comcalls <i26> |a config card <i27> |a config card <i28> |a config card <i29> |a config card <i30> |a config card <i31> |a config card <i32> |a config card <i33> |a config card <i34> |a config card <i35> |a config card <i36> |a config card <i37> |a config card <i38> |a config card <i39> commandline= 1 |in: quote 2 |action:what 3 |quote says 4 s5 x4 lc |For a g15 pmn i5 |environment tt |like g15robot <i40> sh |This command sh |uses "x4" sh |which can sh. |(despite |apply care; |comments in |also, max len |pd code) work |quote MUST be |in all suit- |within 230 |able contexts <i41> pr1= |BE SURE:max |in:quote |len is 230! |action: |use syntax |sends quote |matching robo |to robot via |electronics; |file pr1tx |the quote |{as set in |must already |config cards} |be "crparsed" <i42> tx |qty incl nil: pr1tx |from: lk pr1tx up up |to: lc fw <i43> |from: |qty jx jx up lk fw |makes file: jx |to: lk sc br <i44> |The command cmdpr1 |has been lk |stored; file |name next |used in |transmitting |to robopart |#1 commandline. <i45> miniarray= && ^. miniarray 222 kl 232 mm |Gem image |some cards |array |from the g15 sz |gem program <i46> maxiarray= && ^. maxiarray 500 kl 503 mm 500 |Expanded gem 500 |image matrix maxiarray sz wwyymatrix <i47> clrexpimage= clrexpimage 250000 maxiarray lk clrthismany. <i48> loadanyarray= t4 |In: disknum, t3 |cardnum, qty, t2 |array t1 |Action: puts | and room |qty cards to | enough is: |array, which | 232 times |must've room | qty cards <i49> ll:99999999 j3 dc j3 t3 0 eq se ex <i50> j1 lc j2 j4 rr 232 fw <i51> j4 j2 232 up ad t2 t4 lo. <i52> loadpackimage= t3 |In: disknum, t2 |cardnum, t1 |array j1 |Action: gets j2 |gem image to 216 |one long j3 |enough array loadanyarray. <i53> unpackimage= s6 |In: inarray, s5 |matrix |Action: i5 |Unpacks tones 50000 |0->255 to a i6 |matrix sized kp. |500x500 <i54> rg1= |tmp use:ldisk |Gives:1=found |Config info |Action: |used:cmdrg1 |Photographs |and rg1tx; |from robopart |this command |#1, camera#1, |assumedly |via c9000 to |may take |maxiarray; |seconds <i55> |The command cmdrg1 |as has been lk |configured |in the first |cards calls |on camera#1 |of the |robot commandline <i56> |from: |qty incl nil: rg1tx rg1tx up lk |gem image up |is put to |c9000 fw |to: |Fetch gem pd: lc rq <i57> d2 3 9000 |Unchanged miniarray |array when lk |image not |found: basis ex loadpackimage <i58> miniarray lk maxiarray lk unpackimage dance. <i59> rg2= |tmp use:ldisk |Gives:1=found |Config info |Action: |used:cmdrg2 |Photographs |and rg2tx; |from robopart |this command |#1, camera#2, |assumedly |via c9000 to |may take |maxiarray; |seconds <i60> |The command cmdrg2 |as has been lk |configured |in the first |cards calls |on camera#2 |of the |robot commandline <i61> |from: |qty incl nil: rg2tx rg2tx up lk |gem image up |is put to |c9000 fw |to: |Fetch gem pd: lc rq <i62> d2 3 9000 |Unchanged miniarray |array when lk |image not |found: basis ex loadpackimage <i63> miniarray lk maxiarray lk unpackimage dance. <i64> rg3= |tmp use:ldisk |Gives:1=found |Config info |Action: |used:cmdrg2 |Photographs |and rg3tx; |from robopart |this command |#1, camera#3, |assumedly |via c9000 to |may take |maxiarray; |seconds <i65> |The command cmdrg3 |as has been lk |configured |in the first |cards calls |on camera#3 |of the |robot commandline <i66> |from: |qty incl nil: rg3tx rg3tx up lk |gem image up |is put to |c9000 fw |to: |Fetch gem pd: lc rq <i67> d2 3 9000 |Unchanged miniarray |array when lk |image not |found: basis ex loadpackimage <i68> miniarray lk maxiarray lk unpackimage dance. <i69> vurobocam1= rg1 |action: sh |Calls on the maxiarray |robocam 1, lk |puts to maxi- sw |array, shows |at upper left pauseaftervu |corner activepause. <i70> vurobocam2= rg2 |action: sh |Calls on the maxiarray |robocam 2, lk |puts to maxi- sw |array, shows |at upper left pauseaftervu |corner activepause. <i71> vurobocam3= rg3 |action: sh |Calls on the maxiarray |robocam 3, lk |puts to maxi- sw |array, shows |at upper left pauseaftervu |corner activepause. <i72> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Next, we |digit series |define 60bit |to encode & |numbers, also |receive info |called num60b |to and from |or just num6, |the robotic |as suitable |parts |() |() () <i73> extractsign= |c is 1 or !1 |in: a |as its sign; |gives: b c |this allows |action: a is |easy saving |number, can |of sign, |be signed; |which can |b is its |later be 'mm' |absolute; |back in :) <i74> f d2 ab |note: basis dance |is considered ex |unsigned w 0 lt !1. <i75> twoto= se |in: number |note: |gives: 2^ n ex s3 |uses loop 1 2 ll:2000000000 mm i3 q3 n? lo. <i76> array2up= |So, for 1^. |instance, |For FAST 2^n |to get 2 with 45 |the exponent sz |5, write: && | 5 &array2up& | array2up setfastvar | ay <i77> initarray2up= undefnum ll:31 31 m1 array2up twoto ya. m1 initarray2up array2up |Signed32bit ya |means careful lo |with 2^31 <i78> get2pow= |range as we |in: number |define it (ie |gives: exp |avoid the |action: |"undefnum"), |Given a |it gives n so |number from |that 2^n is |1 up to the |it, or less |maximum 32bit |than 2^{n up} <i79> s4 d3 ll:31 m1 m1 array2up dc ay ex i4 lo le 30. <i80> twoto23= |signbit, exp 8388608. |8 bits, then first23bits= |a 23bit 8388607. |"mantissa", |32b socalled |which, with |"floating |a resolution, |point nums" |is added to |{fpnums} have |2 ^ exp <i81> first16bits= &high16bits& 65535. setfastvar first31bits= high16bits= 2147483647. 1. first30bits= 1073741823. first16bits first15bits= ng 32767. <i82> first8bits= first16bits 255. an ^top8bitsof16 top8bitsof16= setfastvar 1. twoto30= 1073741824. first8bits twoto15= ng 32768. <i83> ngfirst8bits= ng 1. |This has 1's |for 32 bit |except first |group of bits ^ngfirst8bits first8bits setfastvar <i84> ngsecond8bits= ng 1. |This has 1's |for 32 bit |except second |group of bits ^ngsecond8bits top8bitsof16 setfastvar <i85> signedbytemax= signedintmax= 127. 32767. signedbytemin= signedintmin= !128. !32768. bytecycle= intcycle= 256. 65536. <i86> twoto8= twoto24= 256. 16777216. twoto14= twoto29= 16384. 536870912. twoto16= high15bits= 65536. 1073709056. <i87> max30bits= 1073741823 |in: num |gives: num |action: |applies "an" |with |first30bits, |rm's any 'ng' an. <i88> dance6= basis6= 0 0 1. 0. |Some useful |60bit numbers oneminus6= ten6= !1 0 1. 10. <i89> themaxnum6= maxpurepow6= 1073741823 536870912 1073741823. 0. |Next num6 is |ie, "2 to 59" |highest power |and this fits |of 2 under |this digit |themaxnum6, |series: |"576,460,752 |,303,423,488" <i90> |These maxnums |recommended |for num6 are |range for |used inside |precise whole |arithmetic |number 60bit |num6 funcs, |with these |but it's |functions is |important to |17 digits {& |note that |some more} <i91> issigned6= d |in:num60b 0 |gives:num60b |note:in these | flag |funcs, num60b |action: tells |means a PAIR |whether the |of typical |num60b has |32bit nums |a sign lt. <i92> ts6nonbasis= w |in:num60b |gives:num60b ng |action: |in case input |For a num60b |may be basis, |that is not |prefer ts6 |zero, toggles |sign w. <i93> ts6= |in:num60b |gives:num60b |action: |By analogy to |"ts", toggles |sign of any |num60b <i94> d se d n? w n? an ex <i95> w ng w. <i96> pairflip= i3 |in:a b c d i4 |gives:c d a b |Easy to use s4 |for num60b's s3 s2 i1 s1 i2. <i97> paircopy= |in:a b |gives:a b a b d d. <i98> oratpair= s4 |in:a b c d s3 |gives:c d s2 |action: does i3 |"or" at pair, or |ie, at a and i2 |c, THEN at b i4 |and d or. <i99> anatpair= s4 |in:a b c d s3 |gives:c d s2 |action: does i3 |"an" at pair, an |ie, at a and i2 |c, THEN at b i4 |and d an. <i100> yeorye= |any one of |in:a b |them happens |gives:flag |to be "ye" |action: does |"ye" at both ye |and combines w |with "or"--to ye |check whether or. <i101> nqandnq= |both are |in:a b |"n?" at the |gives:flag |same time |action: does |"n?" at both n? |and combines w |with "an", to n? |check whether an. <i102> ab6= se |in:num60b |gives:num60b ex |action: abs |val of num60b d w 0 ng ge w. <i103> issigned6= d |in:num60b 0 |gives:num60b | flag |action: tells |whether the |num60b has a |sign lt. <i104> isunsigned6= d |in:num60b 0 |gives:num60b | flag |action: tells |whether it |basis or |positive ge. <i105> getsignflag= |Note that |in: a |unlike func |gives: b, |"extractsign" | signflag |this func |action: gives |has flag=1 |abs val of |when num |32bnum & flag |signed,other- |to tell sign |wise basis <i106> f w 0 ab lt w. <i107> getsignflag6= |Signflag is 1 |in:num60b |when signed; |gives:num60b, |signflag is | signflag |basis when |action: gives |the number |abs val of it |is basis or |and flag to |positive |tell sign <i108> 0 dance tx tx d w 0 ng ge w d5 jx. <i109> applysign6= |it does |in: num60b, |nothing at | signflag |flag 0; |gives: |however, when | num60b |num60b is |action: This |basis6, it |reverts sign |won't touch |when flag 1; |the number <i110> n? d d se 0 eq w 0 eq ex an <i111> se w ng ex w. <i112> |Note that |The ranges of |normal |the 60bitnum |32bit nums |{signable} |have range |are a lot lot |ca plus-minus |greater:exact |two billion, |range depends |a bit above |on which |NINE digits |arithmetic <i113> |While some |perfectly w/ |60bit funcs |17 digits,and |can handle |most can go |slightly |halfway up on |higher than |the 18 digit |eighteen |number span |digits, all |range without |of them work |trouble <i114> numtonum6= f |in:normalnum 0 |gives:num60b lt |action: tx |converts 32b |in-range of |num (can have |32b is 0 to |sign) to a |first31bits |num60b ab <i115> f w first30bits first30bits gt |jx will only jx |init "ng" in |case the se |inputnum is |lt than 0 ng an. <i116> num6tonum= |Handles any |in:num60b |sign |gives:number |correctly; |action: |will return |num60b is |max |converted to |first31bits |normal 32bit |number <i117> getsignflag6 first30bits tx an w or 0 jx gt twoto30 se mm w ts. <i118> gt6= |is greater |in:num60b, |than the | num60b |second |gives: |{includes | flag |sign |Flag is dance |handling} |in case the |first 60b num <i119> t2 i1 t1 j1 le d2 s2 dance s1 ex <i120> i1 |In this case, j1 |highparts eq, eq |but can be |signed d2 basis i2 ex j2 <i121> i1 gt. 0 lt se w <i122> lt6= |is less |in:num60b, |than the | num60b |second |gives: |{includes | flag |sign |Flag is dance |handling} |in case the |first 60b num <i123> t2 i1 t1 j1 ge d2 s2 dance s1 ex <i124> i1 |In this case, j1 |highparts eq, eq |but can be |signed d2 basis i2 ex j2 <i125> i1 lt. 0 lt se w <i126> ge6= |is greater |in:num60b, |than or eq to | num60b |second |gives: |{includes | flag |sign |Flag is dance |handling} |in case the |first 60b num <i127> t2 i1 t1 j1 le d2 s2 dance s1 ex <i128> i1 |In this case, j1 |highparts eq, eq |but can be |signed d2 basis i2 ex j2 <i129> i1 ge. 0 lt se w <i130> le6= |is less than |in:num60b, |or equal to | num60b |second |gives: |{includes | flag |sign |Flag is dance |handling} |in case the |first 60 bnum <i131> t2 i1 t1 j1 ge d2 s2 dance s1 ex <i132> i1 |In this case, j1 |highparts eq, eq |but can be |signed d2 basis i2 ex j2 <i133> i1 le. 0 lt se w <i134> eq6= |is equal to |in: num60b |the second | num60b |num60b, also |gives: |as regards | flag |any sign |Flag is dance |in case the |first num60b <i135> s1 eq w ix i1 eq sx an. <i136> maxisfirst6= |two num60b's |in:num60b, |is bigger, | num60b |their |gives:num60b, |sequence is | num60b |switched (can |action: In |be signed) |case the |second of the <i137> s4 s3 s2 s1 i1 i2 i3 i4 <i138> i1 se i2 i3 i4 ex ge6 pairflip. <i139> egswapmax1st= |two num60b's |in:num60b, |is bigger, | num60b |their |gives:num60b, |sequence is | num60b, flag |switched (can |action: In |be signed); |case the |flag=1 when |second of the |did swap <i140> s4 s3 s2 s1 i1 i2 i3 i4 <i141> i1 d2 i2 i3 basis i4 ex pairflip lt6 1. <i142> sl6= getsignflag6 |in:num60b |is done at |gives:num60b |32b nums,sign |action:lshift |is also kept |num60b 1 bit |but ONLY when |{any sign is |twice num is |kept; note |within range} |that when sl t8 <i143> f twoto29 an s1 sl first30bits an <i144> w w sl first30bits j8 an se i1 ye or ts6. <i145> sl6posmax= |Can give some |in:num60b |funcs higher |gives:num60b |range when w/ |action:lshift |eg gt6 in a |positive num6 |loop (rarely |so that if it |needs any use |butts at max, |of eg ts6 at |it gets max |same time) <i146> f twoto29 an s1 sl first30bits an <i147> w ix 0 sl ge i1 ix ye |first30bits: or 1073741823 le sx an <i148> d4 w. sh first30bits f sx ix <i149> sr6= getsignflag6 |in:num60b |use of 'sr' |gives:num60b |at -1, which |action:rshift |yields same, |num60b 1 bit |the use of |{any sign is |sr6 in such a |kept but |case gives 0} |unlike the t8 <i150> d 1 an s1 sr <i151> w or sr w j8 se i1 twoto29 mm ts6. <i152> sr6twopowmax= getsignflag6 |in:num60b |"clean" 2 to |gives:num60b |highest pow |action:as sr6 |a num6 can |but when num6 |have while |equals |still under |maxnum6, the |maxnum6 |result is a t8 <i153> d d6 1073741823 eq sh d sh 1073741823 maxpurepow6 eq j8 an applysign6 n? ex <i154> d 1 an s1 sr <i155> w or sr w j8 se i1 twoto29 mm ts6. <i156> adpositive6= |the num60b's |in: num60b |correctly: | num60b |condition is |gives: |that both are | sumnum60b |positive {and |A subroutine |that their |for ad6 and |sum is within |su6,this adds |60b range} <i157> s2 t2 |hi1 is j1 |first1 is i1 |hi2 is j2 |first2 is i2 s1 t1 <i158> i1 j1 i2 j2 ad ad first30bits first30bits an an s3 s4 <i159> i3 h4 i2 |hi3,ie, high lt |30bits for |result is put |on stack, |then first3 i4 se i3. <i160> su6unlsign= |the absolute |in:num60b, |values of the | num60b |two num60b's, |gives: |then applies | num60b |the sign of |action: |the first of |This subfunc |the input on |of su6 adds |the sum <i161> s4 s3 s2 s1 i1 0 lt sx <i162> i1 ix i2 ab6 i3 i4 ab6 adpositive6 applysign6. <i163> su6= s2 |in:num60b, t2 | num60b s1 |gives: t1 | num60b j1 |action: 0 |Gives first lt |minus second sx <i164> ix d6 j2 j1 0 i1 lt j2 i2 xr su6unlsign n? ex <i165> j1 s2 i1 t2 ab6 j2 i2 ab6 egswapmax1st s1 tx t1 <i166> i1 j1 i2 j2 su su first30bits first30bits an an s3 s4 <i167> i1 q4 i2 lt i4 se i3 <i168> ix dance jx |ie, when abs xr |are swapped, n? |xor |the similar |sign is !, |then putsign: d2 applysign6. <i169> ad6unlsign= |the two 60b |in:num60b, |numbers when | num60b |their signs |gives: |differ | num60b s4 |action: s3 |This subfunc s2 |of ad6 adds s1 <i170> i1 i1 0 i2 lt i3 i4 ab6 su6 d7 ex <i171> i3 i4 i1 i2 ab6 su6. <i172> ad6= s2 |in:num60b, t2 | num60b s1 |gives: t1 | num60b j1 |action: 0 |Adds the two lt |numbers sx <i173> ix d6 j2 j1 0 i1 lt j2 i2 xr ad6unlsign n? ex <i174> j1 s2 i1 t2 ab6 j2 i2 s1 ab6 t1 <i175> i1 j1 i2 j2 ad ad first30bits first30bits an an s3 s4 <i176> i3 h4 i2 lt i4 i3 ix se applysign6. <i177> mm3to6= |Input numbers |in:normalnum1 |(signable); | normalnum2 |range input: |gives:num60b |up to |action: |first30bits, |multiplies |or, easily |32bit numbers |said, ca |into num60b |one billion <i178> |The resulting |17 ascii |num60b,while |digit format |not quite a getsignflag |number in the s4 |sense of real s2 |numbers of getsignflag |32bit kind, s3 |can be put to s1 <i179> i1 twoto15 di |first number i1 |has high part first15bits |in i1, low an |part in j1 t1 s1 <i180> i2 i2 first15bits twoto15 an di |2nd number |has high part |in i2, low |part in j2 t2 s2 <i181> |What we call |are in i5, |"topflow" is |i6, i7, i8; |stored in ix, |the topflow |jx, where ix |is lshifted, |is high part |respectively: |of num60b; |45 bits, 30 |The four |bits, 30 bits |mm results |and 15 bits <i182> |Topflow here high15bits |lshifted 45 an |bits: sx i1 i2 mm first15bits an f s5 <i183> |Topflow here twoto15 |lshifted 30 di |bits: ix j1 ad i2 sx mm first15bits an f s6 <i184> |Topflow here twoto15 |lshifted 30 di |bits: ix i1 ad j2 sx mm first15bits an f s7 <i185> |Topflow here high15bits |lshifted 15 an |bits: tx j1 j2 mm first15bits an f s8 <i186> |The results |The results |are lshifted |are all, at |30,15,15,0 |most, 15 |bits, and |bits, since |ad6 can be |we have |used to add |put all |these and to |higher bits |topflow; |to topflow <i187> |First value |Second value |lshifted 30: |lshifted 15: 0 i6 twoto15 mm i5 0 ad6 <i188> |Third value |fourth value |lshifted 15: |kept as is: 0 0 i7 i8 twoto15 mm ad6 ad6 <i189> |Topflow i3 |adds i4 ix xr jx ad6 applysign6. <i190> mm6= |32bit's 'mm'; |in:num60bt, |any signs are | num60bt |handled;as w/ |gives:num60bt |mm, funnynums |action: |can arise if |multiplies |the ranges |60bit numbers |don't allow |by analogy to |multiply up <i191> getsignflag6 tx s4 s3 getsignflag6 sx s2 s1 <i192> i1 themaxnum6 n? ix i3 jx n? xr or applysign6 d6 ex <i193> i2 |In addition, i4 |the high part |of one of the |input numbers |are other mm3to6 |than basis & s8 |deserves to s7 |be reckoned w <i194> i1 ad i4 i7 mm ad first30bits an i3 i2 mm i8 <i195> ix jx xr applysign6. <i196> di6= |be signed); |in:num60b, |maxnum at |num60b |divisor 0; |gives:num60b |the num6 |action:whole |routines work |number divide |for up to 17 |first on |digits {and a |second (can |bit more} <i197> getsignflag6 |Here, the 60b sx |num i3:i4 is t6 |div at j5:j6; t5 |their signs getsignflag6 |in i9 and ix, s9 |respectively; s4 |Bitcounter is s3 |num60b j9:jx <i198> i3 d2 i4 j5 j6 eq6 dance6 n? ex <i199> i3 d2 i4 j5 j6 basis6 gt6 ex <i200> i3 se first30bits eq |bitcounter i4 |must be able first30bits |to pass eq an q4 <i201> |ix becomes |resultsign, |flag 1 when |unlike flags: i9 ix xr sx <i202> j5 d4 j6 |Very decently |we give the |right sign themaxnum6 |when basis ix |divisor :) applysign6 yeorye ex <i203> dance6 |Result is |being built |up on stack, |where |sl6posmax |bitcounter |must be used tx |in case butt t9 basis6 <i204> |prepare j5 |counters: j6 i3 i4 gt6 ll:1 dh <i205> j5 j9 j6 jx sl6posmax sl6posmax t6 tx t5 t9 tn tn tn tn tn q1 <i206> lo j9 jx sr6twopowmax tx t9 <i207> |Extra ex |check: j9 j5 jx j6 nqandnq sr6twopowmax t6 se t5 <i208> ll:2000000000 i3 i4 j5 j6 lt6 dh <i209> i3 j9 i4 jx j5 oratpair j6 tn su6 tn s4 tn s3 tn tn tn <i210> j9 yeorye jx sr6 d3 paircopy ix tx applysign6 t9 ex <i211> j5 lo. j6 sr6 t6 t5 <i212> mo6= ab6 |in:num60b, s4 |num60b s3 |gives:num60b |action: 60bit getsignflag6 |analogy to sx |"mo" {modulus s2 |or remainder} s1 <i213> i1 i3 i2 i4 d mm6 d su6 i3 i4 ix di6 applysign6. <i214> |As for the |should be |conversion to |provided, as |and from such |a 'wrap' |as num4 and |around these |num6, usually |functions so |some extra |as to handle |checks and |recommended |processing |qty of digits <i215> quotetonum6= s4 |in:quote |No spaces,dot |gives:num60b |comma or plus |action: |or such in |converts |or around the |ascii digits |digits 0->9; |to the num60 |optional sign |equivalent |char is "-" <i216> 0 se 0 ex i4 lk n? h4 <i217> i4 i8 lk |dash? se 45 eq s8 h4 <i218> ll:1 i4 0 lk 10 |Ascii: mm6 48 su 0 ad6 <i219> h4 lo i4 lk ye se i8 q1 applysign6. <i220> n6toquright= 25 ^. ad |This is set 30 |to the sz |rightmost |Quote for |part of it |next func n6toquright && kl <i221> num6toquote= |obs:more than |in:num60b |numbers, num6 |gives:quote |digitseries |action: |can be seen |converts |as "script |num60b to |bits" or |a quote with |"encoded |digit series; |programs" <i222> getsignflag6 |Right part of s8 |quotespace of |this |The sixty |function: |bit number n6toquright |is present lk |at the stack |{positive} s4 <i223> |Resultlen |The result |initialized |quote is |to dance: |nilcomplete: 0 i4 kl 1 s3 q4 <i224> ll:1 |asciinum 0: |num60b 48 |at stack: ad d i4 d kl 0 q4 10 |Extra num: mo6 sh <i225> 0 h3 10 di6 q1 d lo d |Processed! nqandnq sh d2 sh <i226> |eg asciisign: h3 45 f i8 i4 n? kl q4 d5 sh <i227> |length into |done! |place: i3 i4 kl i4. <i228> somecalc6tx1= whole ^. *txtcomplete longtxt* somecalc6: too cliptrail l, mostly for coders, which somecalc6tx1 explores 60bit kl <i229> somecalc6tx2= ore ^. *txtcomplete longtxt* numbers, also cliptrail called num60b or just "num6" somecalc6tx2 . These are, m kl <i230> somecalc6tx3= her ^. *txtcomplete longtxt* scientifically cliptrail correct, a ki nd of "encoded somecalc6tx3 programs" rat kl <i231> somecalc6tx4= more ^. *txtcomplete longtxt* than 1st hand cliptrail numbers. The r ange is 17 dig somecalc6tx4 its, and some kl <i232> somecalc6tx5= Be ^. *txtcomplete longtxt* above that. Ok cliptrail with dash, -, as sign. ONLY somecalc6tx5 DIGITS here!! kl <i233> somecalc6tx6= time: ^. *txtcomplete longtxt* SURE that you cliptrail provide meanin gful input! Tw somecalc6tx6 o numbers each kl <i234> somecalc6tx7= or ^. *txtcomplete longtxt* {As coder's to cliptrail ol, this progr am doesn't blo somecalc6tx7 ck nondigits n kl <i235> somecalc6tx8= .} ^. *txtcomplete longtxt* out-of-range i cliptrail nput;nor does it reprocess t somecalc6tx8 oo-long output kl <i236> somecalc6tx9= ^. longtxt* 12345678901234 cliptrail 567 *txtcomplete somecalc6tx9 kl <i237> somecalc6tx10= ^. longtxt* ************** cliptrail *** {just <en ter> to exit.} somecalc6tx10 *txtcomplete kl <i238> somecalc6= |usage, shows |action: |the mm6,di6, |easy way to |mo6,su6,ad6 |find out |in action |some num60b |with input |digit |via prtinput; |sequences |mostly for |by keyboard |programmers:) <i239> prtsuspend lk prt && somecalc6tx3 prt lk somecalc6tx1 prt lk somecalc6tx4 prt lk somecalc6tx2 prt <i240> somecalc6tx5 somecalc6tx7 lk lk prt prt somecalc6tx6 somecalc6tx8 lk lk prt prt <i241> ll:2000000000 somecalc6tx9 lk prtsuspend prt prtrelease somecalc6tx10 lk prt <i242> prtinput se clipleading cliptrail ex sx ix ix lk quotetonum6 s4 n? s3 <i243> prtinput se clipleading cliptrail ex sx ix ix lk quotetonum6 s6 n? s5 <i244> prtsuspend mm6 ^Multiplied: prt i3 num6toquote i4 i5 i6 prt <i245> ^Added: ad6 prt i3 num6toquote i4 i5 i6 prt <i246> ^Substracted: su6 prt i3 num6toquote i4 i5 i6 prt <i247> ^Divided: di6 prt i3 num6toquote i4 i5 i6 prt <i248> ^Modulus: mo6 prt i3 num6toquote i4 prt i5 i6 lo. <i249> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |The somecalc6 |meaningful |can be used |schemes of |by the |encoding |programmer to |info to the |explore what |60bit num6 |is most |format |() |() () <i250> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |In our Open |and from |Robotics |which output |scheme, they |can be |are meant to |decoded, at |be used to |edges of the |encode input |fcm matrix |() |() () <i251> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Next, more |pmn terminal |core robotics |interactively |functions, |to check |some of which |connections |are easily |w/all parts |called at g15 |of the robot |() |() () <i252> crparsed= |as set up |in: quote |in the |gives: quote |config cards, |action: |and typically |replaces any |used on line |crlnmarker |commands |with |before sent |crlnnumber |to roboparts <i253> s4 ll:2000000000 i4 i3 lk 0 s3 le crlnmarker up se lk tx ex <i254> f4 crlnnumber lk f4 jx kl eq n? h4 q3 d3 lo. <i255> pr1cr= f |as "pr1", but crparsed |calls |crparsed |first; useful |when new |texts are |used pr1. <i256> recactarray= |#0:qty couple ^. |Array meant actarraylen |to be used |From config |w/newcouple & sz |fromcouple; && |most recent recactarray |recorded act kl |for robot <i257> clractarray= actarraylen |action: recactarray |clears the lk |recactarray; clrthismany. |done eg after |save to disk, |before next |act recording clractarray <i258> mem= s4 |in: addr i4 |This is a makenumber |programmers 17 |tool, to view 10 |numbers in |ram; 5 x 15 ce |are shown :) bx <i259> ll:15 i4 lk ll:5 makenumber <i260> m2 37 165 ad mm 10 rp ad h4 m1 freestars 50 lo mm lo. <i261> mems= sx |in: startaddr |This is a |programmer's |tool: 75 & 75 |nums from ram |shown until |"q" pressed <i262> ll:2000000000 mem m1 75 mm ix ad <i263> kk or |q,Q: f se 113 eq ex w 81 eq lo. <i264> disknumstod= |Used by ^. |numstodisk cardnumstod= ^. disknumstod posnumstod= basisthis ^. cardnumstod posnumstod basisthis basisthis <i265> initnumstod= |and be sure |in: disknum, |to finish | cardnum |with |action: do |donenumstod |this once |before series |of calls to s2 |numstodisk, s1 <i266> disknumstod posnumstod basisthis |disktonums |so it's okay |uses sc; |to use both |numstodisk |rather |uses lc; |at the same cardnumstod |time basisthis basisthis <i267> i1 i1 n? disknumstod kl se i2 cardnumstod ex kl <i268> 232 sc clrthismany. <i269> donenumstod= |This will |action: do |ensure the |this once |last numbers |after series |are put to |of calls to |disk and also |numstodisk |put a nilcard |of nulls |after this <i270> disknumstod |Note that lk |when getting n? |numbers back |from disk, se |no 'done' |routine is |required ex <i271> posnumstod disknumstod lk lk n? cardnumstod |In case of lk |empty array, rw |there's just |a nilcard cardnumstod d7 danceup <i272> 232 disknumstod sc lk cardnumstod lk clrthismany rw. <i273> numstodisk= |initialized |in: number |by |action: puts |initnumstod |the 32bit |Can be used |number to |to save |next pos in |arrays (can |present |have nil) |card, as sx <i274> disknumstod lk n? se ex <i275> posnumstod ix lk posnumstod 231 lk gt sc ya posnumstod danceup d8 ex <i276> disknumstod cardnumstod lk cardnumstod lk rw danceup <i277> posnumstod ix dancethis sc 232 sc clrthismany kl. <i278> disktondisk= |Used by ^. |disktonums disktoncard= ^. disktondisk disktonpos= basisthis ^. disktoncard disktonpos basisthis basisthis <i279> initdiskton= |{which reads |in: disknum, |an array} | cardnum |action: do |this once |before series |of calls to s2 |disktonums s1 <i280> disktondisk disktonpos basisthis disktoncard basisthis basisthis <i281> i1 i1 n? disktondisk kl se i2 disktoncard ex kl <i282> 232 lc clrthismany. <i283> disktonums= |For any array |gives: number |--which can |action: keeps |also have nil |on reading |--so calling |cards as |funcloop must |initialized |handle qty of |by |calls to this |initdiskton <i284> disktondisk lk n? se ex <i285> disktonpos disktondisk lk lk ye disktoncard lk rr disktoncard d7 danceup <i286> disktonpos disktonpos lk lc ay |At stk, given |by the func danceup <i287> disktonpos disktonpos lk 231 le se ex basisthis. <i288> newcouple= |this is inc |in: a b array |by one {ie, |action: |qty at #0 is |appends a,b |not arraylen} |to the |and a,b put |"couplearray" |to qty * 2 |Arraypos# 0= |and qty * 2 |qty couples; |plus one <i289> s3 i3 s2 lk s1 sl 1 i3 ku s4 <i290> i1 i2 i4 f4 i3 i3 ya ya. <i291> initcouple= s1 |in:couplearay |Note that it |action: sets |leaves the |arraypos#1 to |qty couples |1, done prior |intact |to repeat 1 |calls to f1 |"fromcouple" kl. <i292> donecouple= |fromcouple, |in:couplearay |this will |gives:flag |tell when |action: |array has no |after a call |more couples |to initcouple |to offer, by |and before |comparison |each call to |with pos#0 <i293> s1 i1 lk f1 lk gt. <i294> addtxtandnum= s1 |in: maintext, tx |appendtxt,num |action:adds |appendtxt |then number |to maintext, |must've room sx <i295> ix ix jx i1 makenumber addtexts addtexts. <i296> fromcouple= |all couples |in: array |in array;qty& |gives: a b |array left |action:after |intact; only |initcouple, |counter, at |as long as |pos #1, is |donecouple 0, |changed,after |this gives |init eg to 1 <i297> s3 i2 f3 sl lk up s2 i3 i2 ay sl 1 i3 f3 ay ku. <i298> poschannels= |an array used ^. |to store |present maxqtychan |position sz |of roboparts && |as pr the poschannels |channels; kl |basis=no info <i299> clrposchan= maxqtychan |action: poschannels |clears the lk |info as to clrthismany. |the present |positions of |the servos |etc clrposchan <i300> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |card section: |suit various |HARDWARE |robots; some |SPECIFIC |cards else- |ROBOFUNCTIONS |where in app |fairly easily |may also have |updated to |to be updated |() |() () <i301> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Some of the |this includes |data in the |info as to |next cards |what is |should match |regarded as |the initial |'rest |config cards, |position',etc |() |() () <i302> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |The present |in which |robot setup |channel 0 to |for the next |4 are used, |functions: |from ground |al5d arm with |upwards |ssc32u card |towards grip |() |() () <i303> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |First cam is | |mounted on | |roboelbow; | |second on the | |area that | |holds roboarm | |() |() () <i304> poschanmin= poschanmax= 750. 2250. |minimum |maximum |These fit |For some |the ssc32u |robohardware, |positions; |they are |enforce eg by |diversified |"makefit" |over channels <i305> |prepare all pr1bresttx |relevant lk |config texts: crparsed pr1aresttx pr1cresttx lk lk crparsed crparsed <i306> |prepare all pr1bswingtx |relevant lk |config texts: crparsed pr1aswingtx pr1cswingtx lk lk crparsed crparsed <i307> rrr= |Timing |action: this |involves |sends the |pr1stdmovtim |restposition |NOTE: when |instructions |you change |as set up in |config,change |config to all |numbers in |roboparts |this func,too <i308> pr1aresttx pr1bresttx lk lk pr1 pr1 pr1stdmovtim pr1stdmovtim activepause activepause <i309> pr1cresttx |Next, the lk |poschannels pr1 |must get the |info, too :) poschannels pr1stdmovtim lk activepause sx <i310> |This must fit 1700 |config cards: |channel#1 1500 1 |channel#0 0 ix ix ya ya <i311> 1700 1750 |channel#2 |channel#3 2 3 ix ix ya ya <i312> 750 |channel#4 4 ix ya. <i313> robotswing= |Timing |action: this |involves |sends a std |pr1stdmovtim |configured |NOTE:when you |swing pos to |change config |robot, as a |change info |contrast to |on channels |rrr command; |here, too <i314> pr1aswingtx pr1bswingtx lk lk pr1 pr1 pr1stdmovtim pr1stdmovtim activepause activepause <i315> pr1cswingtx |Next, the lk |poschannels pr1 |must get the |info, too :) poschannels pr1stdmovtim lk activepause sx <i316> |This must fit 1850 |config cards: |channel#1 750 1 |channel#0 0 ix ix ya ya <i317> 1950 1950 |channel#2 |channel#3 2 3 ix ix ya ya <i318> 2220 |channel#4 4 ix ya. <i319> |A "stream" is |robohardware, |here a series |&which has in |of couples of |it eg also |numbers,which |how much time |can be made |the program |into eg a |should wait |text package |after sending |sent to the |the command <i320> |So, for this |1:channel |robohardware |2:position |we use array |3:movetime ms |recactarray |4:apply crln |w/streams of |5:to motors |num-couples; |6:pause ms |first of them |after send |is the TYPE#: |7:complete <i321> robocrtxt= |As set by &9&. |config, this |crln is |suitable crlnnumber |character robocrtxt |in building up |up command to kl |robohardware <i322> robochantxt= |note:a change & #&. |of the core robopostxt= |in first line & p&. |--space put robomstxt= |before #-- & t&. |this allows |Fits ssc32u |parallel |robohardware |channels <i323> roboposinca= |This is inc A ^. |for pgdn/pgup |Fits the |in recact: |ssc32u |robomoves eg |interface |by keyclicks 50 |This var says roboposinca |how much to kl |change posnum <i324> robotiminca= |This is inc A ^. |for pgup/pgdn |recact timing |This var says |how much to 320 |way after a robotiminca |pgup/pgdn kl |move <i325> roboposincb= |This is inc B ^. |for home/end |Fits the |in recact: |ssc32u |robomoves eg |interface |by keyclicks 20 |This var says roboposincb |how much to kl |change posnum <i326> robotimincb= |This is inc B ^. |for home/end |recact timing |This var says |how much to 200 |way after a robotimincb |home/end kl |move <i327> roboposincc= |This is inc C ^. |for f1/f2 |Fits the |in recact: |ssc32u |robomoves eg |interface |by keyclicks 5 |This var says roboposincc |how much to kl |change posnum <i328> robotimincc= |This is inc C ^. |for f1/f2 |recact timing |This var says |how much to 75 |way after a robotimincc |f1/f2 kl |move <i329> torobohw= |ie, to robot ^. |hardware,here |as text quote 260 |This must sz |have no more && |length than torobohw |230; eg made kl |by next funcs <i330> nowrobochan= |function ^. |addtorobohw, nowrobopos= |which is next ^. |defined;when nowroboms= |streams go to ^. |robot they're |These are upd |used to upd |by the |poschannels <i331> updchanpos= |This is |action:uses |called, as a |variables |change from |set by |core, when- |addtorobohw |ever position |to update |is sent from |array |next func |poschannels <i332> poschannels nowrobopos lk lk nowrobochan lk ix sx ya. <i333> addtorobohw= |note:changed |in:type,num |from core; |action:apends |type 1,chan, |text suitable |type 2,pos & |for text |type 3,ms,but |steered robo |can be basis |tronics to |for type 4,cr |"torobohw" |(ignores gt4) <i334> torobohw s4 lk |Note: be sure |Set torobohw |to control |to nil len |such adding |before |to this quote |building it |so len lt 230 |up tx s3 <i335> i3 jx 1 robochantxt eq i4 n? addtxtandnum i4 nowrobochan kl d8 ex <i336> i3 jx 2 robopostxt eq i4 n? addtxtandnum i4 nowrobopos kl dh tn <i337> updchanpos |This is added tn |relative to tn |core to tn |handle the tn |parallel tn |channelwork tn |in eg ex |rectune <i338> i3 jx 3 robomstxt eq i4 n? addtxtandnum i4 nowroboms kl d8 ex <i339> i3 jx 4 robocrtxt eq addtexts n? |Note that |2nd num can |be basis for |type 4,5,7 d4 ex. <i340> perfrobohw= |to robomotors |in:type,num |& nils quote; |action:at |note:this has |type 1-4, it |slight change |adds to quote |of core in it |"torobohw"; torobohw |at t5 {type5} lk |it sends it tx <i341> s5 d3 sx ix i5 6 activepause eq n? ex <i342> ix jx 5 pr1 eq |To robopart1 n? |updchanpos |already calld jx nillify d5 ex <i343> ix i5 addtorobohw. <i344> perf1recact= |this command |action:given |line built & |that the |sent to the |couple# at |robohw; |pos#1 in |perfrobohw, |recactarray |called here, |is set {1->n} |updates also |it will get |poschannels <i345> recactarray torobohw lk lk s4 nillify |Must be done |before first poschannels |commandtext lk s3 <i346> ll:2000000000 i4 donecouple se ex <i347> i4 i8 fromcouple 7 s9 eq s8 se |Is it type 7, |meaning |stream done? ex <i348> i8 i9 |This handles |type 1-4 incl |5 to send to |robohw: perfrobohw lo. <i349> robominimovea= |recactarray |in:direction, |move type A |channel |in direction |action:with |1 or -1 |direction 1 |relative to |or signed, |poschannels, |this adds to |& sends cmd |the top of |to robomotors <i350> sx roboposinca t5 lk recactarray j5 lk mm s1 |Direction poschannels |handled lk s3 s8 <i351> ix poschanmin i3 poschanmax ay |Ranges for |channel |handled i8 makefit ad s9 <i352> |Next the |Note that |stream is |recactarray |added to |should be |top of |very roomy |recactarray, |so that it |in sequence |is in praxis |that fits |always bigger |ssc32u hw |than required <i353> |Before add |function can, |to the top |after build |of the array, |of stream, |the present |call on its |quantity |performance |couples is i1 |noted, so lk |that the t4 <i354> |Assert chan: |Assert pos: |type 1 |type 2 1 2 |chan |position ix i9 i1 i1 newcouple newcouple <i355> |Assert ms: |Note that |type 3 |type#3 is 3 |command to |ms |robohardware, robotiminca |while type#6 lk |allows this i1 |g15pmn prog newcouple |to wait at it <i356> |Assert cr: |Assert send: |type 4 |type 5 4 5 0 0 i1 i1 newcouple newcouple <i357> |Then program |stream is |waits,type 6 |done,type 7 6 7 robotiminca 0 lk i1 i1 newcouple newcouple <i358> |The array has j4 |got the info; up |j4 has the f1 |qty couples kl |prior to this |stream; let's |get it |started: perf1recact. <i359> robominimoveb= |Exactly as |robominimovea |but type B <i360> sx roboposincb t5 lk recactarray j5 lk mm s1 |Direction poschannels |handled lk s3 s8 <i361> ix poschanmin i3 poschanmax ay |Ranges for |channel |handled i8 makefit ad s9 <i362> i1 lk t4 <i363> |Assert chan: |Assert pos: |type 1 |type 2 1 2 |chan |position ix i9 i1 i1 newcouple newcouple <i364> |Assert ms: |type 3 3 |ms robotimincb lk i1 newcouple <i365> |Assert cr: |Assert send: |type 4 |type 5 4 5 0 0 i1 i1 newcouple newcouple <i366> |Then program |stream is |waits,type 6 |done,type 7 6 7 robotimincb 0 lk i1 i1 newcouple newcouple <i367> j4 up f1 kl perf1recact. <i368> robominimovec= |Exactly as |robominimovea |but type C <i369> sx roboposincc t5 lk recactarray j5 lk mm s1 |Direction poschannels |handled lk s3 s8 <i370> ix poschanmin i3 poschanmax ay |Ranges for |channel |handled i8 makefit ad s9 <i371> i1 lk t4 <i372> |Assert chan: |Assert pos: |type 1 |type 2 1 2 |chan |position ix i9 i1 i1 newcouple newcouple <i373> |Assert ms: |type 3 3 |ms robotimincc lk i1 newcouple <i374> |Assert cr: |Assert send: |type 4 |type 5 4 5 0 0 i1 i1 newcouple newcouple <i375> |Then program |stream is |waits,type 6 |done,type 7 6 7 robotimincc 0 lk i1 i1 newcouple newcouple <i376> j4 up f1 kl perf1recact. <i377> saveactarray= s4 |in:dsk#,crd# s3 |action:saves |also gives |recactarray |prt message |here, gives |when done |prt text recactarray |message in lk |case dsk# 0 tx <i378> &cardid?& d3 t1 j1 prt i3 ye ex <i379> jx ^S: qty cards: lk prtcont |qty couples sl |twice that, |plus two i3 u2 i4 s2 initnumstod <i380> ll:2000000000 donenumstod cardnumstod lk m4 i2 su ispro prtnum d7 ex <i381> m1 numstodisk jx q2 ay lo. <i382> loadactarray= s4 |in:dsk#,crd# s3 |action:loads |also gives |recactarray |prt message |from here; |when done |prt text recactarray |message in lk |case dsk# 0 tx <i383> &cardid?& d3 t1 j1 prt i3 ye ex <i384> i3 disktonums i4 |First in |recactarray, |supposedly |qty couples: jx initdiskton kl <i385> |This many ^L: qty cards: |more nums, prtcont |after 1st: jx lk sl up s2 <i386> ll:2000000000 disktoncard lk m4 i2 su ispro prtnum d6 ex <i387> disktonums q2 |Here, i1, |since basis |pos handled: i1 jx ya lo. <i388> actsavloatx1= odule ^. *txtcomplete longtxt* cliptrail Hi! You're an enterprising c hap! This is t actsavloatx1 he save/load m kl <i389> actsavloatx2= to ^. *txtcomplete longtxt* cliptrail for recact, wh ere whatever i s in recactarr actsavloatx2 ay can be put kl <i390> actsavloatx3= ten ^. *txtcomplete longtxt* cliptrail desired positi on of disk, or its content c actsavloatx3 an be overwrit kl <i391> actsavloatx4= t, ^. *txtcomplete longtxt* cliptrail with previousl y stored motor entrainment d actsavloatx4 ata. At presen kl <i392> actsavloatx5= rage: ^. *txtcomplete longtxt* cliptrail content of rec array now requ ires this many actsavloatx5 cards for sto kl <i393> actsavloatx6= } ^. *txtcomplete longtxt* cliptrail {card qty is a n estimate; do pls have a 'r actsavloatx6 oomy approach' kl <i394> actsavloatx7= l: ^. *txtcomplete longtxt* cliptrail Now you can pr ess s=save,l=l oad, or <space actsavloatx7 > when done s& kl <i395> actsavloatx8= case} ^. *txtcomplete longtxt* cliptrail Save: pls type cardid {eg k1 000, be sure o actsavloatx8 f place, lower kl <i396> actsavloatx9= } ^. *txtcomplete longtxt* cliptrail Load: pls type cardid {eg k1 000, lowecase, actsavloatx9 overrides ram kl <i397> actsavloatx10= ===== ^. *txtcomplete longtxt* cliptrail ====={the reca ctarray save/l oad module jus actsavloatx10 t completed}== kl <i398> actsaveload= |also called |action: opens |by recact |recactarray |at <f8> press |save/load prtsuspend |module, can && |be called prt |at terminal && |directly; is prt <i399> actsavloatx1 actsavloatx3 lk lk prt prt actsavloatx2 actsavloatx4 lk lk prt prt <i400> actsavloatx5 sl lk prt u2 232 recactarray di lk u2 lk prtnum <i401> actsavloatx6 actsavloatx7 lk lk prt prt ll:1 ki prtrelease t5 <i402> j5 actsavloatx10 32 lk eq prt n? d4 ex <i403> j5 d6 115 eq actsavloatx8 j5 lk 83 prt eq prtinput or ci n? saveactarray <i404> j5 d6 108 eq actsavloatx9 j5 lk 76 prt eq prtinput or ci n? loadactarray <i405> q1 lo. <i406> recactinfo= ^<pgup>,<pgdn> |action: info pp |for recact ^moves robot; ce pp ^As configured ^Small moves: pp pp ^digit=channel ^<home>,<end> pp pp <i407> ^Smallest: ^also at full pp pp ^<f1>,<f2> ^recactarray} pp pp ^<esc> quits ^{pract puts pp pp ^{autoquits ^it to robot; pp pp <i408> ^<esc> quits ^To append to pp pp ^there, too} ^loaded array, pp pp ^save & load: ^load it, do pp pp ^<f8> ^pract, then pp pp <i409> ^go back to ^it anew; then pp pp ^recact & load ^press keys; pp pp ^SAVE BEFORE pp ^RECACT QUIT! pp. <i410> recact= |pgup/pgdn to |action:use |move this; |keyboard to |esc when done |record robo |--the act is |moves; press |stored & can |0 to 4 for |be put to fcm |channel to |and repeated |roboengines & |by "pract" <i411> clractarray |preserve it; |Array is |overwritten recactarray |at next call lk |to recact; sx |only some |Put the act |recacts are |to disk to |"general" <i412> basis i5 s8 |esc 27 |Channel now 27 eq ll:2000000000 se ki s5 ex <i413> i5 dance |key{pgup}: i8 280 eq n? d3 robominimovea <i414> i5 oneminus |key{pgdn}: i8 281 eq n? d3 robominimovea <i415> i5 dance |key{home}: i8 278 eq n? d3 robominimoveb <i416> i5 oneminus |key{end}: i8 279 eq n? d3 robominimoveb <i417> i5 dance |key{f1}: i8 282 eq n? d3 robominimovec <i418> i5 oneminus |key{f2}: i8 283 eq n? d3 robominimovec <i419> i5 |key{f8}: 289 eq se actsaveload <i420> i5 iswithin 48 n? su t3 d2 j3 0 j3 4 s8 <i421> ix se lk |qty couples |Done rec when sl |array nr full 30 ex ad actarraylen gt lo. <i422> isescpressed= |key and check |gives: flag |whether it is |action: |esc (27); |useful for |other keys |loops; when |ignored |keyboard |pressed, it |will read the ck <i423> f ki n? 27 se ex sh eq. <i424> pract= |this func, |action: given |eg after |streams in |restpos or |recactarray, |other start- |eg by using |pos, resends |keyboard in |all of it |recact, or |to the robo- |from disk, |motors <i425> recactarray |Set to 1st lk |couple: |This func can |be quit in |the middle by |press on |<esc> ix sx initcouple <i426> ll:2000000000 perf1recact ix donecouple isescpressed or se ex lo. <i427> orinfo= pp |action: ^roboapp info |Info about pp |this app ^ Interactive ce pp ^orinfo: ^funcs include pp pp ^g15 pmn fcm <i428> ^vurobocam1 ^recact,pract pp pp ^{or 2 or 3} ^ At least one pp pp &rrr {r.rest}& ^rrr to init pp pp ^robotswing ^arrays, also pp pp <i429> ^robotswing to ^{q quits car} pp pp ^init motors; ^recact keys: pp pp ^source: ^i1 ^ recactinfo pp pp ^ car pp <i430> ^{when setting ^ce screenclr pp pp ^up fcm matrix ^qu quit pp pp ^somecalc6 ^************ pp pp. ^is of help} pp <i431> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |The core is |setting up |before this |how to treat |point; next |the input |we program |from the |fcm for this |robot & some |app, after |screen funcs |() |() () <i432> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Depending on |may be of |how the fcm |importance to |is coded, the |have the |settings for |pattern |such as cam |matching work |input {next} |as intended |() |() () <i433> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |The next |how the fcm |cards, then, |is coded, |ties up to |perhaps also |robohardware |on the |and, again |environment |dependent on |for robotuse |() |() () <i434> |important: |any work- |setup as for |arounds or |robohardware |clarifying |for this robo |comments as |app is listed |to the core |next, after |cards come in |the 430 core |the following |cards; also: |cards <i435> |this app's |at the ssc32u |robohardware: |card for al5d |"first book |"robo-elbow", |scan" roboapp |since in some |uses |setups, #2 |channel#18 |had noise in |rather than |it; cfr the |channel#2 |deeprrr func <i436> |the function |handle#1 is |'crparsed' |at channel#29 |in core works |and when this |perfectly but |is run in |it doesn't |linux, a new |leave quote |deeprrr with |on stack, as |#18 & #19 is |comments say; |at webpage; <i437> |As for func |only be |'commandline' |performed |this uses |when a space |quotes that |is added |typically end |before this |with '~'; |mark--so add |some linux |space in the |commands will |usual case <i438> |It's up to |to apply a |programmer |simplifying |whether to |'threshold' |match on all |to pick out |of, or a |main shapes; |portion of, |some fcm's |the input; |will use many |and whether |approaches! <i439> imcontrast= 260000 ^. imcontrast imbrightness= kl ^. |ie,twoto16 is |{no change:0} |"multiply by !620 |1"; chk these imbrightness |two vars eg kl |via "vumatr" <i440> |The two vars |the bright- |imcontrast & |ness corrects |imbrightness |this before |should be |'makefit' is |USED TOGETHER |called so it |where the |gets 0->255; |contrast is a |THEN, the |multiple and |imthreshold: <i441> imthreshold= |check result ^. |w/rectune or 199 |second image imthreshold |of "vumatr"; kl |all these |Set this to |vars are |between basis |runtime |and 255 and |changable <i442> jumpnum= |5=every 5th ^. |pixel, sets 5 |jump/magnify jumpnum |factor when kl |going from eg |ONLY values |cam to matr; |1 to 5 here: |runtime |1=every pixel |changable <i443> pmatxstart= |to rm noise 4. |at cam-edges; pmatystart= |can only be 2. |1-5; these |9025 pixels |fastvars are |eg 95x95 used |respected |in pmatscore; |chiefly at |fit to robohw |jumpnums > 1 <i444> pmatscore= |exclusively |in:groundmatr |checks nonnil | inputmatr |pixels in |gives:count |groundmatr as |action:using |for nonnil |pmatxstart & |in inputmatr |pmatystart, |{after eg |& 95x95 area, |gemthreshold} <i445> s8 ll:95 s5 pmatystart pmatxstart s4 s3 |Formmatr:i5 basis ll:95 <i446> i3 i3 i4 i4 i5 i8 ww ww n? ye d6 ad <i447> h3 h4 lo lo. <i448> pmatscoretot= |count {up to |in:matr1, |9025} of | matr2 |TOTally equal |gives:count |pixels in |action:using |95x95 area of |pmatxstart & |2 matrixes; |pmatystart, |more usual: |this gives |'pmatscore' <i449> s8 ll:95 s5 pmatystart pmatxstart s4 s3 basis ll:95 <i450> i3 eq i4 i5 ww ad i3 h3 i4 lo i8 h4 ww lo. <i451> gemtomatr= |useful to get |action: this |general |is ONE way to |impressions; |prep match |cfr use in |over caminput |"vumatr";uses |--in which |vars jumpnum, |each 5th |imcontrast & |pixel picked; |imbrightness <i452> jumpnum imcontrast lk lk s4 s5 imbrightness lk t5 <i453> maxiarray 500 lk i4 sx rd t8 j8 sketch 100 lk su tx t9 <i454> ll:100 i4 |gem has y mm |bottom-up: s3 j8 ll:100 i1 |Matr begins |Gem begins |at 1,1 |at basis su <i455> m2 i5 i4 mm mm qb j9 qb ad i3 ix j5 ww ad <i456> 0 jx 255 yy makefit |Necessary for |SOME brite & |contr adjusts i2 lo i1 lo. <i457> gemthreshold= |are set as |action: this |bright and |is EXACTLY |the rest set |as gemtomatr |as basis |but that only |pixels equal imthreshold |to, or above, lk |imthreshold, t8 <i458> jumpnum imcontrast lk lk s4 s5 imbrightness lk t5 <i459> maxiarray 500 lk i4 sx rd t8 j8 sketch 100 lk su tx t9 <i460> ll:100 i4 |gem has y mm |bottom-up: s3 j8 ll:100 i1 |Matr begins |Gem begins |at 1,1 |at basis su <i461> m2 i5 i4 mm mm qb j9 qb ad i3 ix j5 ww ad <i462> j8 jx ge yy 255 mm i2 lo i1 lo. <i463> vumatr= |image eg from |action:A tool |vurobocam1 |for the fcm |{run it 1st}; |programmer: |then, after |this shows |enter, it |imbrightness& |shows effect |imcontrast & |of variable |jumpnum at |imthreshold <i464> newmatrix kk sh freshsketch gemtomatr gemthreshold approvesketch approvesketch. <i465> bigshow= t4 |In: quote, t3 |x,y,chartone, |bgroundtone |action:uses |"ga" rbotfont s4 |to display s3 |quote tx <i466> ll:2000000000 s5 i5 n? se i1 jx ay ex <i467> i5 j3 m1 32 j4 mm i3 ad ga i4 lo. <i468> hugeshow= t4 |In: quote, t3 |x,y,chartone, |bgroundtone |action:uses |huge rbotfont s4 |to display s3 |quote tx <i469> ll:2000000000 s5 i5 n? se i1 jx ay ex <i470> i5 j3 m1 64 j4 mm |gs is bigger i3 |than ga ad gs i4 lo. <i471> runtimematr= |this func can |in:xlen,ylen, |be called in | arraypos |loop, it gets |action:Normal |cleared space |sz&wwyymatrix |in ram & runs |stuff is done |wwyymatrix & |outside of |stores warp |functions; |in arraypos <i472> sx |note that s6 |wwyymatrix s5 |assumes at |ix can be eg |least xtra 50 |a warp to a |places in ram |place in an |So, this func |array, or a |automatically |variable |adds 60 <i473> |Always take mm |extra caution f |to call loops s9 |reserving ram 60 |only as much ad |as needed |reserve ram: i5 rs i6 s1 <i474> i1 i5 ix i6 |This addr |as wwyymatrix |is next |substracts 50 |modified by |wwyymatrix ix kl wwyymatrix <i475> |The wwyy i9 |approach ix |starts from lk |basis; to |{Is ok since |start x,y at |wwyymatrix |dance, give |calcs ww&yy |ram to ylen |by xlen only} |plus 2 or so clrthismany. <i476> sketchto= tx |in: addr |action: the |"sketch" |matrix gets |copied to the |matrix given |by address <i477> |from: |quantity: sketch 15000 lk |to: jx fw. <i478> tosketch= sx |in: addr |action: the |"sketch" |matrix gets |FROM the |matrix given |by address <i479> |from: |quantity: ix 15000 |to: sketch lk fw. <i480> pureforms1= |These arrays ^. |lists pureforms2= |matrices, ie, ^. |'pure forms', pureforms3= |used ^. |creatively |by the fcm |programmer <i481> 20 pureforms2 sz kl && 20 pureforms1 sz kl && 20 pureforms3 sz kl && <i482> ramtoforms= |pureform1-3; |action:this |and puts qty |gives ram |12 in their |to exactly |#0 positions; |12 matrices |after this, |pointed to |the design |by arraypos |shapes can be |1 to 12 in |put to them <i483> pureforms1 pureforms3 lk lk t1 t3 |Note:we inc |ylen so as to pureforms2 |be used with lk |'tosketch'etc t2 |w/fw at 15000 <i484> 12 12 j1 j3 kl kl |Any matr from |{1,1} must 12 |have extra j2 |ylen in kl |runtimematr <i485> ll:12 144 144 106 106 j1 j2 i1 i1 ad ad runtimematr runtimematr <i486> lo. 144 |This func is 106 |of the kind j3 |one can run i1 |during ad |compile: runtimematr ramtoforms <i487> variedrect= |between these |in:x1,y1,x2, |4 coordinates |y2,x3,y3,x4, |at matrfield; |y4,tone |twice use of |action:draws |'newtriangle' |filled rect, |to do the |or sth with |job; free |skewed angles |coor sequence <i488> sx s2 s4 t2 t4 s3 s1 t3 t1 <i489> ix j3 j1 i3 i1 j2 i2 newtriangle <i490> ix j4 j2 i4 i2 j3 i3 newtriangle. <i491> forge595= |{used to make |in:num,factor |eg pureforms} |gives:result mm |action:result ab |is within 5 91 |and 95, after mo |multiplied w/ 5 |factor & mod ad. <i492> ce ^Generating ^g15 pmn fcm pp pp ^fcm pattern ^starting up! pp pp ^matching pure pp &forms..& freestars pp <i493> shape1pure1= freshsketch |action:makes |shapeset#1 |for ll:89 |pureforms1, |and stores i1 |in right 4 |place in ram ad <i494> m1 50 697 ad mm cs 255 matrfield 223 rd lo <i495> 1 shape1pure1 pureforms1 lk ay sketchto. freestars <i496> shape2pure1= freshsketch |action:makes |shapeset#2 |for ll:89 |pureforms1, |and stores i1 |in right 4 |place in ram ad <i497> m1 ts 697 50 mm ad si 255 matrfield 223 rd lo <i498> 2 shape2pure1 pureforms1 lk ay sketchto. freestars <i499> shape3pure1= freshsketch |action:makes basis |shapeset#3 cs |for 223 |pureforms1, rd |and stores 50 |in right ad |place in ram s3 <i500> ll:39 f1 i1 sl sl 4 4 ad ad i3 <i501> i1 50 sl ad 697 mm cs 255 shapelines 223 rd lo <i502> 3 shape3pure1 pureforms1 lk ay sketchto. freestars <i503> shape4pure1= freshsketch |action:makes |shapeset#4 |for |pureforms1, |and stores |in right |place in ram <i504> 5 255 5 95 95 matrixrectf <i505> basis cs 223 rd 50 ad s3 <i506> ll:39 f1 i1 sl 4 4 ad ad i3 <i507> i1 25 sl ad 697 mm cs 0 shapelines 800 rd lo <i508> 4 shape4pure1 pureforms1 lk ay sketchto. freestars <i509> shape5pure1= freshsketch |action:makes |shapeset#5 |for |pureforms1, |and stores |in right |place in ram <i510> 5 255 5 95 95 matrixrectf <i511> basis si 223 rd 50 ad s3 <i512> ll:39 f1 i1 sl 4 4 ad ad i3 <i513> i1 25 sl ad 697 mm si 0 shapelines 800 rd lo <i514> 5 shape5pure1 pureforms1 lk ay sketchto. freestars <i515> shape6pure1= freshsketch |action:makes |shapeset#6 |for |pureforms1, |and stores |in right |place in ram <i516> 5 255 5 95 95 matrixrectf <i517> basis ll:10 si 223 rd 50 ad s3 <i518> ll:39 f2 i2 sl 4 4 ad ad i3 <i519> i2 si sl 600 i1 rd mm 68 50 mm ad <i520> i1 lo 2 mo 255 mm shapelines lo <i521> 6 shape6pure1 pureforms1 lk ay sketchto. freestars <i522> shape7pure1= freshsketch |action:makes |shapeset#7 |for |pureforms1, |and stores |in right |place in ram <i523> 45 255 45 95 95 matrixrectf <i524> basis ll:3 si 223 rd 50 ad s3 <i525> ll:39 f2 i2 sl 4 4 ad ad i3 <i526> i2 cs sl 500 i1 rd mm 58 30 mm ad <i527> i1 lo 2 mo 255 mm shapelines lo <i528> 7 shape7pure1 pureforms1 lk ay sketchto. freestars <i529> shape8pure1= freshsketch |action:makes |shapeset#8 |for |pureforms1, |and stores |in right |place in ram <i530> 50 255 5 95 95 matrixrectf <i531> basis ll:5 si 223 rd 50 ad s3 <i532> ll:39 f2 i2 sl 4 4 ad ad i3 <i533> i2 223 sl rd i1 mm 150 mm 50 cs ad <i534> i1 lo 2 mo 255 mm shapelines lo <i535> 8 shape8pure1 pureforms1 lk ay sketchto. freestars <i536> shape9pure1= freshsketch |action:makes |shapeset#9 |for |pureforms1, |and stores |in right |place in ram <i537> 5 255 5 35 95 matrixrectf <i538> basis ll:5 si 223 rd 50 ad s3 <i539> ll:39 f2 i2 sl 4 4 ad ad i3 <i540> i2 223 sl rd i1 mm 150 mm 50 si ad <i541> i1 lo 2 mo 255 mm shapelines lo <i542> 9 shape9pure1 pureforms1 lk ay sketchto. freestars <i543> shape10pure1= freshsketch |action:makes |shapeset#10 |for |pureforms1, |and stores |in right |place in ram <i544> 20 255 5 95 95 matrixrectf <i545> basis ll:5 si 223 rd 50 ad s3 <i546> ll:39 f2 i2 sl 4 4 ad ad i3 <i547> i2 600 sl rd i1 mm 50 mm 60 si ad <i548> f1 lo 2 mo 255 mm shapelines lo <i549> 10 shape10pure1 pureforms1 lk ay sketchto. freestars <i550> shape11pure1= freshsketch |action:makes |shapeset#11 |for |pureforms1, |and stores |in right |place in ram <i551> 5 255 5 35 25 matrixrectf <i552> basis ll:8 cs 223 rd 50 ad s3 <i553> ll:39 f2 i2 sl 4 4 ad ad i3 <i554> i2 223 sl rd i1 sl mm 50 mm 50 cs ad <i555> i1 lo 2 mo 255 mm shapelines lo <i556> 11 shape11pure1 pureforms1 lk ay sketchto. freestars <i557> shape12pure1= freshsketch |action:makes |shapeset#12 |for |pureforms1, |and stores |in right |place in ram <i558> 5 255 33 44 80 matrixrectf <i559> basis ll:4 cs 300 rd 50 ad s3 <i560> ll:39 f2 i2 sl 4 4 ad ad i3 <i561> i2 300 sl rd i1 mm 150 mm 50 si ad <i562> i1 lo 2 mo 255 mm shapelines lo <i563> 12 shape12pure1 pureforms1 lk ay sketchto. freestars <i564> shape1pure2= freshsketch |action:makes |shapeset#1 |for |pureforms2, |and stores |in right |place in ram <i565> 255 50 95 5 5 95 5 newtriangle <i566> 1 shape1pure2 pureforms2 lk ay sketchto. freestars <i567> shape2pure2= freshsketch |action:makes |shapeset#2 |for |pureforms2, |and stores |in right |place in ram <i568> 255 5 95 5 5 95 50 newtriangle <i569> 2 shape2pure2 pureforms2 lk ay sketchto. freestars <i570> shape3pure2= freshsketch |action:makes |shapeset#3 |for |pureforms2, |and stores |in right |place in ram <i571> ll:25 i1 37837938 i1 forge595 2 mo i1 255 57893215 mm forge595 <i572> i1 i1 6969123 15893219 forge595 forge595 i1 3691580 i1 forge595 31425262 newtriangle forge595 lo <i573> 3 shape3pure2 pureforms2 lk ay sketchto. freestars <i574> shape4pure2= freshsketch |action:makes |shapeset#4 |for |pureforms2, |and stores |in right |place in ram <i575> ll:14 i1 171832 i1 forge595 2 mo i1 255 141592 mm forge595 <i576> i1 i1 193000 585858 forge595 forge595 i1 9992 i1 forge595 14000 newtriangle forge595 lo <i577> 4 shape4pure2 pureforms2 lk ay sketchto. freestars <i578> shape5pure2= freshsketch |action:makes |shapeset#5 |for |pureforms2, |and stores |in right |place in ram <i579> 5 255 5 95 95 matrixrectf <i580> ll:14 i1 450982 m1 forge595 2 mo i1 255 348973 mm forge595 <i581> i1 i1 398022 347261 forge595 forge595 i1 3782 i1 forge595 16723 newtriangle forge595 lo <i582> 5 shape5pure2 pureforms2 lk ay sketchto. freestars <i583> shape6pure2= freshsketch |action:makes |shapeset#6 |for |pureforms2, |and stores |in right |place in ram <i584> 35 255 25 75 65 matrixrectf <i585> ll:55 i1 9823 f1 forge595 2 mo i1 255 5732 mm forge595 <i586> i1 i1 6832 2356 forge595 forge595 i1 3782 i1 forge595 5427 newtriangle forge595 lo <i587> 6 shape6pure2 pureforms2 lk ay sketchto. freestars <i588> shape7pure2= freshsketch |action:makes |shapeset#7 |for |pureforms2, |and stores |in right |place in ram <i589> 35 255 25 75 65 matrixrectf <i590> ll:8 i1 238473 f1 forge595 2 mo i1 255 329833 mm forge595 <i591> i1 i1 432839 237432 forge595 forge595 i1 329843 i1 forge595 239843 newtriangle forge595 lo <i592> 7 shape7pure2 pureforms2 lk ay sketchto. freestars <i593> shape8pure2= freshsketch |action:makes |shapeset#8 |for |pureforms2, |and stores |in right |place in ram <i594> 35 255 25 75 65 matrixrectf <i595> ll:6 i1 548376 f1 forge595 2 mo i1 255 832 mm forge595 <i596> i1 i1 349823 127222 forge595 forge595 i1 90238 i1 forge595 234872 newtriangle forge595 lo <i597> 8 shape8pure2 pureforms2 lk ay sketchto. freestars <i598> shape9pure2= freshsketch |action:makes |shapeset#9 |for |pureforms2, |and stores |in right |place in ram <i599> ll:9 i1 38273 i1 forge595 2 mo i1 255 959039 mm forge595 <i600> i1 i1 435783 32733 forge595 forge595 i1 43744 i1 forge595 32783 newtriangle forge595 lo <i601> 9 shape9pure2 pureforms2 lk ay sketchto. freestars <i602> shape10pure2= freshsketch |action:makes |shapeset#10 |for |pureforms2, |and stores |in right |place in ram <i603> 5 255 5 45 95 matrixrectf <i604> ll:7 i1 97843 f1 forge595 2 mo i1 255 98237 mm forge595 <i605> i1 i1 39484 29834 forge595 forge595 i1 48939 i1 forge595 93843 newtriangle forge595 lo <i606> 10 shape10pure2 pureforms2 lk ay sketchto. freestars <i607> shape11pure2= freshsketch |action:makes |shapeset#11 |for |pureforms2, |and stores |in right |place in ram <i608> 45 255 45 95 95 matrixrectf <i609> ll:3 i1 111115 m1 forge595 2 mo i1 255 11119 mm forge595 <i610> i1 i1 11113 11118 forge595 forge595 i1 111119 i1 forge595 11112 newtriangle forge595 lo <i611> 11 shape11pure2 pureforms2 lk ay sketchto. freestars <i612> shape12pure2= freshsketch |action:makes |shapeset#12 |for |pureforms2, |and stores |in right |place in ram <i613> 20 255 20 85 85 matrixrectf <i614> ll:10 i1 737289 f1 forge595 2 mo i1 255 10192 mm forge595 <i615> i1 i1 38737 28384 forge595 forge595 i1 23984 i1 forge595 27333 newtriangle forge595 lo <i616> 12 shape12pure2 pureforms2 lk ay sketchto. freestars <i617> shape1pure3= freshsketch |action:makes |shapeset#1 |for |pureforms3, |and stores |in right |place in ram <i618> 29 255 9 71 91 matrixrect <i619> 1 shape1pure3 pureforms3 lk ay sketchto. freestars <i620> shape2pure3= freshsketch |action:makes |shapeset#2 |for |pureforms3, |and stores |in right |place in ram <i621> 9 255 29 91 71 matrixrect <i622> 2 shape2pure3 pureforms3 lk ay sketchto. freestars <i623> shape3pure3= freshsketch |action:makes |shapeset#3 |for |pureforms3, |and stores |in right |place in ram <i624> ll:23 i1 333994 forge595 t1 i1 7778889 forge595 t2 <i625> i1 j1 5673935 j2 forge595 t3 i1 31191219 forge595 j3 t4 j4 <i626> j1 j3 j2 j4 i1 i1 10 5 mm mm ad ad 1 1 forge595 forge595 <i627> i1 variedrect 2 mo 255 mm lo <i628> 3 shape3pure3 pureforms3 lk ay sketchto. freestars <i629> shape4pure3= freshsketch |action:makes |shapeset#4 |for |pureforms3, |and stores |in right |place in ram <i630> ll:12 i1 348792 forge595 t1 i1 5853 forge595 t2 <i631> i1 j1 99321 j2 forge595 t3 i1 54549 forge595 j3 t4 j4 <i632> j1 j3 j2 j4 i1 i1 7 3 mm mm ad ad 1 1 forge595 forge595 <i633> i1 variedrect 2 mo 255 mm lo <i634> 4 shape4pure3 pureforms3 lk ay sketchto. freestars <i635> shape5pure3= freshsketch |action:makes |shapeset#5 |for |pureforms3, |and stores |in right |place in ram <i636> ll:33 i1 987573 forge595 t1 i1 5236211 forge595 t2 <i637> i1 j1 8271612 j2 forge595 t3 i1 19882271 forge595 j3 t4 j4 <i638> j1 j3 j2 j4 i1 i1 10 5 mm mm ad ad 1 1 forge595 forge595 <i639> i1 variedrect 2 mo 255 mm lo <i640> 5 shape5pure3 pureforms3 lk ay sketchto. freestars <i641> shape6pure3= freshsketch |action:makes |shapeset#6 |for |pureforms3, |and stores |in right |place in ram <i642> ll:79 i1 9875 forge595 t1 i1 7223 forge595 t2 <i643> i1 j1 6894 j2 forge595 t3 i1 2781 forge595 j3 t4 j4 <i644> j1 j3 j2 j4 i1 i1 3 55 mm mm ad ad 1 1 forge595 forge595 <i645> i1 variedrect 2 mo 255 mm lo <i646> 6 shape6pure3 pureforms3 lk ay sketchto. freestars <i647> shape7pure3= freshsketch |action:makes |shapeset#7 |for |pureforms3, |and stores |in right |place in ram <i648> ll:3 i1 743837 forge595 t1 i1 283993 forge595 t2 <i649> i1 j1 234983 j2 forge595 t3 i1 236583 forge595 j3 t4 j4 <i650> j1 j3 j2 j4 i1 i1 9 12 mm mm ad ad 1 1 forge595 forge595 <i651> i1 variedrect 2 mo 255 mm lo <i652> 7 shape7pure3 pureforms3 lk ay sketchto. freestars <i653> shape8pure3= freshsketch |action:makes |shapeset#8 |for |pureforms3, |and stores |in right |place in ram <i654> ll:10 i1 738832 forge595 t1 i1 236792 forge595 t2 <i655> i1 j1 658983 j2 forge595 t3 i1 112789 forge595 j3 t4 j4 <i656> j1 j3 j2 j4 i1 i1 39 23 mm mm ad ad 1 1 forge595 forge595 <i657> i1 variedrect 2 mo 255 mm lo <i658> 8 shape8pure3 pureforms3 lk ay sketchto. freestars <i659> shape9pure3= freshsketch |action:makes |shapeset#9 |for |pureforms3, |and stores |in right |place in ram <i660> ll:9 i1 23873 forge595 t1 i1 260698 forge595 t2 <i661> i1 j1 32783 j2 forge595 t3 i1 12872 forge595 j3 t4 j4 <i662> j1 j3 j2 j4 i1 i1 9 40 mm mm ad ad 1 1 forge595 forge595 <i663> i1 variedrect 2 mo 255 mm lo <i664> 9 shape9pure3 pureforms3 lk ay sketchto. freestars <i665> shape10pure3= freshsketch |action:makes |shapeset#10 |for |pureforms3, |and stores |in right |place in ram <i666> ll:6 i1 47883 forge595 t1 i1 92837 forge595 t2 <i667> i1 j1 8322 j2 forge595 t3 i1 12938 forge595 j3 t4 j4 <i668> j1 j3 j2 j4 i1 i1 4 56 mm mm ad ad 1 1 forge595 forge595 <i669> i1 variedrect 2 mo 255 mm lo <i670> 10 shape10pure3 pureforms3 lk ay sketchto. freestars <i671> shape11pure3= freshsketch |action:makes |shapeset#11 |for |pureforms3, |and stores |in right |place in ram <i672> ll:4 i1 23873 forge595 t1 i1 898398 forge595 t2 <i673> i1 j1 34873 j2 forge595 t3 i1 12387 forge595 j3 t4 j4 <i674> j1 j3 j2 j4 i1 i1 2 99 mm mm ad ad 1 1 forge595 forge595 <i675> i1 variedrect 2 mo 255 mm lo <i676> 11 shape11pure3 pureforms3 lk ay sketchto. freestars <i677> shape12pure3= freshsketch |action:makes |shapeset#12 |for |pureforms3, |and stores |in right |place in ram <i678> ll:12 i1 11222 forge595 t1 i1 87834 forge595 t2 <i679> i1 j1 68953 j2 forge595 t3 i1 32983 forge595 j3 t4 j4 <i680> j1 j3 j2 j4 i1 i1 9 28 mm mm ad ad 1 1 forge595 forge595 <i681> i1 variedrect 2 mo 255 mm lo <i682> 12 shape12pure3 pureforms3 lk ay sketchto. freestars <i683> vupmat= |gemthreshold, |action: a |to really see |programmer's |how pureforms |tool, eg |work to make |run directly |pmatscore w/ |after vumatr, |an input matr |or after eg |--use Enter |vurobocam1 & |{esc to quit} <i684> |The function |clue for fcm |shows #1 in |coding is to |pureforms1, |find score |pureforms2, |that changes |pureforms3, |in relevant |then #2 in |way when |them, up to |inputscene |#12; |is changed <i685> ce 300 newmatrix 720 approvesketch rp kk ^pmat scores! sh <i686> copysketch lk sketchextra ay lk tosketch sx ce newmatrix ll:12 i1 pureforms1 approvesketch <i687> i1 ix makenumber pmatscore 40 makenumber 720 300 rp 720 rp sketch kk lk sh <i688> i1 pureforms2 lk ay tosketch ce newmatrix approvesketch <i689> i1 ix makenumber pmatscore 40 makenumber 720 300 rp 720 |groundform: rp sketch kk lk sh <i690> i1 pureforms3 lk ay tosketch ce newmatrix approvesketch <i691> i1 ix makenumber pmatscore 40 makenumber 720 300 rp 720 rp sketch lk kk <i692> |Esc? 27 eq se ex lo. <i693> recentpmatnum= && ^. recentpmatnum 70 kl 4 |starts dance mm 70 65 3 ad recentpmatnum sz wwyymatrix <i694> |in this, 280 |pmatscores recentpmatnum |are stored; lk |and, with clrthismany |20 added as |this is used |index, also |by such as |the previous |vupmnums to |scores |compare <i695> vupmnums= |vupmat, not |action: shows |moved};diff |pmatscores |w/prev shown, |for all pure |too; tightly, |forms with |as lines of |present matr |numbers; use |{which is, |eg after |unlike in |gemthreshold <i696> sketch pureforms1 lk lk tx recentpmatnum lk t5 1 &ABC& ix sx ya <i697> pureforms2 pureforms3 lk lk 2 3 ix ix ya ya <i698> ll:3 i2 |sequence at i1 |stack for ix |pmatscore: ay |groundmatr, ay |inputmatr jx pmatscore ll:12 s9 <i699> i9 580 makenumber m1 m2 25 84 mm mm ad 4 ad rp <i700> i2 j9 i1 j5 i2 ww 20 ad i1 j5 t9 yy <i701> i9 i2 i1 j5 yy <i702> |the i9 |difference j9 |between this |patmatnum and su |the previous, |shown in line |underneath |main numbers t4 <i703> j4 685 makenumber m1 m2 25 84 mm mm ad 4 rp lo ad lo <i704> ll:12 658 i1 makenumber bx m1 84 mm 30 ad lo. <i705> deeprrrtx1= ^. cliptrail longtxt* f ./deeprrr.sh crparsed ~ *txtcomplete deeprrrtx1 kl <i706> deeprrrtx2= ^. cliptrail longtxt* f echo "#18P1500 crparsed T888" > /dev/t tyUSB0 ~ deeprrrtx2 *txtcomplete kl <i707> deeprrr= |Note:in this |action:starts |app chan#18 |a robohw |is used, not |specific |chan#2; |command for |this command |deep reset |also resets |of robot,then |all of |calls "rrr" |poschannels <i708> |Hwspecific |deeprrr will |center: |usually cause 1500 |SOME jerking maxqtychan |of robot, so poschannels |plan for that lk |--also, to be dc |sure of reset fc |use it twice <i709> deeprrrtx1 deeprrrtx2 lk lk commandline commandline 200 activepause rrr 200 900 activepause activepause. <i710> store60fact1= |as factors in &xxxxxxxxxxx&. |mm6 used in store60fact2= |encoding and &xxxxxxxxxxx&. |decoding 4 eg |These are two |pmat numbers |"fastarrays" |{eg 0->9999} |used in pairs |as num6 in |for 60bitnums |eg storein60 <i711> ^1 1 store60fact2 ya 1 store60fact1 quotetonum6 ya <i712> ^10000 2 store60fact2 ya 2 store60fact1 quotetonum6 ya <i713> ^100000000 3 store60fact2 ya 3 store60fact1 quotetonum6 ya <i714> ^1000000000000 4 store60fact2 ya 4 store60fact1 quotetonum6 ya <i715> storein60= |gets positive |in: num6, |num, 0->9999, | position, |stored in | number |position 1->4 |gives: num6 |Note:num60 is |action: the |unsigned&must |60b num {a |have basis at |pair of 32b} |this position <i716> s9 f store60fact1 ay w store60fact2 ay <i717> |Convert this mm6 |small num to |60b: 0 i9 |Then, 60b mm |and 60b ad: ad6. <i718> loadfrom60= |will yield a |in: num6, |number, | position |unsigned, |gives: number |from 0 to |action: pos |9999, which |is 1,2,3,or 4 |previously eg |and the num6 |has been put |{pair of 32b} |by storein60 <i719> f 0 store60fact1 10000 ay mo6 w |Convert this store60fact2 |small num ay |to 32b: w di6 sh. <i720> delfrom60= |storein60, |in: num6, |will have the | position |pos content |gives: num6 |set to basis |action: pos s1 |is 1,2,3,4; |The num6, as d |made eg by d <i721> i1 0 store60fact1 10000 ay i1 store60fact2 ay di6 mo6 <i722> i1 mm6 store60fact1 ay i1 store60fact2 ay su6. <i723> save6= 6 |in: a1 a2 a3 ix | a4 a5 a6 ya | arraywarp |action: saves |6 nums to 5 |pos 1 to 6 ix sx ya <i724> 4 2 ix ix ya ya 3 1 ix ix ya ya. <i725> load60b1of12= |select which |in: num60a |60bit number |num60b num60c |{pair} upon |position |which to use |gives:number |loadfrom60; |action: the |unsigned |pos, 1->12, |result from |is used to |0->9999 <i726> s1 1 &xxxxxx& 12 tx iswithin jx d2 save6 basis i1 ex <i727> m1 up jx sr ay up m1 f 4 jx mo ay up w loadfrom60. <i728> put4in2places= |are encoded |in: a b c d |as a single |warp1 warp2 |60bit number, |action: the |of which its |four numbers |highest part |a b c d, must |is put to |be unsigned & |warp1, other |range 0->9999 |part to warp2 <i729> tx 0 sx 0 1 s4 s3 s2 i1 s1 storein60 <i730> 2 4 i2 i4 storein60 storein60 jx 3 kl i3 ix storein60 kl. <i731> vuinputandnum= |and also the |in: cam# |patmatnums; |action:shows |waits at key |gem of |press; a sub- |vucam1,2,3 |routine of |{modify this |rectune |func for |more inputs}; <i732> s5 ^Camera now: pp i5 ce nn <i733> 100 i5 1 eq se activepause vurobocam1 <i734> i5 i5 2 3 eq eq se se vurobocam2 vurobocam3 <i735> gemthreshold ^Press a key! pp kk vupmnums sh. <i736> vuthresandnum= |and also the |in: cam# |patmatnums; |action:camvu |waits at key |w/imthreshold |press; a sub- |for cam1,2,3 |routine of |{modify this |rectune |func for |more inputs}; <i737> s5 ^Processes cam pp i5 ce nn <i738> 100 activepause <i739> i5 i5 1 2 eq eq se se rg1 rg2 <i740> i5 sh 3 eq se rg3 vumatr <i741> vupmnums ^imthreshold: pp ^imcontrast: pp imcontrast imthreshold lk lk nn nn <i742> ^imbrightness: ^jump/magnify: pp pp imbrightness jumpnum lk lk nn nn <i743> ^{press a key} pp kk sh. <i744> |Comment about |input via the |call of 'car' |prt-functions |inside a |In short, do |function that |sth like |uses prtinput |'clipleading' |--car calls |so it gets to |'prtclr', and |new quote- |this clears |space <i745> startcartx= cliptrail ^. longtxt* Pls type cardi d as input to "car": startcartx *txtcomplete kl <i746> startcar= lk |action: asks prt |for input of prtinput |cardid and clipleading |starts car, |is now in |with handling |new |of quotespace |quotespace startcartx car. <i747> plurchanmode= |This is set ^. |to basis at |"plural |upstart of |channel mode" |rectune; its |in rectune? |<bksp> key |a flag |sets it to plurchanmode |dance; its basisthis |<ins> resets <i748> plurchanlist= && ^. plurchanlist kl maxqtychan 15 |cfr ad |initplurchan sz |for layout <i749> plurchtim= |plurchtim is ^. |maxtime plurchqty= |required for ^. |plural recact |Set to basis plurchtim |at bksp in basisthis |rectune & plurchqty |at its start basisthis <i750> initplurchan= |channels have |action:this |up to 1 move |is called by |each; & with |<bksp> in |the time for |rectune so as |the longest |to ready the |move {ie,pgup |array where |/pgn} goes to |up to 18 |plurchantim <i751> plurchanmode |Layout for dancethis |plurchanlist |is in next plurchtim |card basisthis maxqtychan plurchanlist plurchqty lk basisthis clrthismany. <i752> |layout for |at pos#0,info |plurchanlist: |for chan#0, |plurchanqty |at pos#1,info |tells how |for chan#1; |many are set |etc; info is: |{adviced max |3:pgup !3:dn |18; comlen w/ |2:home !2:end |electronics} |1:f1 !1:f1 <i753> minichantimes= robotiminca &xxxxxxxxxxx&. lk |For pgup/pgdn |Used by |plurchan func |A fastarray 3 |with timings minichantimes |for minimoves ya <i754> robotimincb robotimincc lk lk |For home/end |For f1/f2 2 1 minichantimes minichantimes ya ya <i755> minichposinc= roboposinca &xxxxxxxxxxx&. lk |For pgup/pgdn |Used by |plurchan func |A fastarray 3 |w/pos change minichposinc |for minimoves ya <i756> roboposincb roboposincc lk lk |For home/end |For f1/f2 2 1 minichposinc minichposinc ya ya <i757> plurchanmsg= :) ^. *txtcomplete cliptrail longtxt* Please put max 18 moves into each combined plurchanmsg channel move kl <i758> intoplurchan= |that storage |in: keynum, |of 1 move in | channelnum |any channel#, |action: given |{max 18 moves |pgup/dn,home/ |each time} |end or f1/f2 |are put in |this acts, in |plurchlist & |rectune, so |plurchtim <i759> s8 plurchanmode s5 dancethis |{Normally on} basis |Note:this basis |func's made |presumes that |in the slow |initplurchan |context of |is called |keyb read,ok? <i760> plurchqty plurchanmsg lk lk 18 prt lt ex |Quantity ok: plurchqty d4 danceup <i761> i5 sh |key{pgup}: sh 280 eq n? dance d4 three <i762> i5 sh |key{pgdn}: sh 281 eq n? oneminus d4 three <i763> i5 sh |key{home}: sh 278 eq n? dance d4 two <i764> i5 sh |key{end}: sh 279 eq n? oneminus d4 two <i765> i5 sh |key{f1}: sh 282 eq n? dance d4 dance <i766> i5 sh |key{f2}: sh 283 eq n? oneminus d4 dance <i767> mm i8 s3 0 i3 maxqtychan n? makefit se ex s8 <i768> i3 i8 plurchanlist lk ya <i769> i3 plurchtim ab lk minichantimes maxofthis plurchtim ay kl. <i770> thisplurch= sx |in: pos |action: |subroutine of ix |plurchanact; plurchanlist |pos in lk |plurchanlist ay |is nonzero s5 <i771> recactarray i5 lk ab s1 minichposinc ay |change of pos poschannels |for 1, 2 or 3 lk s3 s8 <i772> i5 i8 0 ts ge d3 s8 <i773> ix poschanmin i3 poschanmax ay |Ranges for |channel i8 makefit ad s9 <i774> |Assert chan: |Assert pos: |type 1 |type 2 1 2 |chan |position ix i9 i1 i1 newcouple newcouple. <i775> plurchanact= |stores in the |action: given |recarray; |previous |can be called |calls to |several times |intoplurchan, |in a row; |this carries |the <ins>-key |out the robot |in rectune |move and also |calls this <i776> plurchanmode |Depending on basisthis |commandline |In rectune, |to robohw, |this simply |keep the qty |means that |parallel |it is no |channels in |longer in |each command |<bksp>-mode |in leashes <i777> plurchtim se lk n? ex plurchqty lk plurchanlist n? lk or sx <i778> recactarray i4 lk lk s4 t4 |present qty |of couples poschannels lk |start-channel s3 0 <i779> ll:1 f f ix ay n? d2 thisplurch <i780> f up maxqtychan lo lt se q1 sh <i781> |Assert ms: |this is to |type 3 |robohardware 3 |ms plurchtim lk i4 newcouple <i782> |Assert cr: |Assert send: |type 4 |type 5 4 5 0 0 i4 i4 newcouple newcouple <i783> |Then program |stream is |waits,type 6 |done,type 7 6 7 plurchtim 0 lk i4 i4 newcouple newcouple <i784> |j4 has qty j4 |couples prior up |to this f4 |plural kl |channel |stream; |get it |started: perf1recact. <i785> rectunechact= |that robot |in: keynum, |moves and | channelnum |storage in |action: given |recarray |pgup/dn,home/ |happens;when |end or f1/f2 |plurchanmode, |this acts, in |it stores in |rectune, so |own array 1st <i786> s8 i5 s5 i8 plurchanmode intoplurchan lk |bcn n? d4 ex <i787> i5 dance |key{pgup}: i8 280 eq n? d3 robominimovea <i788> i5 oneminus |key{pgdn}: i8 281 eq n? d3 robominimovea <i789> i5 dance |key{home}: i8 278 eq n? d3 robominimoveb <i790> i5 oneminus |key{end}: i8 279 eq n? d3 robominimoveb <i791> i5 dance |key{f1}: i8 282 eq n? d3 robominimovec <i792> i5 oneminus |key{f2}: i8 283 eq n? d3 robominimovec. <i793> rectunetx1= ual ^. *txtcomplete cliptrail longtxt* Welcome to Rec tune. At app b oot, do deeprr rectunetx1 r's, <f9>. man kl <i794> rectunetx2= bot ^. *txtcomplete cliptrail longtxt* reset of recac tarray by <f7> ; <esc> exits; rectunetx2 <f5> moves ro kl <i795> rectunetx3= views ^. *txtcomplete cliptrail longtxt* by pract; <f8> recact's load save <f9> deep rectunetx3 rrr; <f12> cam kl <i796> rectunetx4= etc ^. *txtcomplete cliptrail longtxt* w/3 x 12 patma tnums {purefor ms}; <f11> sam rectunetx4 e w/threshold kl <i797> rectunetx5= on ^. *txtcomplete cliptrail longtxt* <f4> call 'vup mat', which sh ows which pixe rectunetx5 ls are matched kl <i798> rectunetx6= eshold ^. *txtcomplete cliptrail longtxt* <f3> "car" car dview; ctr-b, -c & -t for br rectunetx6 ight,contr,thr kl <i799> rectunetx7= ct; ^. *txtcomplete cliptrail longtxt* <f10> magnify camview. pgup/ dn,home/end,f1 rectunetx7 /f2 as in reca kl <i800> rectunetx8= annel, ^. *txtcomplete cliptrail longtxt* combine channe ls in single m ove: press <bk rectunetx8 sp>, select ch kl <i801> rectunetx9= ins>! ^. *txtcomplete cliptrail longtxt* then eg pgup, new channel et c; when done w rectunetx9 /bksp, click < kl <i802> rectunetx10= apps:) ^. *txtcomplete cliptrail longtxt* Programmer, pl s rewrite this tool to fit w rectunetx10 ith other robo kl <i803> rectunetx11= : ^. *txtcomplete cliptrail longtxt* Present channe l positions as stored in arr rectunetx11 ay poschannels kl <i804> rectunetx12= p} ^. *txtcomplete cliptrail longtxt* {to select cha nnel: digits 0 -9; lowercase rectunetx12 a for 10 and u kl <i805> rectuneinfo= |action: info |about fkeys |etc in |rectune;meant |to be called |from rectune <i806> rectunetx1 rectunetx3 lk lk prt prt rectunetx2 rectunetx4 lk lk prt prt <i807> rectunetx5 rectunetx7 lk lk prt prt rectunetx6 rectunetx8 lk lk prt prt <i808> rectunetx9 rectunetx11 lk lk prt prt rectunetx10 rectunetx12 lk lk prt prt <i809> 0 ll:7 s3 poschannels lk sx ll:5 <i810> i3 & & prtnumcont prtcont &:& h3 prtcont lo i3 && ix prt ay prtnumcont lo. <i811> rectunetxup= rview ^. *txtcomplete cliptrail longtxt* Welcome to Rec tune! {you've done deeprrr?} rectunetxup Tabulator=ove kl <i812> rectunetxinp= is: ^. *txtcomplete cliptrail longtxt* Camera# is set by Uppercase A=1,B=2,C=3; p rectunetxinp resent input # kl <i813> rectunetxcha= ^. *txtcomplete cliptrail longtxt* pgup/dn,home/e nd,f1/f2 act o n THIS channel rectunetxcha #: kl <i814> rectunetxclr= ^. *txtcomplete cliptrail longtxt* Recactarray no w cleared {bef ore load, it's rectunetxclr also cleared} kl <i815> rectunelenmsg= ght :) ^. *txtcomplete cliptrail longtxt* Recactarray ne aring full; pl s eg save; ke rectunelenmsg ep movesets ti kl <i816> rectunetxbr= *txtcomplete ^. cliptrail longtxt* Pls type new v alue of imbrig htness {-nnnn. rectunetxbr ..nnnn}: kl <i817> rectunetxco= *txtcomplete ^. cliptrail longtxt* Pls type new v alue of imcont rast {65536=2^ rectunetxco 16=unchanged}: kl <i818> rectunetxth= *txtcomplete ^. cliptrail longtxt* Pls type new v alue of imthre shold {0...255 rectunetxth }: kl <i819> rectunetxjm= 1>}: ^. *txtcomplete cliptrail longtxt* JUMP/magnify: pls type 1..5 {eg 3=each 3r rectunetxjm d pixel in <f1 kl <i820> rectune= |much range- |action:this |checks--to do |is a tool for |such as |programmers-- |explore |be sure to |pmatscore's |type input |and finetune |correctly, as |robotmotors |there aren't |etc! :-) <i821> recactarray && lk prt sx && plurchanmode prt basisthis prtrelease ce rectunetxup prtclr lk prtsuspend prt <i822> basis ll:2000000000 s8 &all right& |Channel now prtcont 1 tx |Input now 100 ^x t5 t3 <i823> 59 jx plurchanmode prt lk ad jx up ki kl s5 <i824> jx i5 999 |esc 27 10 27 rp eq se 100 activepause ex <i825> i5 |key{tabl}: 9 eq n? dh <i826> prtsuspend tn rectuneinfo tn rectunetxinp rectunetxcha lk lk prt prt jx prtrelease prtnum i8 tn prtnum <i827> i5 |key{bksp}: 8 eq se initplurchan <i828> i5 |key{ins}: 277 eq se plurchanact <i829> i5 i5 |key{pgup}: i8 280 eq n? d3 rectunechact <i830> i5 i5 |key{pgdn}: i8 281 eq n? d3 rectunechact <i831> i5 i5 |key{home}: i8 278 eq n? d3 rectunechact <i832> i5 i5 |key{end}: i8 279 eq n? d3 rectunechact <i833> i5 i5 |key{f1}: i8 282 eq n? d3 rectunechact <i834> i5 i5 |key{f2}: i8 283 eq n? d3 rectunechact <i835> i5 |key{f3}: 284 eq se startcar <i836> i5 |key{f4}: 285 eq se vupmat <i837> i5 |key{f8}: 289 eq se actsaveload <i838> i5 |key{f5}: 286 eq se pract <i839> i5 rectunetxclr |key{f7}: lk 288 prt eq n? d4 clractarray <i840> i5 |key{f9}: 290 eq se deeprrr <i841> i5 rectunetxjm |key{f10}: lk 291 prt eq prtinput n? intonum jumpnum d7 kl <i842> i5 jx |key{f11}: 292 eq n? d2 vuthresandnum <i843> i5 jx |key{f12}: 293 eq n? d2 vuinputandnum <i844> i5 rectunetxbr |key{ctr-b}: lk 2 prt eq prtinput n? intonum imbrightness d7 kl <i845> i5 rectunetxco |key{ctr-c}: lk 3 prt eq prtinput n? intonum imcontrast d7 kl <i846> i5 rectunetxth |key{ctr-t}: lk 20 prt eq prtinput n? intonum imthreshold d7 kl <i847> i5 iswithin 48 n? su t3 d2 j3 0 j3 9 s8 <i848> i5 iswithin 87 n? su t3 d2 j3 10 j3 31 s8 <i849> i5 iswithin 64 n? su t3 d2 j3 1 j3 3 tx <i850> ix lk |qty couples sl 333 ad actarraylen le <i851> d3 rectunelenmsg lk prt lo. <i852> thesetotriad= |the warp to |in:val1,val2, |the matrix}; |val3,ypos,var |and the val1 |action:the |is put to |VARIABLE that |{0,ypos};val2 |holds a warp |to {1,ypos}; |to a matrix |val3 to |is given {not |{2,ypos} <i853> lk s1 s3 s5 s8 sx <i854> ix i8 0 1 i3 i3 i1 i1 yy yy <i855> i5 2 i3 i1 yy. <i856> pfnumdeltas= |tells the |in: link#1 |differences, |link#2 link#3 |"deltas", |fnwarp |between that |triadmatrwarp |which is in |gives: delta1 |triad vs link |delta2 delta3 |1,2,3 to pf |action: this |nums 1,2,3 >> <i857> |the use of |3 pureform |this routine |sets; each 12 |is meant to |pfnums are in |be after |60bitnums |jumpnum, |in triplet# |threshold etc |8, 9 and 10; |are correctly |triad 'range' |applied; |not used here <i858> |triadmatrix |the idea of |has nums |having 3 such |like 30007 |groups of 3 |{pfset3,#7}, |is that eg by |324 {its num} |rectune one |10002 {100 as |can pick out |range, 02 as |the 3 most |jumpnum}; |telling pfnum <i859> tx |linknumbers |triadwarp |in this fn 49 |{1->100} on ad |stack to pf sx |nodenums,they |fastarray: |use triplet#8 &123& |to 10,ie,pos t1 |31&up for 60b <i860> ix ix wk wk fnwarp fnwarp 31 31 ad ad 3 2 j1 j1 ya ya <i861> |note:a matrix ix |often begins wk |at basis;then fnwarp |use m1 etc 31 |rather than ad |i1:way to 1 |remember, 'm' j1 |as in Matrix ya <i862> ll:3 di |pf set: j1 0 ay m1 s8 jx |position: ww 10000 f mo 10000 s5 <i863> |First num60b: |Second num6: i8 3 lk i8 wk 2 5 i8 i8 wk wk <i864> |Third num6: 6 i8 wk 8 i8 wk <i865> i5 |Comparison, load60b1of12 |positive when |Triadvalue, m |higher value |for Matrix: |than in triad 1 |by substract: m1 su jx ww lo. <i866> quatropf= |via given pf |in:startpfnum |array, using | pfarraywarp |matrix sketch |gives:p q r s |where already |action:gets 4 |imtreshold &c |pmatscores |are applied |from given ad |pos to pos+3 s4 <i867> sketch pmatscore lk sx ll:4 i4 h4 lk ix lo. <i868> practincyber= |input in |action: this |cybernetes |is as pract |node, this |in the open |doesn't look |robotics |up keyboard |core, but |at all:task |in order to |snippet is |allow keyb |always done <i869> recactarray |Set to 1st lk |couple: ix sx initcouple <i870> ll:2000000000 perf1recact ix donecouple se ex lo. <i871> maindance= 1 |in:fundwarp w |action:this |practical 10 |fcm func |sets mainval |{ie, #10} to |dance {ie, 1} kw. <i872> incmainval= 10 |in:fundwarp ad |action:this |practical 1 |fcm func adds w |1 to mainval |{ie, #10} ku. <i873> extrabasis= 0 |in:fundwarp w |action:this |practical 12 |fcm func |sets extraval |{ie, #12} to |dance {ie, 1} kw. <i874> settenthtri= |triplet {ie, |in:number, |position 37} |fundwarp |action:this 37 |practical fcm |func sets the |main value of |the tenth kw. <i875> itsmainextra= |the linked to |in: n, |fund, 1->qty, |thisfundwarp |when n,link#, |gives:mainval |is in range; | extraval |in case n is |action:finds |out of range |main,#10 & |it gives !1 |extra,#12, of |twice instead <i876> tx s9 |qty links: 47 jx wk t7 <i877> i9 oneminus f 1 j7 iswithin d3 ex <i878> i9 f 49 10 ad wk jx wk w 12 fnwarp wk. <i879> fnactivate= |in the given |in:link#, |fund, and |thisfundwarp |sets the #49 |action:this |'active' flag |practical |in the fund |fcm func |linked to, |looks up |to dance; |link#1->100 |cfr fnpassive <i880> 49 1 ad |Start of |links is |Activeflagpos |at next w |warp, so: fnwarp 49 wk kw. <i881> fnpassive= |in the given |in:link#, |fund, and |thisfundwarp |sets the #49 |action:this |'active' flag |practical |in the fund |fcm func |linked to, |looks up |to basis; cfr |link#1->100 |fnactivate <i882> 49 0 ad |Start of |links is |Activeflagpos |at next w |warp, so: fnwarp 49 wk kw. <i883> |When sequence |tell that sub |of subactions |action is |required, one |going on;when |might use #10 |it is 5, the |mainval for |subaction is |subactionnum, |done {whether |& extraval |with success |{#12} to 1 to |or not} <i884> |so that when |case of issue |all done, |with carrying |success is |it out; |told by two |subactionnum |billion as |is 1->n,where |mainval; but |n usually is |basis goes to |equal to qty |mainval in |of subactlink <i885> |Note that |a loop over |plural |the states of |approaches |the various |can perfectly |subactions |well be used |inside the fn |in a single |function |fcm matrix: |tells |in which case |progress <i886> |Also note |for various |that what may |possible |seem to be |issues, to |'redundancy' |reduce risks |in info as |of issue with |stored in |the robot |nodes may be |functionality |a safety net | <i887> |next handful |doneenough or |of funcs are |triedenough |meant to be |completes it; |used together |and the func |so that |subactstate |carryout |gives report |starts a sub- |on unfolding |action, while |sequence <i888> |"sub-actions" |they self- |set up in |passivate by |this way have |doneenough or |#49 active |triedenough |set to basis, |which also |then carryout |modifies main |activates |and extra val |them, while |accordingly <i889> |Note that any |only up to a |fund can do |certain |anything by |point {ie, up |virtue of its |to a certain |algorithm:and |mainval},then |one may for |do checks & |instance use |selective use |subactstate |of carryout <i890> subactstate= |is given an |in:fundwarp |analysis, cfr |gives: |next card; | statenum |it fixes a 0 |actions: a |in mainval to |fund of type |1 and then |"sequential |also sets |subactions" |extra to 0 <i891> |subactstate |subaction; |returns: |thousand: can |1:subaction |start mainval |goes on; |subaction in |tenmillion: |case this |success in |link# is in |subaction; |range;values |million:tried |100,101:issue <i892> tx |In case of |100 or 101, |it suggests 10 |that a node jx |has a wk |peculiar |combination s3 |of values <i893> i3 jx ye maindance dance s3 jx d6 extrabasis <i894> i3 d2 1 100 hundred iswithin ex <i895> 12 d2 jx wk s5 i5 thousand ye ex <i896> i3 jx itsmainextra |This has |range check |for link# s2 s1 <i897> i1 n? 1 100 d2 iswithin i2 1 eq dance an ex <i898> i2 n? 5 d2 million ex hundred eq up. <i899> carryout= |puts dance to |in:link#, |mainval & 0 |thisfundwarp |to extraval |action:puts |of linked to |activeflag on |fn; & sets |as for fn w/ |extraval of |this link# |THIS fn to 1: |{1->100}, & |is subacting <i900> sx 1 ix jx 49 49 ad wk fnwarp tx kw <i901> 1 1 jx ix 10 12 kw 0 jx 12 kw kw. <i902> doneenough= |The two |in:fundwarp |billion |action:this |signifies |practical fcm |success; |func sets fn |it also sets |to passive & |extraval to 5 |two billion |Compare |to mainval |'triedenough' <i903> tx 5 jx 2000000000 12 kw 0 jx jx 10 49 kw kw. <i904> isitcompleted= |and 5 to |in:fundwarp |exttraval, |gives:flag |WHEN mainval |this gives |has a larger |dance & sets |value than |fn passive & |qty of links; |two billion |Alternative |to mainval, |to doneenough <i905> tx d2 jx 10 wk jx 47 wk basis gt ex <i906> 2000000000 0 jx jx 10 49 kw kw 5 jx 12 kw dance. <i907> triedenough= |and 5 to |in:fundwarp |extraval; |action:this |this is used |practical fcm |when the |func sets fn |attempted |to passive & |activity |basis to |didn't quite |mainval |go through <i908> tx 0 jx 0 49 kw 5 jx jx 10 12 kw kw. <i909> cybermsg1= be in ^. *txtcomplete longtxt* cliptrail Hi! Time to sm ile! Somehow s omething isn't cybermsg1 as it should kl <i910> cybermsg2= make ^. *txtcomplete longtxt* cliptrail this program. If you aren't the programmer cybermsg2 of it, do pls kl <i911> cybermsg3= key ^. *txtcomplete longtxt* cliptrail a note of exac tly what prcee ded this issue cybermsg3 . Then press a kl <i912> cybermsg4= :-) ^. *txtcomplete longtxt* cliptrail on keyboard; b e sure to rest art pc and rob cybermsg4 ot machinery. kl <i913> exitmsgissue= prtclr |in: msgnum prtsuspend |action: fnloopcont |exits fcm w/ basisthis |message from |this program cybermsg1 t2 lk ce prt <i914> cybermsg2 cybermsg4 lk lk prt cybermsg3 lk prt prt <i915> &Messagenum: & prtrelease prtcont &{note num}& prt kk sh j2 prtnum ce. <i916> addnexus= |ups ITS qty |in:fundname |of links, & |action:when |puts THERE |making new |link to fn |funds, this |presently |finds a |being made; |previously |compare: |made fund, |"connectfund" <i917> tx ce jx jx fnamw pp sx kk ix sh ye ex |ie, info when d6 |not found <i918> |up qty links: f3 ix |calling place 47 |must watch wk |max qty links |{ie, 100} ix 47 s3 kw <i919> thisfund lk 49 f3 ad ix kw. <i920> connectfund= |qty of links |in:fundname |it has; the |action:when |name of the |making new |fund to be |funds this |connected to |puts a new |is given to |link to it, |this routine; |& incs the |cmp addnexus <i921> tx ce jx jx fnamw pp sx kk ix sh ye ex |ie, info when d6 |not found <i922> thisfund ix lk wtofnnum fnwarp tx s1 <i923> |up qty links: f3 jx |calling place 47 |must watch wk |max qty links |{ie, 100} jx 47 s3 kw <i924> i1 49 f3 ad jx kw. <i925> dorecorded= |so on {within |in:snippetnum |disk size}; |action:loads |then makes |recarray from |robot move by |k-disk, num 1 |practincyber |is k10100, |{it also does |num 2 is at |prtsuspend & |k10200, and |prtrelease} <i926> s3 prtsuspend 11 loadactarray |disk&card prtrelease 10000 100 i3 mm ad practincyber. <i927> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Next, some |change these |numbers that |to accomodate |fit book scan |variations in |app, pureform |how app is |matching nums |used; webpage |from rectune; |tells how |() |() () <i928> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Here we use |respectively, |3 sets of 12 |pureform#10 |pureforms and |in 3rd set, |we write eg |and form#7 |30010 & 10007 |in 7th set, |so as to mean |as notation |() |() () <i929> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Here we use |insight is |three pfnums |expressed; |for a match |a 3x3 matrix |job--together |for each task |with function |fn explained |where more |in next card: |() |() () <i930> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |First, a num |1350,max 9995 |like 30005: |Then, a num |3 is 3rd set |like 123405 |of pforms,#5 |where 1234 is |in it; then |range,& 05 is |a score,like |jump/magnify |() |() () <i931> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |In this app, |like 100, and |jump/magnify |tells ca how |is same in a |how score can |task; note |sway,+ or -; |that range is |w/jumpnum 05 |often small, |it is: 10005 |() |() () <i932> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |Soon, we give |matrix is set |each task in |up; and we |this app a |associate |tasknum or id |matrices of |to organize |patmatnums w/ |how the fcm |the tasknums |() |() () <i933> |^^^^^^^^^^^^^ |^^^^^^^^^^^^^ |For taskfunds |twobillion |{named eg tk5 |means success |or t2501a or |{didn't do:0} |such} mainnum |When done, |holds phase#, |they "self- |1->n, where |passify" |() |() () <i934> |prelim: note, |of a range of |important:ALL |suitable task |tasks that |snippets, and |are outlined |refined as |next will be |the book scan |re-organised |roboapp is |AFTER |gradually |entrainments |completed! :) <i935> |tk1 task#1 |behave this |"get main |way: 20004 & |piece of |30007 changes |rubber" |at too left |The pure- |eg 85, and at |forms nums |too right |in t1pf |eg !150 |given next <i936> t1pf= 3 ^. 3 80 t1pf sz |Let's bear && |in mind that |matrices t1pf |start at 0,0 kl wwyymatrix <i937> 20004 30007 1039 324 10003 10003 0 1 |prelim:new |prelim |nums to come t1pf t1pf thesetotriad thesetotriad <i938> 30010 |This info is 1276 |picked up by 10003 |the fcm node 2 |for the task |prelim |and used via |the 60bit t1pf |encoding of thesetotriad |analysisnodes <i939> |t1a task#1a |subtask to |"place the |tk1 {"tk1" |roboarm so |has len 3, |cam points |minlen of |to where |names here}; |rubber is |assumed to |be" <i940> |t1b task#1b |"use pfnums |to select |correct way |of getting |rubber" |nonsequential |func in use: |since it uses |pfnumdeltas |conditions <i941> |t1b1 task#1b1 |subtask to |"get main |t1b |piece of |rubber when |it is |perfectly |placed" <i942> |t1b2 task#1b2 |subtask to |"get main |t1b |piece of |rubber when |it is ca 1cm |too much to |the left" <i943> |t1b3 task#1b3 |subtask to |"get main |t1b |piece of |rubber when |it is ca 1cm |too much to |the right" <i944> |tk5 task#5 |The 2nd piece |"place main |of rubber is |piece of |used only |rubber under |when deeply |text at right |into scanning |page" |the book, not |at the first |pages <i945> |t25 task#25 |"get other |piece of |rubber" <i946> |task#2501 |subtask to |"get other |t25 |piece of |rubber when |it is |perfectly |placed" <i947> |task#2502 |subtask to |"get other |t25 |piece of |rubber when |it is ca 1cm |too much to |the left" <i948> |task#2503 |subtask to |"get other |t25 |piece of |rubber when |it is ca 1cm |too much to |the right" <i949> |task#30 |"place other |piece of |rubber under |text at right |page" <i950> |task#50 |"photograph |all of the |right book |page & store |at disk" <i951> |task#5001 |subtask to |"photograph |t50 |via camera#2 |and store at |disk" <i952> |task#5002 |subtask to |"photograph |t50 |via camera#3 |and store at |disk" <i953> |task#80 |"retrieve |other rubber |from book |and place |under book" <i954> |task#180 |"retrieve |main rubber |from book |and use it |to leaf to |next page" <i955> maxfundnum= && 10000. fundnet 150 kl maxfundnum mm 150 200 maxfundnum ad fundnet sz wwyymatrix <i956> fundnet |than enough lk |of nodes; thisfcmnet |next, kl |fcmindex is |For this |set up in |app, this is |the normal |very much |way, to |more than |sort levels <i957> maxfundnum fcmindqty 50 basisthis ad maxfundnum sz thisfcmnet lk && fcmindex fcmindex lk kl initwarpindex <i958> getcamvu1= ^getcamvu1 |in:tr#,fnwarp tx sh vurobocam1 501 jx doneenough. fnactcherish <i959> 10000 basis |act#: 501 basis ^getcamvu1 setfundlevel fneasyact <i960> |this fund is |activated |by tasks: basis 49 adjustfund <i961> getcamvu2= ^getcamvu2 |in:tr#,fnwarp tx sh vurobocam2 502 jx doneenough. fnactcherish <i962> basis |act#: 502 basis ^getcamvu2 fneasyact <i963> |this fund is |activated |by tasks: basis 49 adjustfund <i964> getcamvu3= ^getcamvu3 |in:tr#,fnwarp tx sh vurobocam3 503 jx doneenough. fnactcherish <i965> basis |act#: 503 basis ^getcamvu3 fneasyact <i966> |this fund is |activated |by tasks: basis 49 adjustfund <i967> applygemth= ^applygemth |in:tr#,fnwarp tx sh gemthreshold 555 jx doneenough. fnactcherish <i968> 10100 basis |we've same |names for fn |act#: |& func here 555 |often, but |it isn't basis |necessary :) ^applygemth setfundlevel fneasyact <i969> |this fund is |activated |by tasks: basis 49 adjustfund <i970> 10500 setfundlevel <i971> patmatpf1= |Does feature |in:tr#,fnwarp |analysis by tx |first pure sh |forms family |and encodes pureforms1 |as 60bit nums lk |to triplet s1 |8, 9 and 10 <i972> 1 jx i1 33 quatropf ad jx 31 ad put4in2places <i973> 5 jx i1 36 quatropf ad jx 34 ad put4in2places <i974> 9 jx i1 39 quatropf ad put4in2places jx 37 jx ad doneenough. <i975> ^patmatpf1 558 fnactcherish <i976> basis |act#: 558 basis ^patmatpf1 fneasyact <i977> |this fund is |activated |by tasks: basis 49 adjustfund <i978> patmatpf2= |Does feature |in:tr#,fnwarp |analysis by tx |second pure sh |forms family |and encodes pureforms2 |as 60bit nums lk |to triplet s1 |8, 9 and 10 <i979> 1 jx i1 33 quatropf ad jx 31 ad put4in2places <i980> 5 jx i1 36 quatropf ad jx 34 ad put4in2places <i981> 9 jx i1 39 quatropf ad put4in2places jx 37 jx ad doneenough. <i982> ^patmatpf2 559 fnactcherish <i983> basis |act#: 559 basis ^patmatpf2 fneasyact <i984> |this fund is |activated |by tasks: basis 49 adjustfund <i985> patmatpf3= |Does feature |in:tr#,fnwarp |analysis by tx |third pure sh |forms family |and encodes pureforms3 |as 60bit nums lk |to triplet s1 |8, 9 and 10 <i986> 1 jx i1 33 quatropf ad jx 31 ad put4in2places <i987> 5 jx i1 36 quatropf ad jx 34 ad put4in2places <i988> 9 jx i1 39 quatropf ad put4in2places jx 37 jx ad doneenough. <i989> ^patmatpf3 560 fnactcherish <i990> basis |act#: 560 basis ^patmatpf3 fneasyact <i991> |this fund is |activated |by tasks: basis 49 adjustfund <i992> cybernettx1= nous ^. *txtcomplete longtxt* cliptrail First book sca n roboapp is p erforming. <sp cybernettx1 ace> for conti kl <i993> cybernettx2= sc> ^. *txtcomplete longtxt* cliptrail action, or to pause; <enter> to go on betw cybernettx2 een pauses; <e kl <i994> cybernettx3= ^. *txtcomplete longtxt* cliptrail {possibly seve ral times} to exit the roboa cybernettx3 pp. kl <i995> cyberinfoprt= ce |Action: prtsuspend |some general prtclr |info, |do a 'prt- |called by |release'after |cybnernetes 22 prtlinenum kl <i996> cybernettx1 cybernettx3 lk lk prt prt. cybernettx2 lk prt <i997> cyberinfobig= |Action: |some large |font words |called by |cybnernetes <i998> ^roboapp: 550 100 255 0 bigshow <i999> ^first ^book 550 550 180 260 255 255 0 0 hugeshow hugeshow <i1000> ^scan 100 550 |This makes 340 |very sure 255 |screen is 0 |refresh when |next syscalls |w/pausefactor hugeshow activepause. <i1001> appdoneinfo= |Action: |a subroutine ^completed! |for main fn, 50 |cybernetes, 690 |tell that it 0 |is done 255 hugeshow. <i1002> sayactiontx1= ^. longtxt* cliptrail Present action is # *txtcomplete sayactiontx1 kl <i1003> sayactiontx2= *txtcomplete ^. longtxt* cliptrail Robot is in it s 'pause betwe en actions' mo sayactiontx2 de now kl <i1004> sayactiontx3= *txtcomplete ^. longtxt* cliptrail Robot is in it s 'continous a ction mode' no sayactiontx3 w kl <i1005> sayactionmode= s2 |in:actionnum, s1 | modeflag |action: a |subroutine |of cybernetes |that tells |action & mode <i1006> sayactiontx1 lk prtcont i1 prtnum <i1007> prtrelease sh sayactiontx3 lk sayactiontx2 i2 se w prt. <i1008> cyberntx1= ^. longtxt* cliptrail robot activity *txtcomplete cyberntx1 kl <i1009> cyberinittx1= dures! ^. *txtcomplete longtxt* cliptrail In a brief mom ent, the motor s will go thro cyberinittx1 ugh init proce kl <i1010> cyberinittx2= ots! ^. *txtcomplete longtxt* cliptrail During any ini t, please keep absolutely cl cyberinittx2 ear of the rob kl <i1011> cyberinittx3= inits! ^. *txtcomplete longtxt* cliptrail Protect childr en--indeed any thing sensitiv cyberinittx3 e--during robo kl <i1012> cyberinittx4= ment ^. *txtcomplete longtxt* cliptrail Each roboapp c omes with inst ructions for c cyberinittx4 orrect environ kl <i1013> cyberinittx5= at, in ^. *txtcomplete longtxt* cliptrail for use of it: follow it! An d then you are cyberinittx5 also aware th kl <i1014> cyberinittx6= pens. ^. *txtcomplete longtxt* cliptrail starting the r obot, you take responsibilit cyberinittx6 y for what hap kl <i1015> cyberreset= |so that after |action: |a call on |this sets the |this {eg just |cybernetes |before fcm is |main foundry |called again} |to something |startup |remsembling |should occur; |startup state |uses 'fnamw' <i1016> &cybernetes& jx fnamw n? |This is the |name of the se |steering fn tx ex <i1017> fnloopcont 1 49 jx dancethis kw <i1018> 0 0 10 12 jx jx kw kw <i1019> 1 0 48 37 jx jx kw kw. <i1020> cyberinit= ce |action: prtclr |does rrr and prtsuspend |deeprrr, cyberinittx1 |clears screen lk |first and |tells what |it is doing! prt <i1021> cyberinittx2 cyberinittx4 lk lk prt prt cyberinittx3 cyberinittx5 lk lk prt prt <i1022> cyberinittx6 lk &welcome!& 50 250 255 0 prtrelease prt hugeshow <i1023> &stand by for& 50 450 255 0 hugeshow <i1024> &robot init!& 1000 50 activepause 650 255 0 rrr hugeshow deeprrr. <i1025> themodeofkey= |With mode |in:mode |dance, ki |gives:keynum |is called in |action: With |every case |mode basis, |{ie, mode |keynum is 0 |basis is |or, given ck, |'continous |the ki result |mode'} <i1026> s3 se 0 ex i3 n? ck n? sh an ki. <i1027> cybernetes= |at start up, |in:tr#,fnwarp |mainvalue & |This is the |1st val of |act for the |triplet#10 |ruling fund |are expected |at level60000 |to be basis & |in this app; |activeflag |reset info: |dance <i1028> sx |Also, 1st val |of triplet#10 |{pos 37} is, |at startup, |assumed to be |basis sh <i1029> ix 10 wk n? se cyberinit <i1030> ix i5 1 subactstate eq se s5 ex <i1031> ix ix 10 37 wk wk |activity |mode:basis is |number is |continous, |in i3: |dance means |use of enter s3 t8 <i1032> cyberinfoprt cyberinfobig j8 i3 themodeofkey j8 sayactionmode t5 <i1033> j5 j8 |key{space}: n? 32 eq n? ix settenthtri d5 ex <i1034> j5 fnloopcont |key{esc}: basisthis 27 eq n? d3 ex <i1035> 10000000 d6 i5 eq thousand 1000000 s5 i5 ix eq incmainval or ix n? extrabasis <i1036> ix appdoneinfo isitcompleted fnloopcont n? basisthis |note that in |this form,the |fn accepts |million state d4 ex <i1037> 1000 i5 i5 exitmsgissue eq d3 ex <i1038> 10 ix wk ix carryout <i1039> cyberntx1 100 lk 35 685 255 0 bigshow activepause. <i1040> ^cybernetes |So this is 800 |the main |This means |function in |'steering', |the steering |a root in |fund we next |"cybernetics" |set up at |robot control |level #60000 fnactcherish |is act#800 <i1041> 60000 basis |act#: 800 basis ^cybernetes setfundlevel fneasyact <i1042> |Cybernetes |It has links |foundry has, |added in task |of course, |level, using |high |counter: |priority: 1 0 48 47 adjustfund adjustfund <i1043> |prelim: note, |of a range of |important:ALL |suitable task |tasks that |snippets, and |are outlined |refined as |next will be |the book scan |re-organised |roboapp is |AFTER |gradually |entrainments |completed! :) <i1044> 70000 setfundlevel <i1045> tk1= |task #1, or |in:tr#,fnwarp |t1; note that sx |minlen of sh |name of both |funcs and 3 |foundries are jumpnum |3, so we say kl |tk1 <i1046> ix i5 1 subactstate eq se s5 ex <i1047> 10000000 d6 i5 eq thousand 1000000 s5 i5 ix eq incmainval or ix n? extrabasis <i1048> ix |Note that 10 |both wk |subactstate & |i9:activity |card before |number |this may have |modified this |mainval; it's s9 |now updated <i1049> ix i9 isitcompleted ix se ex carryout. <i1050> ^tk1 351 fnactcherish <i1051> basis |act#: 351 basis ^tk1 fneasyact <i1052> |this fund is basis |activated 47 |by cybernetes adjustfund |prelim:insert |fn w/snippet: basis |t1a,roboarm 49 |to assumed adjustfund |pos of rubber <i1053> ^getcamvu1 ^applygemth connectfund connectfund ^patmatpf1 connectfund ^patmatpf2 connectfund <i1054> ^patmatpf3 |subtask for connectfund |tk1; it, in |turn, calls |the next |on proper |foundry, t1b, |subtask, |lists itself |selectively |up as the ^cybernetes |completing addnexus <i1055> 80000 |At this |level, it |starts |getting |nearer the |60bit nums |to steer the setfundlevel |roboactions <i1056> t1b= |task #1b;this |in:tr#,fnwarp |is the sx |completing |prelim:this |subtask of t1 |func hasn't |and this one |been checked |performs |yet |selectively sh |from pmatnums <i1057> |Linknums: |Fundwarp: 1 ix 2 |Compare!!! 3 pfnumdeltas |pfnums triad: t3 t1pf t2 lk t1 <i1058> !70 an 65 j1 iswithin !25 j2 j3 !80 gt 60 iswithin an <i1059> n? d6 four ix carryout ix doneenough ex <i1060> 65 j1 ge 60 j2 ge an <i1061> d6 five ix carryout ix doneenough ex <i1062> |ie, it will six |always try to ix |pick it up; carryout |a check on |whether the |roboarm has |got it is for ix |a next fn doneenough. <i1063> ^t1b 151 fnactcherish <i1064> basis |act#: 151 basis ^t1b fneasyact <i1065> |this fund is basis |activated 47 |by tk1 adjustfund |prelim:hook |it up to tk1 basis 49 adjustfund <i1066> ^patmatpf1 |These first connectfund |are used for |input only; ^patmatpf2 |this isn't connectfund |your normal |sequential ^patmatpf3 |fund :-) connectfund <i1067> |prelim:make |t1b1,2,3 & |hook them up |to this one <i1068> 81001 basis &output1& setfundlevel fneasy <i1069> 81002 basis &output2& setfundlevel fneasy <i1070> 81003 basis &output3& setfundlevel fneasy <i1071> fbsinfo= pp |action: info ^roboapp:first |re first pp |book scan ^book scan; ce pp ^fbsinfo: ^to start, pp pp ^g15 pmn fcm <i1072> ^place book & ^Note: be sure pp pp ^type fcm ^to init robot pp pp ^Std options: ^first, eg by pp pp ^type orinfo ^deeprrr,ok?:) pp pp <i1073> ^To check eg ^after use of pp pp ^imbrightness ^eg vurobocam1 pp pp ^& imcontrast, ^View pattern pp pp ^type vumatr ^match scores: pp pp <i1074> ^vupmat {after ^Good luck!!! pp pp. ^eg vumatr} pp ^For pmat work pp ^try: rectune pp <i1075> &fbsinfo& zz ======================================================= HOW TO MAKE YOUR OWN ADJUSTMENTS AND ENTRAINMENTS TO IT ======================================================= FIRST, SOME GENERAL HINTS FOR THE G15 PMN ROBOPROGRAMMER A couple of general hints, that ought to have been part of the OpenRobotics core page--but here it comes: * Be very sure to add stuff to 'deeprrr.sh' to get it to initialize all the channels you are having servos or motors somehow connected to. Or change it altogether; a new and expanded deeprrr is part of this app. * Any servo left in one of its more extreme positions is likely to require manual moving back, when it is turned off, to a more middle position, before it is any point running deeprrr on it to get it responsive again. * To further properly initialise all servo and motor controllers, let the first movements that the robot is doing, after its 'deeprrr' or the like, involve small motions with the whole range of the servos and motors. This is faintly similar to how an athlete might warm up before a performance. * Finally, controller cards may have overlapping channel noises. Don't fill up all the channels of the SSC32U card in its present incarnation and expect all to work smoothly. Of its ca 30 channels, use only a portion, and experiment with which one of them are best in any setup. The selection we have done for this app is mentioned several places--but there may be other selections due to variations in how you provide power supplies etc {cfr a note in the core open robotics page as to how to supply power from separate sources to servos, so as not to drive too much power through the card--use common ground.} ADJUSTMENTS AND ENTRAINMENTS: FIRST, THE PHYSICAL PART INITIAL NOTE: With luck, if you study the photographs hard, and replicate the setup as closely as possible, you could just start the app and it will work--just put in place the updated version of 'deeprrr.sh', which resets all servos, that fits the exact channels we use in this app (listed just after next paragraph): but do read ALL security precautions first, and use only inexpensive nonrare books with this app until you know it really well and are willing to take the responsibility that the arm brushes too hard over a brittle page or something like that. Usually, at least some adjustments, possibly many, have to be done. This is a roboapp also made so as to be a framework for future developments; no doubt in the we will have book scan roboapps that are somewhat easier as for the setup. In order to adjust the physical environment or the program variables or more such, the following bunch of paragraphs should have all the information that is needed and probably a lot, lot more than what is necessary--the idea is that you pick freely what you think is necessary to pick out, to get the roboapp to do its work. In case you find the language difficult, the suggestion is that you make some experiments, first with the OpenRobotics core, then with the RECTUNE element, which teaches you the concepts by experimentation, where you see the robot move by the clicks on the keyboard and fetch, by other clicks, camviews and also see how they are analyzed into what we call 'pure forms pattern matching numbers', of which there are, in this app--and for many others--three families. Get into the vocabulary. There are no references to outside sources, there are no needless equations, no statistical packages, no hidden routines to deal with networks in some mysterious way: it's all about whole numbers and algorithms and their warps {ie, the direct address pointers} to each other. G15 PMN roboapps involve a very learnable approach, very interactive, true to its first-hand orientation. The Open Robotics core page introduces a 'deeprrr.sh', that you can copy and paste into an editor and save in the Linux folder from which you run this roboapp (be sure to rename the original deeprrr.sh first, just in case you want to be sure what's what in the folder: this new deeprrr.sh is of course included in the 'fast-start' extra .zip that this roboapp provides). So, here's the deeprrr with some simple, repetitive stuff added to initialize channel #18 and #29 servos together in a proper way (even so, it may sometimes have to be run twice before the equipment is properly reset, and then only when the starting-point for the servos is that they are in a moderate position rather than in extreme positions). NOTE: there are subtle differences in just what commands are best to 'tame' this or that or the other type of servo. This is an art more than a technique. To set up the deeprrr.sh in a way that fits your particular set of servos can be a matter of checking out what works. Usually, when you have found the right way of starting them up, then keeping them working is very much more easy. # TUNED TO WARM UP SERVOS FOR FIRST BOOK SCAN # WHEN NECESSARY TUNE FURTHER TO YOUR OWN SET OF SERVOS # EXPANDS ON THE OPENROBOTICS CORE DEEPRRR FOR SSC32U # start it by ./deeprrr.sh # Depending on how deep reset the electronics and hardware # requires, it may be of value to run it a couple of times echo "#29 P1250 T750" > /dev/ttyUSB0 sleep 0.8 echo "#29 P1650 T750" > /dev/ttyUSB0 sleep 0.8 echo "#29 P1250 T750" > /dev/ttyUSB0 sleep 0.8 echo "#0 P1500 #1 P1800 #2 P1500 #3 P1500" > /dev/ttyUSB0 echo "#4 P1500 #5 P1500 #6 P1500 #7 P1500" > /dev/ttyUSB0 echo "#8 P1500 #9 P1500 #10 P1500" > /dev/ttyUSB0 echo "#11 P1500 #12 P1500 #13 P1500 #14 P1500" > /dev/ttyUSB0 echo "#15 P1500 #16 P1500 #17 P1500 #18 P1500" > /dev/ttyUSB0 echo "#19 P1500 #20 P1500 #21 P1500" > /dev/ttyUSB0 echo "#22 P1500 #23 P1500 #24 P1500 #25 P1500" > /dev/ttyUSB0 echo "#26 P1500 #27 P1500 #28 P1500" > /dev/ttyUSB0 echo "#30 P1500 #31 P1500" > /dev/ttyUSB0 echo "#18 P1500 T500" > /dev/ttyUSB0 sleep 1.1 echo "#18 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500" > /dev/ttyUSB0 echo "#0 P1500" > /dev/ttyUSB0 echo "#0 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#1 P1800" > /dev/ttyUSB0 echo "#1 P1800" > /dev/ttyUSB0 echo "#1 P1700 T250" > /dev/ttyUSB0 sleep 0.3 echo "#2 P1500" > /dev/ttyUSB0 echo "#2 P1500" > /dev/ttyUSB0 echo "#2 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#3 P1500" > /dev/ttyUSB0 echo "#3 P1500" > /dev/ttyUSB0 echo "#3 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#4 P1500" > /dev/ttyUSB0 echo "#4 P1500" > /dev/ttyUSB0 echo "#4 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#5 P1500" > /dev/ttyUSB0 echo "#5 P1500" > /dev/ttyUSB0 echo "#5 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#6 P1500" > /dev/ttyUSB0 echo "#6 P1500" > /dev/ttyUSB0 echo "#6 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#7 P1500" > /dev/ttyUSB0 echo "#7 P1500" > /dev/ttyUSB0 echo "#7 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#8 P1500" > /dev/ttyUSB0 echo "#8 P1500" > /dev/ttyUSB0 echo "#8 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#9 P1500" > /dev/ttyUSB0 echo "#9 P1500" > /dev/ttyUSB0 echo "#9 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#10 P1700" > /dev/ttyUSB0 echo "#10 P1700" > /dev/ttyUSB0 echo "#10 P1700 T250" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500 #1 P1700 #2 P1500 #3 P1500" > /dev/ttyUSB0 echo "#4 P1500 #5 P1500 #6 P1500 #7 P1500" > /dev/ttyUSB0 echo "#8 P1500 #9 P1500 #10 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500 #1 P1700 #2 P1500 #3 P1500" > /dev/ttyUSB0 echo "#4 P1500 #5 P1500 #6 P1500 #7 P1500" > /dev/ttyUSB0 echo "#8 P1500 #9 P1500 #10 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500" > /dev/ttyUSB0 echo "#0 P1500" > /dev/ttyUSB0 echo "#0 P1500 T500" > /dev/ttyUSB0 sleep 0.5 echo "#1 P1700" > /dev/ttyUSB0 echo "#1 P1700" > /dev/ttyUSB0 echo "#1 P1700 T250" > /dev/ttyUSB0 sleep 0.3 echo "#2 P1500" > /dev/ttyUSB0 echo "#2 P1500" > /dev/ttyUSB0 echo "#2 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#3 P1500" > /dev/ttyUSB0 echo "#3 P1500" > /dev/ttyUSB0 echo "#3 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#4 P1500" > /dev/ttyUSB0 echo "#4 P1500" > /dev/ttyUSB0 echo "#4 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#5 P1500" > /dev/ttyUSB0 echo "#5 P1500" > /dev/ttyUSB0 echo "#5 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#6 P1500" > /dev/ttyUSB0 echo "#6 P1500" > /dev/ttyUSB0 echo "#6 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#7 P1500" > /dev/ttyUSB0 echo "#7 P1500" > /dev/ttyUSB0 echo "#7 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#8 P1500" > /dev/ttyUSB0 echo "#8 P1500" > /dev/ttyUSB0 echo "#8 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#9 P1500" > /dev/ttyUSB0 echo "#9 P1500" > /dev/ttyUSB0 echo "#9 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#10 P1500" > /dev/ttyUSB0 echo "#10 P1500" > /dev/ttyUSB0 echo "#10 P1500 T250" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500 #1 P1700 #2 P1500 #3 P1500" > /dev/ttyUSB0 echo "#4 P1500 #5 P1500 #6 P1500 #7 P1500" > /dev/ttyUSB0 echo "#8 P1500 #9 P1500 #10 P1500" > /dev/ttyUSB0 sleep 0.3 echo "#0 P1500 #4 P750 #8 P1500 T1000" > /dev/ttyUSB0 sleep 1.1 echo "#1 P1700 #5 P1500 #7 P1500 T1000" > /dev/ttyUSB0 sleep 1.1 echo "#3 P1750 #2 P1700 #9 P1500 #10 P1500 T1000" > /dev/ttyUSB0 sleep 1.1 echo "#18 P1500 T500" > /dev/ttyUSB0 sleep 1.1 echo "#18 P1600 T750" > /dev/ttyUSB0 sleep 1.1 echo "#18 P1450 T750" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1450" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1450" > /dev/ttyUSB0 sleep 0.3 echo "#18 P1450" > /dev/ttyUSB0 sleep 0.3 echo "#29 P1250 T750" > /dev/ttyUSB0 sleep 0.8 echo "#29 P1650 T750" > /dev/ttyUSB0 sleep 0.8 echo "#29 P1250 T750" > /dev/ttyUSB0 sleep 0.8 So the above is just the startup series of repetitive commands to the servo electronics, meant to be put into a Linux text file, the way our core Open Robotics page say; this is called on by this G15 PMN roboapp during startup of the roboapp, to cleanse the channels and connect to the motorics. After that point, the G15 PMN FCM takes over. As for the AL5D arm itself, and how the camera is to be placed, and how you have to mount a cake-serving blade of some sort to a free servo to aid the process-just study the photographs and be sure it is as similar as at all possible when it comes to the distances and angles and such. Make also note of the steel spring alongside the upper roboarm--it can be mounted to be tighter than this, but attached to just these bolts allows it a somewhat greater range of movements (it's part of the AL5d). Place a rubber erasor near the middle of the book--ie, where the book opens, and on the edge of some kind of height that {cfr photo} lifts the book and the erasors some 10 centimeter or such about the base of the AL5D roboarm. There should be about 20cm-25cm from the front of the base of the pillbox of the AL5D roboarm to the beginning of this elevated height. The rubber erasors should be off-white or such, about 2cm x 2cm {cut them to such a size if bigger}, and you should use a pen, ie blue or black, to make a filled square in their middle, about 1/2 cm x 1/2 cm. Make it also on the back-side, but take care that the ink you use don't come off on paper in any way. This is, we might say, a 'standard procedure' with such auxillary equipments that a robot uses, however usually the light can be positioned so that the shadows thrown by the rubber erasors are quite striking and far easier to pick up than such a mark (this depends on settings of brightness, contrast and threshold values). When the rubber erasors lie on the table, the square visible on top of them, they should have a height about 1 cm {ie, not the slimmest of erasors}. After this, you apply light. The rule of thumb is that, as long as too intense light isn't used, inexpensive cameras work better with much light. These cameras, when used to photograph pages of books, must be positioned so that they give the sharpest possible result, and even if they are the same brand and look identical, you may find that they work rather differently and require independent positioning in order to capture the book page. The sources of light must of course be placed so that the roboarm cannot do damage to them within the full possible range of movements of the roboarm. Such precautions are important in all programming of robotics, and also in all use of robotics in which there can be the slighest uncertainty about the resulting movement ranges. Some of the photos show how the lights are placed, so you can replicate that bit, too: it doesn't harm to get the shadowing effects exactly similar, since the way the patmat numbers work in this case is a bit simplistic. CAMERA #1 PLACED ON THE AL5D ROBOARM: Place the camera as similar as you can, not just in terms of where it is located but also in terms of where it points-- compare the photo you fetch by the use of the F12 function key inside the RECTUNE with the photos on this page, and align it both vertically and horisontically as identical as you can; then fasten it with all the tricks in the book so that even if the roboarm gets a powerful shake, the camera won't move a millimeter in any direction. This is important and will make it far easier to get the roboapps to work. In general, then, get the height, lengths etc as similar as you can before starting up the app. Place lights similar, but experiment with placements of the cameras over the book according to what gives most sharp focus--inexpensive small digital cameras vary a lot in initial settings, and we use them in a simplistic way here (and that should be enough). Much light is crucial to make the most out of cheap cameras, to give a broader range of sharp focus, and also to get your setup of the robot to fit the way we did it--with much light on. There is cardboard placed so as to keep the left pages of the book relatively in place when the right pages are photographed. The app is made so that the AL5D roboarm places the bookpages it leaves through underneath this cardboard--it expects it to be there, in other words, and for some books, some extra instrument like this is necessary to keep the book open at the right page. Compare the images that comes from the camera#1 at the roboelbow with the images you get up with camera#1--get it as similar as you can in all senses. This is a physical task--and then it is a question of light in the room--and finally it is a question of setting IMBRIGHTNESS, IMCONTRAST and IMTHRESHOLD. Throughout the whole process, you can use RECTUNE command, which has simple function key interface to get the cam-views, such as through F12 and F11, and in which you can experiment with the settings for the above. {More info about RECTUNE further on in this page.} This is an app also made to teach the programming of G15 PMN FCM to new robotically oriented programmers and as such, the app has adequate complexity to do the task but it doesn't have fancy features like auto-adjustments of brightness of camera and a lot of higher-level routines to accomodate various types of objects. The positive feature of this is that you can pick the program apart and put it together and get a sense of glow from that. However, it means that you must spend a rather acute initial effort on replicating, as exactly as you can, the exact expected environment for the robot before the app will work. And for that reason, this web page has photos and info that tells you how to replicate it as exactly as you can--and then it has info as how to change whatever has to be changed in the program and/or its movement database in order to accomodate those things that couldn't be replicated. Read through all safety precautions and such on the core open robotics page. ADJUSTMENT OF ROBOTIC HARDWARE SETUP IN THIS APP COMPARED TO CORE: As compared to the core open robotics page: we are using channel #18 instead of channel #2 in order to smooth out jerky uncontrolled movements that sometimes came into a particular configuration we had with a multi-socket multi-camera use on a laptop. Be sure when you set up the roboarm that all sensitive and expensive things--with a great deal of attention to lamps and electronics--cannot physically be reached by the roboarm given jerky movements during the process of switching it on {really check the full range of its movements versus where you have anything that mustn't be knocked over by the roboarm}. PUT A CLOTH OVER BOOK AND NEARBY AREA WHEN YOU TUNE THE ROBOARM so that, in case of jerky movements before all works smoothly, nothing will be damaged. {In case of having stronger servos, more strong protection elements than clothes are of course necessary.} To initialize vaguely prototypic robohardware incl electronics may at times be somewhat complicated {it is also, depending on the hardware and the envioronment, in some cases dangerous, and here you must naturally always take full personal responsibility for the entire setup; there are useful recommendations at the main OpenRobotics page.} Be sure you have tried the "deeprrr.sh" command some times, which is meant to be modified to fit the particular robohardware, alongside the internal 'rrr' command--to put the robot to a rest position and re-initialize when needed-- as this is used by this roboapp. An initial form of the deeprrr.sh, which you can paste into a Linux editor and try as command, is given at the OpenRobotics main page. Modify it by experimentation and intuition until it fits your robohardware for each particular G15 application that uses it. Normally, before you switch the roboarm on, a manual shift to a fairly normal position of the roboarm makes sense, followed by the deeprrr command. {This can also be performed by a click on the <F9> function key inside the new function RECTUNE, which is part of the programmer's toolkit inside this G15 roboapp. As programmer, be sure to note that the G15 PMN's array with the present robohardware positions is updated before the application starts, and this is done by the 'rrr' command. Because of the importance of running 'rrr' at least one, it is called, after the deeprrr.sh command, inside the G15 PMN function called DEEPRRR.} To repeat, there is an important change of hardware setup as compared to what the Core Open Robotics page recommends as for initial test setup: ADJUSTMENT OF ROBOTIC HARDWARE SETUP IN THIS APP COMPARED TO CORE: As compared to the core open robotics page: we are using channel #18 instead of channel #2. This concerns the 'roboelbow' servo on the AL5D roboarm. This is also pointed out inside the app. The first 430 cards, about, constitute the core. This part is unchanged. After the core, comments are given as to what is to be considered changed. This also, by the way, includes a comment about how the function 'crparsed' are to be used. NOTE THAT THE DEEPRRR COMMAND INSIDE THE APP HAS A LITTLE MORE TO IT THAN THE DEEPRRR.SH. TEST IT BY CLICKING F9 AFTER YOU HAVE TYPED IN THE COMMAND 'RECTUNE', IF YOU WISH TO ADJUST THE POSITION OF THE ROBOARM ETC. When you have found out the proper way to initialize the AL5D roboarm including its SSC32U electronics--cfr hints in our main OpenRobotics page--each time you turn it on, the next step is probably the initial positionings of the roboarm and the book and the accessories used by the roboarm, in this case two squarish pieces of rubber erasers. This involves getting the heights right, confer the photos for this. ADJUSTMENTS AND ENTRAINMENTS: ADJUSTING CAMERA VARIABLES To adjust the program in its simplest form requires perhaps not all that programming knowledge, but G15 PMN is its own world in a way, and it's good to know your way around it. As said on the G15 PMN FCM Open Robotics main page: to get a on G15 PMN, start with simple apps, including games. To understand more of FCM, look here and there in G15 PMN Third Foundation documentation, see if you can find some simple enough examples using G15 PMN FCM in some form or other somewhere. To get a grip on how FCM can be used in roboapps, be sure to read the text at J:1, which is included with this app and has a general form so it can be included with many future roboapps we should think. It is linked to from one of the first cards at the H-disk, and it is a B9edit document. CAMERAS #1, #2 AND #3 ARE USED HERE: HOW TO ADJUST IT In case you have a PC in which camera numbers have got to be different, say, #2, #3 and #4, you don't have to change anything in the program at all. Simply adjust the three tiny Linux command scripts as explained in the Open Robotics main page, namely incam.sh in2cam.sh in3cam.sh to reflect other camera numbers. The place where you adjust them is where they say 'video1', 'video2', 'video3'. {The 'video0' is usually the inbuilt camera, if there is one; if the PC has two inbuilt cameras, they are, supposedly, #0 and #1, and plugged-in USB cameras would then start at #2.} Note that on occasion, there is some initialization that has to take place, in the background Linux processes, before a camera not having been plugged in before is 'recognised' by Linux, after it has been plugged in. In case, do such obvious things as: to wait a little; or to reboot, with camera plugged in; or to use a highly common and effective camera-displayer program like Cheese; or the like. Once it is recognised it should be little or nothing more to do with the scripts to utilize them by the G15 roboapp. After card i430--but you can set these variables at any time, and even change them during run of program--you find these: IMBRIGHTNESS--which adds or, when signed, substracts to the {always monochrome} tone 0..255 as read from the camera IMCONTRAST--which multiplies {when value bigger than 2^16 or {when value less than 2^16} divides the tone by some whole number factor JUMPNUM--which informs the GEMTOMATR and GEMTHRESHOLD how to go from the GEM-image from the camera to the matrix that in this app is in an either/or form and only 100x100. When JUMPNUM is 5, every fifth pixel from the GEM-image is used and the whole image is represented but with less detail. As JUMPNUM is modified to something like 4, 3 or even 2, the image gets correspondingly more focussed on a portion of that GEM image. You can experiment with settings of this and the other run-time changable variables in the easy-to-use RECTUNE utility. The JUMPNUM is implemented so that it is quickly calculated in and not so that it gives the exact centre of the image; just which portion of the image you'll work out and just when to use JUMPNUM-settings less than 5, and in some cases also as little as 1, depends on how to get the pattern matching numbers to be the most telling of what goes on in front of the camera. A small change that should be in focus becomes a big change of the numbers with a smaller jumpnum--supposing you have oriented the camera just right; when the camera is mounted on a movable part of the robot, this means a programming where tight correlation between the movements and the feature analysis of the camera is required. FCM is open to all sorts of alternatives here. You just have to be consistent--the same law as in all programming. IMTHRESHOLD--which, when applied after the three just mentioned, sets a threshold tone value, which depends on light in room etc {and indeed these variables can be, in more advanced G15 PMN roboapps, auto-adjusted}. This is the third value being used before 'scoring with the pure forms'--an approach used within the present way we have programmed the FCM for this app but which, when intelligently varied, can be used in indefinitely many contexts. It may well be that you don't have to adjust them at all. To find out a bit of how they work, start up the app by ^i1 cc then type vurobocam1 to fetch input from camera #1, which is the one on the elbow--on the right-hand side of the elbow--oriented towards the gripper, so that the gripper is vaguely to the right in the view of it. After this, type vumatr and the result of IMBRIGHTNESS and IMCONTRAST are shown after the GEM image has been transferred to a 100x100 matrix; then press ENTER after the first view, to see the effect of IMTHRESHOLD. {These are not to be used, in this app, connected to book page photographing--there, rather, we retain the full GEM 500x500 resolution with all tones and store the images as they are; an OCR app will then retrieve the text from all the readable parts of these images.} Or, you can use the formidable RECTUNE function--a programmer's tool, which shows this stuff and also allows variations, for experimentation, of the above variables, at the click of some function keys. If you change the IMBRIGHTNESS, IMCONTRAST and/or IMTHRESHOLD, you can either do it at the cards where they are defined {ie, soon after i430}, or you can do it somewhere else, like on some freshly inserted card right before the last one with with 'zz' in it. You can experiment with settings in the Third Foundation terminal, of course, like this: 120000 imcontrast kl !150 imbrightness kl vumatr {Generally, with a higher contrast, the brightness should be suitably reduced to give the images depth; but in case of images which start out very dark, such brightness reduction isn't necessary.} As said: It is usually faster to experiment with all such changes using the RECTUNE command, but it is good to know how to do them at the Third Foundation terminal and in the CAR editor directly, as well. The JUMPNUM, by the way, is usually set to 5 at start-up of the FCM app, so that the whole GEM-image is captured at the matrix. When you start up the RECTUNE, before you start doing fine movements of the robot, press F9 for DEEPRRR. But once you have performed DEEPRRR inside the G15 PMN session--ie, without exiting the program by "QU",-- you don't have to perform it again, as long as the robot behaves nicely. And, yes, RECTUNE can handle up lots {limit set to 18 so command line text length is meaningful} of parallel synchronous movements of the servos and/or motors connected to the SSC32U card. {In case of motors, usually there's something like a "H-Bridge" or the like connecting a DC motor to the Pulse Wave Modulation, or PWM, signal, so you can use the same programming protocol entirely.} To make the robot do motions through more channels simultaneously, just click Backspace inside RECTUNE, select channel and click one of the action keys-- PgUp, for instance--then select another channel and click action key there--and so on, for several more if you like--then click Insert button on the keyboard when done. This combines the channels, and you can click Insert several times to repeat the last action. This can be saved and loaded and re-performed as all other such action sequences through the F8 command. This also points the way for how to do it inside the FCM program, where it isn't enough with prerecorded motion sequences. {Programmer, note that there is a slight update in some of the cards connected to UPDCHANPOS and such to allow parallel channel work with RECARRAY as compared to the G15 PMN OpenRobotics standard core. This is noted inside the source for this app at the relevant points.} You can leave and re-enter RECTUNE as many times as you want without repeating the deep rest command; the array of robot positions is kept in RAM and is maintained as you go back and forth between the Third Foundation programming terminal and the sweet little grand toolbox we call RECTUNE. Though it is a big toolbox it is extremely easy to modify. It simply calls stuff: it doesn't do anything much on its own, apart from keeping a few variables in order. So, for instance, to add more cameras should be easy as making Java say "Hello world!", if not a lot lot more simple. THERE WILL ALWAYS BE SOME FLUCTUATIONS EVEN WHEN THE SAME CAMERA IS FEATURE ANALYZED SEVERAL TIMES WITHIN A MINUTE WHILE KEEPING IT IN RELATIVE CALM-- FOR WITHIN THE FOUR-DIGIT RANGE OF PATTERN MATCHING NUMBERS EVEN TINY VIBRATIONS OF THE EQUIPMENT CAN PLAY A ROLE. ALL THE MORE IMPORTANT, THEN, WHEN PROGRAMMING DIRECTLY USING THESE NUMBERS IN AN APP, TO PICK THE RIGHT NUMBERS TO WORK WITH IN EACH CASE, AND FIND A BROAD ENOUGH RANGE OF VARIATION. AN ALTERNATIVE APPROACH, THAT WE ALSO ADVICE IN OTHER G15 PMN FCM ROBOAPPS, IS TO USE SEVERAL LEVELS OF ANALYSIS OF WHOLE BUNDLES OF THESE NUMBERS EG VIA PATTERN MATCHING DATABASES AND ENTRAINMENTS OF THESE. Note that, to preserve the ambiguity of the dash (-), which has other important meanings beyond the meaning often used in connection to numbers, namely to sign numbers, and also in order to enhance the clarity of what is said--the striking shape of the exlamation mark, !, is, in most G15 programming contexts, used instead of the dash to sign numbers. However, many applications call on routines (like INTONUM) that uses the dash as sign for numbers. So when you run the little program RECTUNE, for instance, it expects a dash as sign; but when you reprogram a variable inside the CAR editor, there--as programmer--you use an exlamation mark. In that way, the program becomes sharply clear, and the radical difference between a signed and an unsigned number stands forth--which again helps programming coherence of mind. Here is approximately what it should look like so that you have to do the minimum further adjustments to the matching database: [[[Some photos with vumatr output to come here]]] When you have come to this point, in other words, when you have done what you can in terms of general adjustments of the whole arrangement to make this app work, then the chief remaining adjustments are of two kind--adjustments to entrained robotic movements to handle differences in sizes and angles of robotic equipment and book an dusch; and adjustments of entrained pattern matchings to handle differences in how the camera is picking up info about what is going on. Camera#1 is used intensely in order to position the roboarm correctly, in order to handle the whole book. It may be that it isn't enough with adjusting contrast and brightness and such, because the types of photos that come along to the PC are too different from the ones entrained with this app as standard. If so, we have the tools built into this app to redo these entrainments. Let us bear in mind that the more advanced a robotic app is, the more it can handle variations. In order to keep this app fitting with the idea of launching the programming of a series of G15 PMN FCM robotic apps, we haven't paid much attention to automatic handling of variations. But let's also bear in mind that even when variations are being handled, it is only up to a point this can be done--we will therefore benefit from knowing how variations can be handled by means of additional entrainment or programming actions. Ultimately, when there are too many variations in the environment--involving human beings themselves responding to these changes and changing the environment creatively in a kind of creative living 'loop'--we are clearly at a point where the goedelian reflections {cfr the main OpenRobotics footnote about Goedel and 'no general intelligence algorithm') are getting more and more significant. ADJUSTMENTS AND ENTRAINMENTS: RE-ENTRAINING PAT-MATCHING First a comment which is probably only relevant when you start out programming new robotic apps with G15 PMN FCM on your own, because it is rather involved--but it may pay off to briefly browse through this comment as well, even though you are looking for simpler ways of configuring this finished app: As a programmer's tool, which is useful perhaps more when you make new G15 PMN FCM robotic apps entirely, but building on the particular (rather simple) approach to camera pattern matching as found in this app, you have, among other things, the 'vupmat' function--that is, "view the pattern matching (scores)". This is performed eg after you do such as 'vurobocam1' (which shows the GEM image from camera 1) followed by 'vumatr' (which calls the 'gemthreshold', simplifying the input to 100x100 a matrix of either/or pixels). This shows the 'pmatscore', or "pattern matching score numbers", relative to each of the standard forms in this app, of which there are twelve times 3, kept in 'pureforms1', 'pureforms2' and 'pureforms3'. The matching against these 'pure forms' is strongly affected not only by JUMPNUM {which sets the magnification, we might say, in going from the 500x500 pixel GEM image to the 100x100 matrix} but also by IMBRIGHTNESS, IMCONTRAST, and finally IMTHRESHOLD. Advanced FCM apps do runtime changes of these all the time. Also, the matching is affected by the settings for where to start, in terms of x coordinate and in terms of y coordinate, the fetching of the 95x95 image (so that noisy edges are cropped away from camera input): 'pmatystart', 'pmatxstart'. When you use 'vupmat', you first get up the image at present to be processed (do 'gemthreshold' again, if you run vupmat several times after one another), then, as you press ENTER, you find, at bottom of the screen, a number between 0 and (as a theoretical maximum only) 9025 which is the 'score' relative to the 'pure form' (calculated by 'pmatscore'). PMATSCORE looks only at the bright pixels (ie, the pixels not set to nil or zero or basis or how we phrase it), and checks whether the pixels in the camera input are bright just there. That means that the PUREFORMs also act to 'screen out' a variety of pixels as, in praxis, irrelevant, in order to put sharp focus on just some portions of the camera input--according to its forms. This also means that when one uses PMATSCORE, the value of the score number should be considered relative to how high it can be FOR EACH PURE FORM rather than how high it is for other pure forms. {In contrast, there is a function there, called PMATSCORETOT, which does a similar job but looks at every pixel all the time and where the theoretical maximum of 9025 is more often reached and the numbers are more comparable; however, this isn't generally as easy to work with when it comes to picking out relevant parts of the camera input and checking these for some forms; but there are contexts in which this alternative form of the scoring is practical and relevant.} All these twelve times three 'pattern matching numbers' are given at the click of the F12 function key when you use the expanded form of RECACT, called RECTUNE. It also shows the difference, for each of these numbers, with the previously found numbers {eg, last time you clicked F12 inside RECTUNE}. RECTUNE is a way to expand RECACT, and is similar, but with more functions; also, it doesn't auto-delete RECACTARRAY at start-up {rather, one clicks a function key whenever one wants it reset}. Both are short functions which can be rewritten to suit other robohardware, including the use of other channels, quite easily. These functions have the type of relaxed interface, which is fitting for the interesting category of functions that is called 'tools for programmers'-- in other words, they are there in order to assist the programmert to make the top-level G15 PMN application more than be any explicit part of it. As a programmer, to set up FCM to do good pattern matching, the clue is to look at which of the forms give the most significant results in terms of scores: which forms tell, most clearly, the difference, say, between the robogripper gripping something and the robogripper being empty-handed? Good FCM programmers look for meaningful pure forms and meaningful score ranges and the handy tool in this app, and which presumably is there in a lot of FCM roboapps {in the G15 PMN context}, is RECTUNE. The pureforms1, 2 and 3 are three arrays with three families of forms--curves, triangles and rectangles. The looping, by means of ENTER {or quit it by ESC}, through all these, when you run 'vupmat', is so that first the first of each of the three families are shown, then the second, and so on. This function can also be called from RECTUNE and it is of great value to actually go through these images and not just look at the number outputs. This is part of the concept of first-hand relationship to all the data in the computational process {that is again part of the first-hand programming approach, a term we coined with Firth, which we finished and published in 2006, and still available}. Now for somewhat more concrete advises as for entraining pattern matching for this app. [[[More comments to come here.]]] ADJUSTMENTS AND ENTRAINMENTS: RE-ENTRAINING MOVEMENTS [[[More comments to come here.]]] ======================================================= To main page: openrobotics =======================================================