1 00:00:06,320 --> 00:00:11,499 [Music] 2 00:00:16,720 --> 00:00:21,840 so welcome back it's time for our first 3 00:00:18,880 --> 00:00:23,920 uh invited presentation by brett downing 4 00:00:21,840 --> 00:00:25,519 uh he'll be talking about microarrays 5 00:00:23,920 --> 00:00:27,760 and advanced robotics i'm really looking 6 00:00:25,519 --> 00:00:29,039 forward to this talk um brett's a a 7 00:00:27,760 --> 00:00:30,880 really really interesting fellow very 8 00:00:29,039 --> 00:00:32,800 talented i met him first been about 10 9 00:00:30,880 --> 00:00:35,520 years ago at the uh just prior to lca 10 00:00:32,800 --> 00:00:37,440 2012 with his sister jenna and daniel um 11 00:00:35,520 --> 00:00:40,079 they come over from perth and these 12 00:00:37,440 --> 00:00:41,760 mysterious strangers help us 13 00:00:40,079 --> 00:00:44,320 set up tidy up and they're going who are 14 00:00:41,760 --> 00:00:46,480 these people and uh yeah and since then 15 00:00:44,320 --> 00:00:48,559 if you um if you ever need a sonic 16 00:00:46,480 --> 00:00:50,000 screwdriver brett will have one on him 17 00:00:48,559 --> 00:00:51,920 so uh 18 00:00:50,000 --> 00:00:54,160 i think these days he carries around the 19 00:00:51,920 --> 00:00:56,840 pine saw soldering uh iron so yeah 20 00:00:54,160 --> 00:00:59,280 without any more to do over to you brett 21 00:00:56,840 --> 00:01:02,320 um take it away and also i believe brett 22 00:00:59,280 --> 00:01:04,000 will will take some questions so um yeah 23 00:01:02,320 --> 00:01:05,280 i'll line them up on the message system 24 00:01:04,000 --> 00:01:07,840 please 25 00:01:05,280 --> 00:01:09,920 i would do thanks fred great um 26 00:01:07,840 --> 00:01:11,280 i'd like to begin today by acknowledging 27 00:01:09,920 --> 00:01:12,799 the traditional owners of the lines we 28 00:01:11,280 --> 00:01:15,759 meet on today and i'd like to pay my 29 00:01:12,799 --> 00:01:17,280 respects to elders past and present 30 00:01:15,759 --> 00:01:19,280 i've come here today to talk about 31 00:01:17,280 --> 00:01:21,840 advanced robotics on microcontrollers 32 00:01:19,280 --> 00:01:24,799 particularly 33 00:01:21,840 --> 00:01:27,840 a bit of background roz the robot 34 00:01:24,799 --> 00:01:27,840 operating system is a 35 00:01:28,479 --> 00:01:32,240 software framework that provides publish 36 00:01:30,240 --> 00:01:33,200 and subscribe messaging and packaging 37 00:01:32,240 --> 00:01:35,439 tools 38 00:01:33,200 --> 00:01:37,920 it was started in about 2007 as a 39 00:01:35,439 --> 00:01:40,159 response to prolific abandonware in 40 00:01:37,920 --> 00:01:42,640 academic robotics departments every new 41 00:01:40,159 --> 00:01:44,479 student would build a new robot with new 42 00:01:42,640 --> 00:01:45,920 ways of talking to new components and 43 00:01:44,479 --> 00:01:46,880 the rest would get scrapped year after 44 00:01:45,920 --> 00:01:47,840 year 45 00:01:46,880 --> 00:01:49,600 and 46 00:01:47,840 --> 00:01:52,840 you were lucky if you ever got a whole 47 00:01:49,600 --> 00:01:55,600 robot even a simple one even for a 48 00:01:52,840 --> 00:01:57,360 moment roz offered messaging and 49 00:01:55,600 --> 00:01:59,280 software packaging conventions that were 50 00:01:57,360 --> 00:02:01,759 extremely strict and 51 00:01:59,280 --> 00:02:03,920 prescriptive but fairly versatile 52 00:02:01,759 --> 00:02:05,759 the defining feature of roz 53 00:02:03,920 --> 00:02:07,680 was that it encouraged modularity 54 00:02:05,759 --> 00:02:09,679 consideration for system integrators and 55 00:02:07,680 --> 00:02:10,959 it allowed researchers to share basic 56 00:02:09,679 --> 00:02:13,200 functionality 57 00:02:10,959 --> 00:02:16,160 and package their research for others to 58 00:02:13,200 --> 00:02:16,160 fork and cite 59 00:02:18,400 --> 00:02:21,840 roz is based on a data flow 60 00:02:20,640 --> 00:02:24,400 framework 61 00:02:21,840 --> 00:02:26,319 most nodes don't have flow control like 62 00:02:24,400 --> 00:02:29,200 if or switch case 63 00:02:26,319 --> 00:02:29,200 nodes just receive 64 00:02:29,599 --> 00:02:33,200 receive messages and emit messages so in 65 00:02:32,080 --> 00:02:35,519 a simple 66 00:02:33,200 --> 00:02:37,920 remote control example you might have 67 00:02:35,519 --> 00:02:39,440 a joystick node which deals with the 68 00:02:37,920 --> 00:02:42,480 hardware of a joystick 69 00:02:39,440 --> 00:02:42,480 it might emit a message 70 00:02:43,760 --> 00:02:46,640 with a strong typing that describes a 71 00:02:45,440 --> 00:02:48,160 joystick 72 00:02:46,640 --> 00:02:49,599 state 73 00:02:48,160 --> 00:02:51,680 that might get interpreted by a 74 00:02:49,599 --> 00:02:53,599 teleoperation node which handles a loss 75 00:02:51,680 --> 00:02:57,040 of input 76 00:02:53,599 --> 00:02:57,040 and converts it into like a 77 00:02:57,760 --> 00:03:02,239 a motion vector in a coordinate space 78 00:03:00,879 --> 00:03:04,239 this doesn't care about 79 00:03:02,239 --> 00:03:06,640 the shape of the robot but it handles 80 00:03:04,239 --> 00:03:09,599 you know dead man switches and stuff 81 00:03:06,640 --> 00:03:10,480 another motion might subscribe to 82 00:03:09,599 --> 00:03:12,560 the 83 00:03:10,480 --> 00:03:14,560 the motion vector 84 00:03:12,560 --> 00:03:16,560 and describe how the robot should move 85 00:03:14,560 --> 00:03:18,400 but it's another it's yet another node 86 00:03:16,560 --> 00:03:20,159 that's responsible for actually 87 00:03:18,400 --> 00:03:22,560 figuring out how the the joints should 88 00:03:20,159 --> 00:03:22,560 all behave 89 00:03:27,760 --> 00:03:31,760 this separation of intent is what makes 90 00:03:29,599 --> 00:03:33,280 roz so appealing every robot that moves 91 00:03:31,760 --> 00:03:35,599 can be driven by 92 00:03:33,280 --> 00:03:37,840 every met every motion planner 93 00:03:35,599 --> 00:03:39,599 every remote control if you can prove 94 00:03:37,840 --> 00:03:41,200 your path planner on a milk crate with 95 00:03:39,599 --> 00:03:42,159 drill motors zip tied to the bottom you 96 00:03:41,200 --> 00:03:44,080 can expect it to work on a 97 00:03:42,159 --> 00:03:46,080 state-of-the-art humanoid machine 98 00:03:44,080 --> 00:03:47,840 likewise if some research lab has proven 99 00:03:46,080 --> 00:03:50,720 a computer vision mapping 100 00:03:47,840 --> 00:03:52,400 uh mapping and planning suite 101 00:03:50,720 --> 00:03:54,000 you can reasonably expect it to command 102 00:03:52,400 --> 00:03:55,680 a hacked vacuum cleaner maybe you'll 103 00:03:54,000 --> 00:03:57,599 need to provide some image processing 104 00:03:55,680 --> 00:04:00,080 power image processing power on a second 105 00:03:57,599 --> 00:04:01,439 machine 106 00:04:00,080 --> 00:04:03,599 these aren't hyperbolic statements 107 00:04:01,439 --> 00:04:05,120 either the messaging convention is so 108 00:04:03,599 --> 00:04:06,879 strict and the packaging is so 109 00:04:05,120 --> 00:04:09,280 prescriptive that it's actually very 110 00:04:06,879 --> 00:04:11,840 difficult to leak information 111 00:04:09,280 --> 00:04:14,879 around the abstractions roz provides 112 00:04:11,840 --> 00:04:19,280 more often than not i found that raw's 113 00:04:14,879 --> 00:04:19,280 rose packages fresh off github just work 114 00:04:24,479 --> 00:04:26,880 when you want to deal with the real 115 00:04:25,600 --> 00:04:30,000 world you first need to collect some 116 00:04:26,880 --> 00:04:33,280 data think about what that means to you 117 00:04:30,000 --> 00:04:33,280 and then do something about it 118 00:04:33,919 --> 00:04:37,280 sense and act 119 00:04:35,840 --> 00:04:38,800 happen need to happen in particular 120 00:04:37,280 --> 00:04:41,199 places and in particular ways this is 121 00:04:38,800 --> 00:04:42,639 where software meets hardware 122 00:04:41,199 --> 00:04:44,639 hardware is hard and it throws up all 123 00:04:42,639 --> 00:04:45,840 sorts of constraints for a practical 124 00:04:44,639 --> 00:04:47,600 application you might need high 125 00:04:45,840 --> 00:04:49,759 resolution timers you might need to deal 126 00:04:47,600 --> 00:04:51,360 with esoteric industrial protocols you 127 00:04:49,759 --> 00:04:53,120 might have low power requirements or 128 00:04:51,360 --> 00:04:54,800 heat tolerance issues 129 00:04:53,120 --> 00:04:57,520 these are things you just can't get on a 130 00:04:54,800 --> 00:04:59,199 regular computer 131 00:04:57,520 --> 00:05:01,199 the thinking part is pretty flexible 132 00:04:59,199 --> 00:05:03,039 though it only requires some computing 133 00:05:01,199 --> 00:05:04,800 power there's no exotic hardware 134 00:05:03,039 --> 00:05:06,960 involved it doesn't need to happen 135 00:05:04,800 --> 00:05:09,120 anywhere in particular 136 00:05:06,960 --> 00:05:11,520 things worth really thinking about like 137 00:05:09,120 --> 00:05:13,280 map generation often don't need answers 138 00:05:11,520 --> 00:05:14,800 right away 139 00:05:13,280 --> 00:05:16,960 things that need answers right away such 140 00:05:14,800 --> 00:05:20,280 as obstacle avoidance often don't need 141 00:05:16,960 --> 00:05:20,280 much thought 142 00:05:24,000 --> 00:05:27,039 the separation of duty 143 00:05:27,440 --> 00:05:30,400 ros two nodes don't need to be on the 144 00:05:29,120 --> 00:05:33,360 same machine 145 00:05:30,400 --> 00:05:34,720 in the example here 146 00:05:33,360 --> 00:05:36,000 there's only a couple of nodes that 147 00:05:34,720 --> 00:05:37,680 actually exist 148 00:05:36,000 --> 00:05:40,240 on the robot 149 00:05:37,680 --> 00:05:41,759 and those are over here 150 00:05:40,240 --> 00:05:44,080 and there's 151 00:05:41,759 --> 00:05:47,440 a robot that's not showing up on a 152 00:05:44,080 --> 00:05:47,440 note over here that's not showing up 153 00:05:47,520 --> 00:05:50,800 uh the rest is all on my laptop all of 154 00:05:49,440 --> 00:05:53,280 the inverse kinematics all of the 155 00:05:50,800 --> 00:05:55,759 joystick handling all of the 156 00:05:53,280 --> 00:05:57,680 everything else 157 00:05:55,759 --> 00:05:59,759 the ros 2 nodes automatically discover 158 00:05:57,680 --> 00:06:01,600 each other over the local network ros 2 159 00:05:59,759 --> 00:06:03,199 transport layers are deeply configurable 160 00:06:01,600 --> 00:06:05,199 and do support encryption and 161 00:06:03,199 --> 00:06:06,800 authentication the hard work is all done 162 00:06:05,199 --> 00:06:08,960 on the laptop while the robot can focus 163 00:06:06,800 --> 00:06:11,840 on doing things and measuring things 164 00:06:08,960 --> 00:06:14,160 this separation of duty is why i'm 165 00:06:11,840 --> 00:06:16,000 so excited about micro ros it takes it a 166 00:06:14,160 --> 00:06:20,120 step further than just having a big 167 00:06:16,000 --> 00:06:20,120 machine and a little machine 168 00:06:20,240 --> 00:06:24,400 going back to sense think act there's an 169 00:06:22,720 --> 00:06:26,720 implicit step between 170 00:06:24,400 --> 00:06:28,240 act that goes back around to sense 171 00:06:26,720 --> 00:06:31,520 which is why the world has a think about 172 00:06:28,240 --> 00:06:31,520 you and stuff moves about 173 00:06:32,319 --> 00:06:35,600 the trouble is the world doesn't let you 174 00:06:34,160 --> 00:06:38,720 have your turn in peace and stuff 175 00:06:35,600 --> 00:06:39,919 continues to move while 176 00:06:38,720 --> 00:06:41,600 stuff continues to move about while 177 00:06:39,919 --> 00:06:43,360 you're trying to have a think 178 00:06:41,600 --> 00:06:46,240 i'm going to take detour from robots to 179 00:06:43,360 --> 00:06:46,240 talk about time 180 00:06:46,639 --> 00:06:50,639 until about 2010 pcs came with parallel 181 00:06:49,599 --> 00:06:52,240 ports 182 00:06:50,639 --> 00:06:55,360 and parallel ports could interrupt the 183 00:06:52,240 --> 00:06:57,199 cpu in a cnc machine you could measure 184 00:06:55,360 --> 00:06:59,120 the length of a cutting tool by lowering 185 00:06:57,199 --> 00:07:00,479 it onto a conductive pad 186 00:06:59,120 --> 00:07:02,479 and stopping when you complete an 187 00:07:00,479 --> 00:07:04,639 electrical circuit through it 188 00:07:02,479 --> 00:07:06,880 it was very simple to write software 189 00:07:04,639 --> 00:07:09,199 that could use the parallel port to 190 00:07:06,880 --> 00:07:10,880 detect tool contact 191 00:07:09,199 --> 00:07:13,039 stop all the motors within tens of 192 00:07:10,880 --> 00:07:14,639 microseconds the parallel port became 193 00:07:13,039 --> 00:07:16,479 obsolete and was replaced by usb 194 00:07:14,639 --> 00:07:18,560 adapters 195 00:07:16,479 --> 00:07:19,840 the communication round trip of usb 196 00:07:18,560 --> 00:07:22,240 pushed the latency out to about a 197 00:07:19,840 --> 00:07:25,120 millisecond the port throughput was the 198 00:07:22,240 --> 00:07:26,880 same so consumer experiences were good 199 00:07:25,120 --> 00:07:29,840 but motor commands would get buffered in 200 00:07:26,880 --> 00:07:31,759 the adapter so an instruction to stop 201 00:07:29,840 --> 00:07:32,960 would get delayed behind instructions to 202 00:07:31,759 --> 00:07:34,000 advance 203 00:07:32,960 --> 00:07:35,039 the additional buffering made the 204 00:07:34,000 --> 00:07:38,080 difference between an accurate 205 00:07:35,039 --> 00:07:39,599 measurement and a broken tool 206 00:07:38,080 --> 00:07:41,440 as computers got more powerful we 207 00:07:39,599 --> 00:07:43,520 expected more from them more threads 208 00:07:41,440 --> 00:07:45,599 more things at once modern task 209 00:07:43,520 --> 00:07:47,759 schedulers are amazing things some of 210 00:07:45,599 --> 00:07:49,840 them allow you to schedule operations 211 00:07:47,759 --> 00:07:51,680 to happen by some deadline 212 00:07:49,840 --> 00:07:53,759 instead of indicating some relative 213 00:07:51,680 --> 00:07:55,360 priority 214 00:07:53,759 --> 00:07:57,199 this allows things like real-time audio 215 00:07:55,360 --> 00:07:59,280 processing on linux 216 00:07:57,199 --> 00:08:00,720 mouse cursors that don't stutter 217 00:07:59,280 --> 00:08:02,400 deadline schedulers are useful for 218 00:08:00,720 --> 00:08:03,919 robotics but they're not enough on their 219 00:08:02,400 --> 00:08:05,360 own 220 00:08:03,919 --> 00:08:06,720 very often you need better timing 221 00:08:05,360 --> 00:08:07,759 resolution so you need something to 222 00:08:06,720 --> 00:08:10,479 happen 223 00:08:07,759 --> 00:08:12,960 not just before some deadline but at a 224 00:08:10,479 --> 00:08:14,720 specific time 225 00:08:12,960 --> 00:08:17,120 if you've ever tried to use addressable 226 00:08:14,720 --> 00:08:18,800 leds on an 80 tiny processor and then do 227 00:08:17,120 --> 00:08:20,479 something else as well you know it 228 00:08:18,800 --> 00:08:22,160 doesn't work 229 00:08:20,479 --> 00:08:24,800 to get really good timing guarantees on 230 00:08:22,160 --> 00:08:26,479 a cpu you need an ability for the cpu to 231 00:08:24,800 --> 00:08:29,120 drop whatever it's doing 232 00:08:26,479 --> 00:08:31,360 and respond to an external event a cpu 233 00:08:29,120 --> 00:08:34,080 interrupt 234 00:08:31,360 --> 00:08:35,919 unfortunately cpus take time to do 235 00:08:34,080 --> 00:08:38,080 anything and things have a habit of 236 00:08:35,919 --> 00:08:39,680 happening all at once 237 00:08:38,080 --> 00:08:41,360 the more interrupts you want the cpu to 238 00:08:39,680 --> 00:08:42,880 service the more likely it is that your 239 00:08:41,360 --> 00:08:45,440 interrupts will collide with each other 240 00:08:42,880 --> 00:08:47,600 and one will get delayed or missed 241 00:08:45,440 --> 00:08:49,600 the more strictly timed code you try to 242 00:08:47,600 --> 00:08:50,959 write the less of your code will be on 243 00:08:49,600 --> 00:08:52,959 time 244 00:08:50,959 --> 00:08:55,440 i mean on time in the strictest hardware 245 00:08:52,959 --> 00:08:58,880 sense here running a specific cpu 246 00:08:55,440 --> 00:09:00,320 instruction on a specific instant 247 00:08:58,880 --> 00:09:01,519 bit bash protocols and physics 248 00:09:00,320 --> 00:09:02,720 experiments 249 00:09:01,519 --> 00:09:05,760 the promise 250 00:09:02,720 --> 00:09:07,279 of time sharing of a cpu is incompatible 251 00:09:05,760 --> 00:09:08,399 with the promise of handling multiple 252 00:09:07,279 --> 00:09:11,440 unpredictable 253 00:09:08,399 --> 00:09:13,279 events on time every time 254 00:09:11,440 --> 00:09:16,320 the solution doesn't exist to be written 255 00:09:13,279 --> 00:09:18,240 down in a software framework 256 00:09:16,320 --> 00:09:20,160 the way out is you compromise you relax 257 00:09:18,240 --> 00:09:22,160 some constraints limit the timing at the 258 00:09:20,160 --> 00:09:23,839 resolution of your timing guarantees and 259 00:09:22,160 --> 00:09:25,040 then only guarantee that code will run 260 00:09:23,839 --> 00:09:27,279 before 261 00:09:25,040 --> 00:09:29,519 before a deadline 262 00:09:27,279 --> 00:09:31,440 that compromise is what a real-time 263 00:09:29,519 --> 00:09:32,959 kernel offers and it's plenty for a lot 264 00:09:31,440 --> 00:09:34,160 of things that i didn't come here to 265 00:09:32,959 --> 00:09:35,600 talk about 266 00:09:34,160 --> 00:09:38,160 the other constraint you can relax is 267 00:09:35,600 --> 00:09:40,959 the assumption that we have fewer cpus 268 00:09:38,160 --> 00:09:43,200 than things we want to do more hardware 269 00:09:40,959 --> 00:09:45,440 less sharing of resources 270 00:09:43,200 --> 00:09:47,920 more cpus servicing fewer interrupts 271 00:09:45,440 --> 00:09:51,040 each simpler cpus that have more 272 00:09:47,920 --> 00:09:52,560 deterministic timing or even specialized 273 00:09:51,040 --> 00:09:55,600 devices that can implement desired 274 00:09:52,560 --> 00:09:57,200 behavior without cpu intervention 275 00:09:55,600 --> 00:09:59,279 a lot of embedded systems engineering 276 00:09:57,200 --> 00:10:01,600 for battery-powered devices 277 00:09:59,279 --> 00:10:03,920 boils down to corralling microcontroller 278 00:10:01,600 --> 00:10:06,959 peripherals to do all of the things 279 00:10:03,920 --> 00:10:09,839 while the cpu takes a nap 280 00:10:06,959 --> 00:10:11,120 but less sharing of more hardware is not 281 00:10:09,839 --> 00:10:13,680 a solution 282 00:10:11,120 --> 00:10:15,600 it's just a different problem 283 00:10:13,680 --> 00:10:17,760 fortunately the throw hardware out of 284 00:10:15,600 --> 00:10:20,240 problem space is a little more tractable 285 00:10:17,760 --> 00:10:20,240 these days 286 00:10:20,560 --> 00:10:24,880 if i have to leave the comfort of gcc on 287 00:10:23,040 --> 00:10:27,920 linux and write my time sensitive stuff 288 00:10:24,880 --> 00:10:30,000 on a microcontroller i don't also want 289 00:10:27,920 --> 00:10:31,760 to write about passing messages back and 290 00:10:30,000 --> 00:10:33,440 forth between the micro and some host 291 00:10:31,760 --> 00:10:35,839 system 292 00:10:33,440 --> 00:10:37,440 and then also write about uh write that 293 00:10:35,839 --> 00:10:38,959 on both sides of the communication 294 00:10:37,440 --> 00:10:41,120 channel 295 00:10:38,959 --> 00:10:43,839 using an arduino for an out of chassis 296 00:10:41,120 --> 00:10:45,440 experience for a robot was so common 297 00:10:43,839 --> 00:10:46,800 that the ros community made a couple of 298 00:10:45,440 --> 00:10:50,320 compelling attempts at getting ros to 299 00:10:46,800 --> 00:10:50,320 work nicely with microcontrollers 300 00:10:51,519 --> 00:10:55,360 roz serial provided a generic host side 301 00:10:53,920 --> 00:10:56,480 node that could be instructed by an 302 00:10:55,360 --> 00:10:58,480 arduino 303 00:10:56,480 --> 00:11:02,000 to interact with a host side 304 00:10:58,480 --> 00:11:03,920 data stream the arduino side library let 305 00:11:02,000 --> 00:11:05,920 you set callbacks to be executed when 306 00:11:03,920 --> 00:11:07,120 messages arrived and pack messages to be 307 00:11:05,920 --> 00:11:09,519 sent 308 00:11:07,120 --> 00:11:10,720 overall it was very clean but 309 00:11:09,519 --> 00:11:12,160 it was very 310 00:11:10,720 --> 00:11:16,160 it was a very clean implementation for 311 00:11:12,160 --> 00:11:16,160 ros one by the time roz 2 came about 312 00:11:17,040 --> 00:11:21,440 it had a few issues though 313 00:11:18,959 --> 00:11:23,839 most arduino boards have a physical 314 00:11:21,440 --> 00:11:25,600 serial physical serial port behind a usb 315 00:11:23,839 --> 00:11:28,240 converter so they don't move data 316 00:11:25,600 --> 00:11:30,720 particularly quickly 317 00:11:28,240 --> 00:11:33,079 raw serial also couldn't be extended to 318 00:11:30,720 --> 00:11:35,680 wi-fi or ethernet when the 319 00:11:33,079 --> 00:11:39,440 esp8266 became popular or when ethernet 320 00:11:35,680 --> 00:11:39,440 shields became cost effective 321 00:11:39,519 --> 00:11:44,399 library support for the various messages 322 00:11:41,839 --> 00:11:46,240 had to be generated from host side code 323 00:11:44,399 --> 00:11:48,399 and copied to an arduino library it was 324 00:11:46,240 --> 00:11:51,360 automated but still a little a little 325 00:11:48,399 --> 00:11:51,360 rough on beginners 326 00:11:52,639 --> 00:11:57,200 because the serial port on almost all 327 00:11:54,720 --> 00:11:59,760 arduinos and clones used usb serial 328 00:11:57,200 --> 00:12:02,240 emulation they inherited a 10 meter 329 00:11:59,760 --> 00:12:04,079 limit to the tether to a host pc 330 00:12:02,240 --> 00:12:06,000 it was common to see wireless bridges 331 00:12:04,079 --> 00:12:09,040 open wrt routers 332 00:12:06,000 --> 00:12:12,079 or xp radios but they often doubled the 333 00:12:09,040 --> 00:12:13,760 cost of the actual robot 334 00:12:12,079 --> 00:12:15,680 these limitations needed a systematic 335 00:12:13,760 --> 00:12:18,240 fix 336 00:12:15,680 --> 00:12:20,079 instead of wrapping some key functions 337 00:12:18,240 --> 00:12:21,920 on microsite code and then leaning on 338 00:12:20,079 --> 00:12:24,320 the host for actual work 339 00:12:21,920 --> 00:12:27,200 micro ros builds ros2 natively for the 340 00:12:24,320 --> 00:12:29,519 target microcontroller 341 00:12:27,200 --> 00:12:33,040 microros provides a full-blown native 342 00:12:29,519 --> 00:12:35,920 ros 2 interface for arduino esp 343 00:12:33,040 --> 00:12:35,920 stm32 344 00:12:37,440 --> 00:12:41,519 because roz uses mainline ros2 source 345 00:12:40,240 --> 00:12:44,000 the developers were able to get 346 00:12:41,519 --> 00:12:46,160 incredible automated test coverage which 347 00:12:44,000 --> 00:12:49,120 made for a really pleasant pull pull 348 00:12:46,160 --> 00:12:49,120 request experience on 349 00:12:50,839 --> 00:12:56,480 github peer discovery is 350 00:12:53,839 --> 00:12:58,480 important for flexibility by forcing a 351 00:12:56,480 --> 00:13:00,959 decades worth of robot developers into a 352 00:12:58,480 --> 00:13:03,600 strict and modular design pattern any 353 00:13:00,959 --> 00:13:05,040 host side nodes ever written can talk to 354 00:13:03,600 --> 00:13:07,839 any microcontroller on the network 355 00:13:05,040 --> 00:13:07,839 without modification 356 00:13:08,560 --> 00:13:13,519 micropros integrates with free rtos so 357 00:13:10,880 --> 00:13:17,040 you can have fancy threading stuff or 358 00:13:13,519 --> 00:13:17,040 you can just write event handlers 359 00:13:18,639 --> 00:13:24,880 i mean you can take it as uh 360 00:13:21,519 --> 00:13:24,880 as shallow or deep as you please 361 00:13:25,279 --> 00:13:28,560 a lot of 362 00:13:26,959 --> 00:13:30,720 roz developers these days are having to 363 00:13:28,560 --> 00:13:32,720 square with automotive safety integrity 364 00:13:30,720 --> 00:13:35,120 coding guidelines so there's actually 365 00:13:32,720 --> 00:13:38,000 very little memory thrashing at run time 366 00:13:35,120 --> 00:13:38,000 in micro roles 367 00:13:38,880 --> 00:13:42,959 micro ros inherits the plugable 368 00:13:41,440 --> 00:13:44,720 transport layers 369 00:13:42,959 --> 00:13:47,360 of of ros 2 370 00:13:44,720 --> 00:13:49,279 which became way more significant than i 371 00:13:47,360 --> 00:13:51,120 expected 372 00:13:49,279 --> 00:13:53,120 when i proposed this talk 373 00:13:51,120 --> 00:13:55,760 none of the regular ros transports would 374 00:13:53,120 --> 00:13:58,639 build on a microcontroller so microroz 375 00:13:55,760 --> 00:14:00,560 relied on hosts on a host side node to 376 00:13:58,639 --> 00:14:02,480 broker transactions through a simpler 377 00:14:00,560 --> 00:14:05,839 communication protocol 378 00:14:02,480 --> 00:14:08,079 the microros agent supported serial udp 379 00:14:05,839 --> 00:14:10,000 can bus 380 00:14:08,079 --> 00:14:12,800 but the agent sat on a host like the end 381 00:14:10,000 --> 00:14:15,519 of a tether lending a similar topology 382 00:14:12,800 --> 00:14:17,680 to raw serial 383 00:14:15,519 --> 00:14:19,760 that tether could be wi-fi but the agent 384 00:14:17,680 --> 00:14:22,639 was still a central point of failure on 385 00:14:19,760 --> 00:14:24,399 an otherwise distributed system 386 00:14:22,639 --> 00:14:25,839 these simpler protocols were implemented 387 00:14:24,399 --> 00:14:28,320 as uh 388 00:14:25,839 --> 00:14:29,680 as proper ros transport layers though 389 00:14:28,320 --> 00:14:31,839 they just lacked the killer features 390 00:14:29,680 --> 00:14:33,120 that made ros 2 so powerful 391 00:14:31,839 --> 00:14:36,240 and then 392 00:14:33,120 --> 00:14:38,079 someone announced embedded rtps 393 00:14:36,240 --> 00:14:40,160 i don't have a slide for this one 394 00:14:38,079 --> 00:14:42,320 um 395 00:14:40,160 --> 00:14:44,800 ros 2 ships with the default transport 396 00:14:42,320 --> 00:14:46,880 layers based on dds the data 397 00:14:44,800 --> 00:14:49,040 distribution system 398 00:14:46,880 --> 00:14:50,560 ros 2 treats it like a 399 00:14:49,040 --> 00:14:52,240 big old name space that holds the 400 00:14:50,560 --> 00:14:55,360 current states of a bunch of values and 401 00:14:52,240 --> 00:14:57,440 updates them on any machine that cares 402 00:14:55,360 --> 00:14:59,120 behind the key behind the curtain dds is 403 00:14:57,440 --> 00:15:02,000 a lot more than that 404 00:14:59,120 --> 00:15:03,600 dds is provided for ros 2 by a couple of 405 00:15:02,000 --> 00:15:04,959 vendors and they're all notionally 406 00:15:03,600 --> 00:15:07,279 intercompatible 407 00:15:04,959 --> 00:15:10,320 for at least the basic features 408 00:15:07,279 --> 00:15:12,320 one such basic feature is rtps real time 409 00:15:10,320 --> 00:15:14,240 publish subscribe which handles most of 410 00:15:12,320 --> 00:15:15,600 the network transport tasks 411 00:15:14,240 --> 00:15:18,560 rtps 412 00:15:15,600 --> 00:15:20,000 is not to be confused with any of rtp 413 00:15:18,560 --> 00:15:21,360 rtsp 414 00:15:20,000 --> 00:15:24,240 rtmp 415 00:15:21,360 --> 00:15:27,519 rtmps 416 00:15:24,240 --> 00:15:28,399 realtime publish subscribe 417 00:15:27,519 --> 00:15:29,680 yeah 418 00:15:28,399 --> 00:15:32,000 acronyms 419 00:15:29,680 --> 00:15:34,560 and a cluttered namespace embedded rtps 420 00:15:32,000 --> 00:15:37,279 had its first commits in 2018 and built 421 00:15:34,560 --> 00:15:40,399 an implementation of rtps that 422 00:15:37,279 --> 00:15:42,560 works on microcontrollers with lwip the 423 00:15:40,399 --> 00:15:44,959 lightweight internet protocol and free 424 00:15:42,560 --> 00:15:45,839 rtos allowing it to target 425 00:15:44,959 --> 00:15:47,759 the 426 00:15:45,839 --> 00:15:51,519 threading and networking capabilities of 427 00:15:47,759 --> 00:15:54,959 stm32 arduino and esp 428 00:15:51,519 --> 00:15:56,160 embedded rtps announced on the roz 429 00:15:54,959 --> 00:15:57,680 discord 430 00:15:56,160 --> 00:16:00,240 that it had passed some compatibility 431 00:15:57,680 --> 00:16:02,720 tests with fast dds the 432 00:16:00,240 --> 00:16:05,040 the host side dds implementation for ros 433 00:16:02,720 --> 00:16:06,839 foxy 434 00:16:05,040 --> 00:16:09,920 in january 21 435 00:16:06,839 --> 00:16:11,199 uh then in october the micro ros 436 00:16:09,920 --> 00:16:13,600 maintainers 437 00:16:11,199 --> 00:16:15,759 had included it as a transport option in 438 00:16:13,600 --> 00:16:16,959 micro ros eliminating the need for the 439 00:16:15,759 --> 00:16:18,959 agent 440 00:16:16,959 --> 00:16:20,800 bringing raw micro rods into a 441 00:16:18,959 --> 00:16:23,800 decentralized topology with the rest of 442 00:16:20,800 --> 00:16:23,800 roles 443 00:16:24,639 --> 00:16:29,040 i think 444 00:16:25,920 --> 00:16:32,320 i'm going to go into demo time now 445 00:16:29,040 --> 00:16:32,320 so i'm going to hope this all works 446 00:16:32,959 --> 00:16:35,759 um 447 00:16:34,560 --> 00:16:38,560 so these are all the nodes that i 448 00:16:35,759 --> 00:16:38,560 currently have running 449 00:16:40,880 --> 00:16:43,199 and 450 00:16:45,759 --> 00:16:48,399 see 451 00:16:46,880 --> 00:16:52,480 if i visualize what the kinematics is 452 00:16:48,399 --> 00:16:52,480 doing that's actually up behind me 453 00:16:52,720 --> 00:16:56,160 that's this one 454 00:16:54,639 --> 00:16:58,880 where the camera pointed at it from a 455 00:16:56,160 --> 00:16:58,880 second robot 456 00:17:00,399 --> 00:17:05,839 and then on the joystick 457 00:17:02,959 --> 00:17:05,839 i can 458 00:17:06,240 --> 00:17:10,400 move all of the parts like so 459 00:17:08,160 --> 00:17:10,400 so 460 00:17:12,640 --> 00:17:16,480 i've got 461 00:17:13,600 --> 00:17:18,480 a joystick input with a deadman switch 462 00:17:16,480 --> 00:17:20,799 which is all handled on the host side 463 00:17:18,480 --> 00:17:23,520 computer i reuse all of these nodes for 464 00:17:20,799 --> 00:17:26,799 any robot that drives around 465 00:17:23,520 --> 00:17:28,559 i've got an openscad model that has all 466 00:17:26,799 --> 00:17:30,000 the inverse kinematics 467 00:17:28,559 --> 00:17:32,640 all the inverse kinematics runs on the 468 00:17:30,000 --> 00:17:34,240 host side machine and then it sends the 469 00:17:32,640 --> 00:17:35,440 updated states 470 00:17:34,240 --> 00:17:38,520 to 471 00:17:35,440 --> 00:17:38,520 the microcontroller 472 00:18:01,360 --> 00:18:05,679 um 473 00:18:03,200 --> 00:18:07,919 so that's about all i've got 474 00:18:05,679 --> 00:18:09,840 uh the microcontroller in in this demo 475 00:18:07,919 --> 00:18:11,600 is the esp32 476 00:18:09,840 --> 00:18:12,799 and it's just running uh 477 00:18:11,600 --> 00:18:16,400 um 478 00:18:12,799 --> 00:18:17,840 it's accepting server messages for 479 00:18:16,400 --> 00:18:22,360 several messages 480 00:18:17,840 --> 00:18:22,360 an array of where am i 481 00:18:28,799 --> 00:18:31,600 i can interrogate 482 00:18:40,799 --> 00:18:47,120 the topics that i'm using 483 00:18:44,640 --> 00:18:47,120 and i can 484 00:18:52,000 --> 00:18:56,559 read off the commands that are being 485 00:18:53,760 --> 00:18:59,280 sent to 486 00:18:56,559 --> 00:19:00,559 if i can type it 487 00:18:59,280 --> 00:19:03,919 uh read off the commands that are being 488 00:19:00,559 --> 00:19:03,919 sent to the claw 489 00:19:04,240 --> 00:19:11,799 so these are just um 490 00:19:07,520 --> 00:19:11,799 this is just an array of 491 00:19:12,480 --> 00:19:18,440 signed integers each one represents the 492 00:19:14,799 --> 00:19:18,440 angle of a server motor 493 00:19:28,000 --> 00:19:31,120 the joystick 494 00:19:31,520 --> 00:19:35,400 again is a standard message 495 00:19:43,679 --> 00:19:46,799 with stick inputs 496 00:19:47,840 --> 00:19:51,200 uh stick inputs has floating point 497 00:19:49,280 --> 00:19:52,400 numbers buttons as i think also floating 498 00:19:51,200 --> 00:19:54,080 point numbers 499 00:19:52,400 --> 00:19:56,080 um 500 00:19:54,080 --> 00:19:59,360 and this this kind of standardization 501 00:19:56,080 --> 00:19:59,360 means that any 502 00:20:01,440 --> 00:20:07,039 any developers can sort of share basic 503 00:20:03,679 --> 00:20:10,960 functionality of all of their robots so 504 00:20:07,039 --> 00:20:10,960 the same messages i use here i use on 505 00:20:11,919 --> 00:20:14,880 the other robot behind me 506 00:20:16,400 --> 00:20:21,120 they all use very similar hardware so 507 00:20:18,799 --> 00:20:23,679 the timing performances demo is not 508 00:20:21,120 --> 00:20:26,640 great i've kind of used the 509 00:20:23,679 --> 00:20:30,080 the simplest implementation 510 00:20:26,640 --> 00:20:32,400 of sending just the the updated state 511 00:20:30,080 --> 00:20:35,840 instead of sending like a schedule of 512 00:20:32,400 --> 00:20:35,840 motions to to follow 513 00:20:46,480 --> 00:20:50,559 so normally in a like the reason you 514 00:20:49,120 --> 00:20:52,240 would want to use roles on hardware is 515 00:20:50,559 --> 00:20:54,159 because you want you know strict timing 516 00:20:52,240 --> 00:20:56,240 you want to have a 517 00:20:54,159 --> 00:20:59,240 motion plan coming from a host host 518 00:20:56,240 --> 00:20:59,240 system 519 00:21:04,320 --> 00:21:07,520 you can have motion commands coming from 520 00:21:05,600 --> 00:21:10,159 a host system with a sort of default 521 00:21:07,520 --> 00:21:11,600 estop behavior if something happens 522 00:21:10,159 --> 00:21:14,960 instantly on the 523 00:21:11,600 --> 00:21:14,960 on the microcontroller on the 524 00:21:15,760 --> 00:21:18,880 if the microcontroller needs to respond 525 00:21:17,039 --> 00:21:22,000 to an event quickly you can you can do 526 00:21:18,880 --> 00:21:22,000 that on the microcontroller 527 00:21:22,480 --> 00:21:26,240 uh we've got a question about inverse 528 00:21:24,000 --> 00:21:28,000 kinematics 529 00:21:26,240 --> 00:21:31,840 where are we 530 00:21:28,000 --> 00:21:31,840 inverse kinematics um 531 00:21:33,120 --> 00:21:35,440 sure 532 00:21:38,799 --> 00:21:44,840 kinematics is describing 533 00:21:41,840 --> 00:21:44,840 um 534 00:21:45,760 --> 00:21:51,200 describing how a joint should move in 535 00:21:48,000 --> 00:21:52,960 order to achieve a certain result so 536 00:21:51,200 --> 00:21:55,520 in the case of 537 00:21:52,960 --> 00:21:58,720 uh in the case of this claw i've got the 538 00:21:55,520 --> 00:22:01,679 contact points where the claw should be 539 00:21:58,720 --> 00:22:01,679 moving around a circle 540 00:22:02,640 --> 00:22:06,080 kinematics is 541 00:22:04,320 --> 00:22:09,360 essentially where that contact point 542 00:22:06,080 --> 00:22:11,360 ends up for a given mode of motion 543 00:22:09,360 --> 00:22:14,240 inverse kinematics is figuring out how 544 00:22:11,360 --> 00:22:16,080 the motors should move to achieve that 545 00:22:14,240 --> 00:22:18,799 desired motion so 546 00:22:16,080 --> 00:22:20,880 here i have a gate synthesizer which 547 00:22:18,799 --> 00:22:23,120 describes a path plan 548 00:22:20,880 --> 00:22:24,480 it describes a path through space and 549 00:22:23,120 --> 00:22:27,360 the motors 550 00:22:24,480 --> 00:22:30,159 the inverse kinematics engine tries to 551 00:22:27,360 --> 00:22:31,039 find joint joint poses that achieve 552 00:22:30,159 --> 00:22:33,280 those 553 00:22:31,039 --> 00:22:33,280 um 554 00:22:34,159 --> 00:22:37,799 that achieve those positions 555 00:22:38,840 --> 00:22:42,159 uh 556 00:22:40,400 --> 00:22:43,840 and i did actually implement 557 00:22:42,159 --> 00:22:45,919 inverse kinematics on openscad i kind of 558 00:22:43,840 --> 00:22:48,159 got a bit carried away 559 00:22:45,919 --> 00:22:48,159 um 560 00:22:49,280 --> 00:22:52,559 openscad being a 561 00:22:52,960 --> 00:22:56,960 uh 562 00:22:54,799 --> 00:22:59,280 having its variables are 563 00:22:56,960 --> 00:23:01,919 openscad's a bit weird it's the simplest 564 00:22:59,280 --> 00:23:03,520 possible cad language that you could 565 00:23:01,919 --> 00:23:04,960 use 566 00:23:03,520 --> 00:23:06,960 um 567 00:23:04,960 --> 00:23:09,840 so it's the simplest language that could 568 00:23:06,960 --> 00:23:09,840 solve a problem 569 00:23:10,000 --> 00:23:14,080 which means that it doesn't have like 570 00:23:11,679 --> 00:23:15,120 for loops or mutable variables or stuff 571 00:23:14,080 --> 00:23:17,280 like that 572 00:23:15,120 --> 00:23:18,480 it just has like tail recursion if you 573 00:23:17,280 --> 00:23:22,080 want a loop you have to use taylor 574 00:23:18,480 --> 00:23:25,600 equation so in this case i have uh the 575 00:23:22,080 --> 00:23:29,200 animation loop figures out places for 576 00:23:25,600 --> 00:23:29,200 the contact points to be 577 00:23:34,159 --> 00:23:39,440 and then it um 578 00:23:36,799 --> 00:23:41,919 it uses tail recursion to optimize 579 00:23:39,440 --> 00:23:43,360 the poses of all the motors 580 00:23:41,919 --> 00:23:45,039 to achieve those joint positions and 581 00:23:43,360 --> 00:23:47,279 that all happens within open skirt that 582 00:23:45,039 --> 00:23:48,480 was really useful um 583 00:23:47,279 --> 00:23:50,240 for 584 00:23:48,480 --> 00:23:52,559 figuring out like do these components 585 00:23:50,240 --> 00:23:53,919 all collide with each other have i 586 00:23:52,559 --> 00:23:56,400 made joints long enough to reach the 587 00:23:53,919 --> 00:23:58,159 positions they want to get to 588 00:23:56,400 --> 00:23:59,760 um 589 00:23:58,159 --> 00:24:01,120 that was also very good because i could 590 00:23:59,760 --> 00:24:03,760 export the model 591 00:24:01,120 --> 00:24:06,640 into roles but i could also export the 592 00:24:03,760 --> 00:24:06,640 kinematics chain 593 00:24:10,720 --> 00:24:13,600 so 594 00:24:11,919 --> 00:24:17,080 i've just got a bunch of 595 00:24:13,600 --> 00:24:17,080 lengths of 596 00:24:18,000 --> 00:24:22,000 uh lengths of all the 597 00:24:19,600 --> 00:24:24,080 uh joints of the 598 00:24:22,000 --> 00:24:25,520 hinges and stuff 599 00:24:24,080 --> 00:24:29,200 and i could just export those directly 600 00:24:25,520 --> 00:24:30,840 into the ros simulation to generate 601 00:24:29,200 --> 00:24:34,960 this 602 00:24:30,840 --> 00:24:36,640 model uh the connection 603 00:24:34,960 --> 00:24:38,320 the connection between the computer and 604 00:24:36,640 --> 00:24:40,240 the robot is 605 00:24:38,320 --> 00:24:42,559 you can take your pick so at the moment 606 00:24:40,240 --> 00:24:44,159 i'm using the micro ros agent over 607 00:24:42,559 --> 00:24:46,400 wireless 608 00:24:44,159 --> 00:24:48,720 so i've just got udp transport over wifi 609 00:24:46,400 --> 00:24:49,919 that thing is just battery powered off a 610 00:24:48,720 --> 00:24:52,159 drill motor 611 00:24:49,919 --> 00:24:55,159 for drill battery 612 00:24:52,159 --> 00:24:55,159 um 613 00:25:01,120 --> 00:25:06,320 and you can use a serial can bus i mean 614 00:25:04,080 --> 00:25:08,000 you you can make an any transport 615 00:25:06,320 --> 00:25:09,200 over anything as long as you implement 616 00:25:08,000 --> 00:25:13,240 it as a 617 00:25:09,200 --> 00:25:13,240 like as an actual ros transport 618 00:25:15,440 --> 00:25:18,480 uh what sort of limits are there in 619 00:25:16,880 --> 00:25:19,679 micro raws for hardware support i'm 620 00:25:18,480 --> 00:25:20,880 assuming you can't do more complicated 621 00:25:19,679 --> 00:25:23,919 stuff that you would do on a full linux 622 00:25:20,880 --> 00:25:25,200 host eg connecting to lidars funny you 623 00:25:23,919 --> 00:25:27,039 mentioned that 624 00:25:25,200 --> 00:25:29,600 um 625 00:25:27,039 --> 00:25:31,120 lidars produce a fairly huge amount of 626 00:25:29,600 --> 00:25:33,039 data 627 00:25:31,120 --> 00:25:35,440 and a lot of the time they just put it 628 00:25:33,039 --> 00:25:38,240 straight onto an ethernet cable so 629 00:25:35,440 --> 00:25:40,320 most of the time for a lidar you've got 630 00:25:38,240 --> 00:25:42,320 uh lidar data coming 631 00:25:40,320 --> 00:25:43,520 from the unit over ethernet into the 632 00:25:42,320 --> 00:25:46,320 host system and then you've got a driver 633 00:25:43,520 --> 00:25:46,320 on the host system 634 00:25:46,799 --> 00:25:49,679 but 635 00:25:47,679 --> 00:25:52,320 for vacuum cleaners 636 00:25:49,679 --> 00:25:55,520 they have a little spinny lidar that 637 00:25:52,320 --> 00:25:57,440 just does a 2d scan 638 00:25:55,520 --> 00:25:59,760 those end up producing a fairly small 639 00:25:57,440 --> 00:26:02,159 like a very modest amount of 640 00:25:59,760 --> 00:26:02,159 data 641 00:26:02,559 --> 00:26:04,720 so 642 00:26:05,440 --> 00:26:11,520 those ones you can just 643 00:26:07,679 --> 00:26:14,240 attach to a microcontroller and then 644 00:26:11,520 --> 00:26:16,640 spool all of the all of the 645 00:26:14,240 --> 00:26:18,320 ranges and angles out to a host system 646 00:26:16,640 --> 00:26:20,320 or deal with them on the 647 00:26:18,320 --> 00:26:21,200 on the local device 648 00:26:20,320 --> 00:26:22,799 so 649 00:26:21,200 --> 00:26:25,520 like i mentioned for map generation 650 00:26:22,799 --> 00:26:29,440 versus obstacle avoidance 651 00:26:25,520 --> 00:26:31,200 if you have a 2d lidar you can 652 00:26:29,440 --> 00:26:33,679 you can set up little zones where if you 653 00:26:31,200 --> 00:26:34,880 detect a hit within a within a zone 654 00:26:33,679 --> 00:26:36,840 you know you've got an obstacle that you 655 00:26:34,880 --> 00:26:38,720 need to avoid so you can have 656 00:26:36,840 --> 00:26:40,799 an uh 657 00:26:38,720 --> 00:26:42,720 a function on the microcontroller that 658 00:26:40,799 --> 00:26:44,480 avoids the obstacle 659 00:26:42,720 --> 00:26:47,039 um 660 00:26:44,480 --> 00:26:48,799 like in a in a hardware real-time loop 661 00:26:47,039 --> 00:26:50,000 and then you've got the host system 662 00:26:48,799 --> 00:26:51,679 picking up all of those points 663 00:26:50,000 --> 00:26:54,159 intercepting all that data and 664 00:26:51,679 --> 00:26:55,360 generating a map and then building a 665 00:26:54,159 --> 00:26:57,120 motion plan 666 00:26:55,360 --> 00:26:58,480 for the robot to follow 667 00:26:57,120 --> 00:27:00,320 so that way you've got 668 00:26:58,480 --> 00:27:02,320 all of the hardware real-time safety 669 00:27:00,320 --> 00:27:04,159 guarantees of an on-board 670 00:27:02,320 --> 00:27:05,120 hardware-backed obstacle avoidance 671 00:27:04,159 --> 00:27:08,159 system 672 00:27:05,120 --> 00:27:11,440 with the niceties of a more complex map 673 00:27:08,159 --> 00:27:11,440 generation and path planning tool 674 00:27:16,080 --> 00:27:20,159 so a lot of the 675 00:27:17,679 --> 00:27:21,600 communications for micro rows are not 676 00:27:20,159 --> 00:27:24,720 encrypted 677 00:27:21,600 --> 00:27:27,760 um i i'm not sure that embedded rtps has 678 00:27:24,720 --> 00:27:27,760 an encryption profile 679 00:27:29,760 --> 00:27:33,440 so 680 00:27:30,559 --> 00:27:35,520 generally ros is all about 681 00:27:33,440 --> 00:27:37,679 researching quickly so it's more about 682 00:27:35,520 --> 00:27:39,039 rapid iteration than 683 00:27:37,679 --> 00:27:41,120 uh 684 00:27:39,039 --> 00:27:42,159 safe networking practices 685 00:27:41,120 --> 00:27:44,480 so 686 00:27:42,159 --> 00:27:46,240 dds has automatic discovery on the local 687 00:27:44,480 --> 00:27:49,279 network um 688 00:27:46,240 --> 00:27:52,320 you can encrypt it and 689 00:27:49,279 --> 00:27:54,000 sros secure ros 690 00:27:52,320 --> 00:27:55,520 basically provides an api 691 00:27:54,000 --> 00:27:58,159 to 692 00:27:55,520 --> 00:28:00,000 manipulate the dds security layers 693 00:27:58,159 --> 00:28:02,000 all dds vendors 694 00:28:00,000 --> 00:28:04,320 implement a security profile uh it's 695 00:28:02,000 --> 00:28:06,480 just a mandatory aspect of like the 696 00:28:04,320 --> 00:28:07,360 minimum dds spec 697 00:28:06,480 --> 00:28:08,880 so 698 00:28:07,360 --> 00:28:11,520 you can configure that but you end up 699 00:28:08,880 --> 00:28:13,200 locking nodes into 700 00:28:11,520 --> 00:28:14,000 you know they stay in one they're one 701 00:28:13,200 --> 00:28:17,760 lane 702 00:28:14,000 --> 00:28:19,600 um they don't read or write to 703 00:28:17,760 --> 00:28:21,840 uh messages uh topics they're not 704 00:28:19,600 --> 00:28:24,159 allowed to 705 00:28:21,840 --> 00:28:28,320 stuff like that 706 00:28:24,159 --> 00:28:28,320 uh which gets kind of in the way of 707 00:28:28,840 --> 00:28:33,120 um it gets a little bit in the way of 708 00:28:33,840 --> 00:28:40,440 like iterating rapidly on 709 00:28:36,320 --> 00:28:40,440 new topologies for control systems 710 00:28:45,039 --> 00:28:47,360 uh 711 00:28:48,000 --> 00:28:51,000 oops 712 00:29:01,039 --> 00:29:05,279 uh 713 00:29:01,919 --> 00:29:09,080 how much time do we have 714 00:29:05,279 --> 00:29:09,080 i think we're about wrapping up 715 00:29:17,679 --> 00:29:21,360 hey 716 00:29:19,520 --> 00:29:22,960 i'll just jump back in again 717 00:29:21,360 --> 00:29:26,240 thank you very much brett 718 00:29:22,960 --> 00:29:27,679 that was fascinating and the i've got a 719 00:29:26,240 --> 00:29:29,440 couple of comments about what you just 720 00:29:27,679 --> 00:29:31,520 had on the screen a moment ago one of 721 00:29:29,440 --> 00:29:34,559 the questions i don't think um you 722 00:29:31,520 --> 00:29:36,640 followed up was what is the inspiration 723 00:29:34,559 --> 00:29:38,720 for this design when i first saw it i 724 00:29:36,640 --> 00:29:41,039 thought it was something like a 725 00:29:38,720 --> 00:29:42,320 a hexapod on its back 726 00:29:41,039 --> 00:29:44,320 right now so this is 727 00:29:42,320 --> 00:29:46,960 this is a reference to 728 00:29:44,320 --> 00:29:50,320 an art sculpt that has a kinematic 729 00:29:46,960 --> 00:29:54,600 sculpture by mark cetrakine um 730 00:29:50,320 --> 00:29:54,600 i actually saw it first on 731 00:29:54,880 --> 00:29:58,000 uh on adam's have just tested 732 00:29:57,200 --> 00:29:59,919 and 733 00:29:58,000 --> 00:30:01,039 when i looked at what they were using to 734 00:29:59,919 --> 00:30:02,720 implement it 735 00:30:01,039 --> 00:30:04,799 i looked up the motors they were using 736 00:30:02,720 --> 00:30:08,360 and it was like 500 bucks a motor 737 00:30:04,799 --> 00:30:08,360 for 15 motors 738 00:30:11,919 --> 00:30:15,039 yeah 739 00:30:13,120 --> 00:30:18,799 so my pockets aren't nearly that deep 740 00:30:15,039 --> 00:30:21,120 but i wanted to dabble with the you know 741 00:30:18,799 --> 00:30:22,640 for mark citrocaine it was a 742 00:30:21,120 --> 00:30:23,360 sharpening exercise so i wanted to kind 743 00:30:22,640 --> 00:30:25,360 of 744 00:30:23,360 --> 00:30:29,279 pay homage to it and sharpen my own 745 00:30:25,360 --> 00:30:29,279 skills by essentially replicating it 746 00:30:30,640 --> 00:30:35,520 that looks amazing so in the animation 747 00:30:32,799 --> 00:30:38,080 you have the sphere sitting on the five 748 00:30:35,520 --> 00:30:39,600 fingers have you done that physically 749 00:30:38,080 --> 00:30:42,240 i have 750 00:30:39,600 --> 00:30:44,159 unfortunately these servos so 751 00:30:42,240 --> 00:30:46,480 the reason 752 00:30:44,159 --> 00:30:48,559 the original artist used the fancy 753 00:30:46,480 --> 00:30:50,640 motors was because he can tune the 754 00:30:48,559 --> 00:30:51,919 control loop of the motor 755 00:30:50,640 --> 00:30:53,279 at runtime 756 00:30:51,919 --> 00:30:55,440 whereas these are just you know three 757 00:30:53,279 --> 00:30:57,440 dollar hobby servos 758 00:30:55,440 --> 00:30:59,840 um 759 00:30:57,440 --> 00:31:01,200 so i can't modify the controls the 760 00:30:59,840 --> 00:31:03,679 controller within the server because 761 00:31:01,200 --> 00:31:04,399 it's it's an asic it's just raw silicon 762 00:31:03,679 --> 00:31:06,880 yeah 763 00:31:04,399 --> 00:31:08,559 i find these are a bit squishy so if you 764 00:31:06,880 --> 00:31:10,799 move them from their target position 765 00:31:08,559 --> 00:31:11,840 they just apply some torque to get back 766 00:31:10,799 --> 00:31:12,559 but 767 00:31:11,840 --> 00:31:14,159 it 768 00:31:12,559 --> 00:31:14,880 feels a bit springy 769 00:31:14,159 --> 00:31:16,320 so 770 00:31:14,880 --> 00:31:19,120 i had this thing rotating a salad bowl 771 00:31:16,320 --> 00:31:20,159 it rotated but it was noisy and rattly 772 00:31:19,120 --> 00:31:20,960 and 773 00:31:20,159 --> 00:31:22,640 the 774 00:31:20,960 --> 00:31:25,279 the contact points weren't actually 775 00:31:22,640 --> 00:31:26,480 where i wanted them to be 776 00:31:25,279 --> 00:31:28,960 yeah 777 00:31:26,480 --> 00:31:31,679 okay well it's a it's an amazing demo 778 00:31:28,960 --> 00:31:33,600 anyway i love the um 779 00:31:31,679 --> 00:31:35,440 the visualization where you have the 3d 780 00:31:33,600 --> 00:31:37,200 representation and the physical object 781 00:31:35,440 --> 00:31:39,840 and they're almost synchronized it's 782 00:31:37,200 --> 00:31:40,960 very impressive 783 00:31:39,840 --> 00:31:43,679 yeah 784 00:31:40,960 --> 00:31:45,760 um i'm just having a quick check um 785 00:31:43,679 --> 00:31:48,000 a final question i think and we're just 786 00:31:45,760 --> 00:31:49,039 about out of time it's almost lunch 787 00:31:48,000 --> 00:31:50,960 is 788 00:31:49,039 --> 00:31:52,480 do you have any examples of micro ros 789 00:31:50,960 --> 00:31:53,600 running in production or commercial 790 00:31:52,480 --> 00:31:56,559 systems 791 00:31:53,600 --> 00:31:57,840 so there are um the microros team have a 792 00:31:56,559 --> 00:31:59,760 regular 793 00:31:57,840 --> 00:32:01,200 a regular meet up 794 00:31:59,760 --> 00:32:02,080 online where they they present to each 795 00:32:01,200 --> 00:32:05,200 other 796 00:32:02,080 --> 00:32:05,200 and there's a 797 00:32:05,679 --> 00:32:09,120 there's a robot chassis that they're 798 00:32:07,039 --> 00:32:12,080 aiming for like 799 00:32:09,120 --> 00:32:13,840 uh urban cargo delivery and they use 800 00:32:12,080 --> 00:32:16,880 micro rolls to handle communication 801 00:32:13,840 --> 00:32:19,039 between ros on the host box and micro 802 00:32:16,880 --> 00:32:20,399 rolls on the motor controller so instead 803 00:32:19,039 --> 00:32:22,399 of having some 804 00:32:20,399 --> 00:32:23,919 weird driver that you have to import 805 00:32:22,399 --> 00:32:26,000 dependencies for 806 00:32:23,919 --> 00:32:27,200 you can push all of the dependencies out 807 00:32:26,000 --> 00:32:29,200 to the motor controller and have the 808 00:32:27,200 --> 00:32:30,880 motor controller interact with 809 00:32:29,200 --> 00:32:32,080 the native raw system on the host 810 00:32:30,880 --> 00:32:34,240 machine 811 00:32:32,080 --> 00:32:36,880 so that allows them to iterate very 812 00:32:34,240 --> 00:32:38,559 quickly on the nature of motion control 813 00:32:36,880 --> 00:32:40,399 on their platform 814 00:32:38,559 --> 00:32:41,440 okay interesting so it allows a little 815 00:32:40,399 --> 00:32:44,480 bit more 816 00:32:41,440 --> 00:32:45,919 modularity or separation of concerns 817 00:32:44,480 --> 00:32:47,360 yeah 818 00:32:45,919 --> 00:32:50,240 okay great 819 00:32:47,360 --> 00:32:51,200 well thank you very much brett thank you 820 00:32:50,240 --> 00:32:53,039 i 821 00:32:51,200 --> 00:32:55,440 yeah i've experimented a little bit with 822 00:32:53,039 --> 00:32:57,919 roz in the past and 823 00:32:55,440 --> 00:32:59,600 found it a little bit impenetrable but 824 00:32:57,919 --> 00:33:01,039 this is inspiring it makes me want to 825 00:32:59,600 --> 00:33:02,799 look into it more 826 00:33:01,039 --> 00:33:04,480 so yeah thank you very it's been a lot 827 00:33:02,799 --> 00:33:05,679 of fun 828 00:33:04,480 --> 00:33:08,080 that's great 829 00:33:05,679 --> 00:33:09,760 and for everybody else we are now going 830 00:33:08,080 --> 00:33:12,080 into the lunch break we'll be back at 831 00:33:09,760 --> 00:33:13,919 about 1 20 832 00:33:12,080 --> 00:33:15,279 and where i will be doing a talk about 833 00:33:13,919 --> 00:33:17,600 some problems and i'm going to be trying 834 00:33:15,279 --> 00:33:18,720 to do some stuff live on the bench 835 00:33:17,600 --> 00:33:20,399 and 836 00:33:18,720 --> 00:33:22,159 hopefully it will go wrong because 837 00:33:20,399 --> 00:33:24,159 that's when it's entertaining 838 00:33:22,159 --> 00:33:27,159 so thanks everybody and we'll see you 839 00:33:24,159 --> 00:33:27,159 soon