I'm looking to buy a robot arm through AIFITLAB - has anyone done a major purchase through them recently? I'm looking to buy an AgileX NERO, price seems lower than US based companies which I know might be due to tariffs submitted by /u/Vassaci [link] [Kommentare]
Xcode is a great development environment for ESP32 devices, thanks to xcesp
A colleague of mine was recently discussing a connectivity monitoring system he is working on with me. It’s nothing fancy, just sending ICMP Echo Requests to a couple of different servers, and monitoring latency and dropped packet averages over 1-minute, 5-minute, and 15-minute periods. Up came the topic of how this data should be stored, the natural thought was a 512 entry ring buffer, containing entries like the following: 12 KiB. Pretty wasteful, right? We can certainly do better. Do we need to keep fields for both sent and received? What we’re really interested is the latency. We need to know when a packet was sent, only up until we know when it was received, at that point, the data we want to keep is received - sent, so why don’t we make it a tagged union? Not bad, we’ve shaved off an entire page. We can still do better. Nanosecond precision? In our case, ping times are measured in the tens or hundreds, or even thousands of milliseconds. We don’t need to keep all of those extra bits around. If we change the unit from nanosecond to 100 microsecond increments (0.1ms), then 43-bits is sufficient for us to keep track of pings for up to 20-years1. 20-years is a bit excessive still, but it doesn’t hurt to be at least a little bit future proof. And received? 8-bit for a true/false value seems altogether too much. The answer: bitfields. Wait, what? Why haven’t we saved any space? The answer is struct padding. The layout of ping_timestamp_2 looks like this: Where the padding byte at the end is to ensure alignment requirements. ping_timestamp_3 on the other end, looks like this: So our optimization there didn’t actually save any space. We’re wasting 36-bits of padding. Is there any way we can somehow do better? We keep track of the source address due to frequent changes while our product is in operation (on a mobile data network). When the address changes, we also reset the sequence number for reasons that aren’t relevant to the current topic. We have seen, in the past, packets with differing source addreses but identical sequence numbers due to be processed by our application at the same time (the joys of asynchronous programming), so the source address serves to disambiguate these changes. But there’s another way to disambiguate. An ICMP echo request has a 16-bit long identifier field to allow applications to identify which echo request packets were sent by them. Its value is completely arbitray. On Linux iputils ping sets it to getpid() & 0xFFFF; on OpenBSD a random number is used instead. Although it’s 16-bits long, we don’t actually need to use the full 16-bits. There’s 4 free bits left in the first 8-bytes of our ping_timestamp_3. Our thought was to use a rolling 4-bit counter, that is increased whenever our source address changes (this is monitored elsewhere in the application), allowing us to uniquely identify2 which source address the packet came from. Much better. A whole 8-kilobytes of savings, and down to a single page of data. You may have noticed that I have changed the order of the fields slightly. This is to line seq_no up on a 16-bit boundary, so that loading it is a single ldrh instruction rather than require a shift. Similarly, reading from elapsed_or_sent_ts only requires a mask. In the end, this was a completely pointless exercise. Our application isn’t remotely memory constrained. I realized there’s a way to “optimize” this slightly further. By switching the order of the received/counter fields, accessing the received bit only requires a shift instruction rather than a shift and a mask: There’s a slight “issue”3 with the above code: received is now much cheaper to access, at the expense of counter needing to mask out the received bit. But we can fix this! We only ever read counter when received is true, i.e. 1. If received were zero, and we could tell the compiler to assume that it were zero, then no mask would be necessary. The solution? Flip the meaning of the received bit. Now, if the read of counter only ever happens inside of a conditional that checks if not_received is zero, then the compiler is able to completely elide the mask. The timestamps are taken from the linux kernel’s monotonic clock, which measures time elapsed since boot. If we were measuring from the Unix epoch, then we would need 51-bits.↩︎ As long the IP address doesn’t change more than 16-times in the period we’re monitoring, which is not something we have ever seen.↩︎ I’m using that term loosely, we haven’t even benchmarked anything.↩︎
Real risks and production mitigations
This work is licensed under a Creative Commons Attribution-NonCommercial 2.5 License. This means you're free to copy and share these comics (but not to sell them). More details.
https://arxiv.org/abs/2606.06139 https://youtu.be/DHiVz34QYlw We present MotionDisco, a framework that discovers contact-rich, long-horizon humanoid loco-manipulation motions from scratch, without relying on teleoperation or motion retargeting from human demonstrations. This is challenging because the space of possible contact interactions grows combinatorially with the task horizon and the number of objects in the scene. submitted by /u/Worldly_Evidence9113 [link] [Kommentare]
Klarna CMO David Sandström said he's building a team of "marketing engineers" but worries about AI taking the jobs of middle-aged generalists.
Another week of robotics marketing loops versus harsh field realities. In this week's breakdown, we are looking past investor decks to audit the actual friction of automating physical labor. Here is what we are covering in this episode: Figure’s 55/Week Ramp-Up: Production is accelerating, but commercial use cases are still in continuous development. Is scaling ahead of general application a massive capital gamble, or does their package-sorting livestream prove they're ready for structured work? Verobotics at NVIDIA Campus: A massive 100,000 sq ft facade deployment that ended up in a strict 60/40 operational compromise with human window washing crews because of live construction site dust. The 8.1B Parameter Bottleneck: Looking at RLWRLD’s new RLDX-1 model. Why graph optimization and real-time memory bandwidth constraints—not raw compute power—are the real bottlenecks for dexterous robotic hands. Spot's Purely Visual Blind Spots: Boston Dynamics paired Spot with DeepMind’s Gemini 1.6. What a sideways-crushed soda can proves about semantic reasoning models running without tactile force integration. FANUC x Google: Industrial giants bringing physical AI to factory floors, but keeping implementation highly conservative. submitted by /u/ButterscotchTiny1114 [link] [Kommentare]
A small, reverse-engineered menu bar app that drives per-key RGB on Razer keyboards on macOS. Backgrounds free; effects keep the lights on for the person who built it.
I tested the top 100 Rust crates on crates.io for backwards compatibility. Then I removed every dependency from the TigerBeetle Rust client and backported it to Rust 1.39, from 2019.
BGP is vulnerable to routing hijacks and path leaks that negatively impact traffic on the Internet. RPKI helps solve some of these problems, but for some forged paths, we need to rely on a simpler mechanism: First AS enforcement in BGP.