-
Results, conclusions & next steps
11/06/2021 at 23:18 • 0 commentsFirst of all, I am very glad with how this project turned out. The look and finish of this product is certainly of the best I have got so far. I encourage makers, DIYers or just people who like to make stuff, to make neat projects. Not every project deserves this attention to detail, I agree, but after making several -very sketchy- projects, the work put into this one really paid off. The RGCS catches a lot of eyes when brought to the public and many people can't believe this was made at home.
It is functional, I was able to control and visualize data from one robot. I only tested a couple of inputs as of today and for sure have to add more functionality to the robot so as to take better advantage of the versatility of the control station. Deploying is certainly much easier and less sketchy than many other past project.
If I had to mention the greatest upgrade that this project is missing, it's got to be batteries. Making this battery powered was in the spec list since the first day, but for several reasons (space restrictions vs power consumption) I haven't accomplished that. Maybe an external battery supply or just adding batteries inside of it. Another aspect that could be improved is the screen. It is the one I had laying around, but something bigger and brighter (of perhaps with a better sunshade) would have been nice for outdoor use.
This project has been selected as one of the Hackaday Prize 2021 finalists, among the 10 finalists of the Redefine Robots Challenge! Thanks to everyone who has liked and followed the project, I hope it inspires people to make their own stuff and of course remix the Robotics Ground Control Station to suit their needs!
-
Tests: controlling a robot
11/06/2021 at 18:46 • 0 commentsAs previously mentioned, this project was developed along another robot, and would serve as the controller for it. The main goals (at least primary goals) were controlling the robot through a joystick and visualizing a live feed and point cloud generated by the lidar sensor.
I'll leave a couple of videos here.
In this one, I was testing the live feed latency. As you can see this was a vert [not] scientific test. But sometimes you just gotta go with the feel, not only numbers are important!
Here you can see the live feed and Rviz showing the point cloud live.
There is also a video In which I presented a couple of projects and showed the RGCS functioning at the school I attended. It is available over at their Youtube channel. Link to the video here (starts at the right time).
-
Let the integration begin
11/06/2021 at 14:18 • 0 commentsThe first thing I did was checking if the inputs were correctly connected to the Arduino and if it could read them properly. So I installed the Arduino IDE on the Jetson Nano (could have done that on a separate computer) and wrote a sketch to read all the inputs and print them. Then, one by one, I tested each one and checked the values made sense. You can find the Arduino sketch in GitHub repository linked to this project. It is very basic but just in case anyone finds it useful I have uploaded it.
While performing these tests, I actually had a weird behavior show up. When moving the linear sliders, other values changed as well. This wasn't a good sign. It was consistent through both sliders, so I must have done something wrong, I thought. After checking the wiring, I did mess up when soldering. Mixed two cables and connected them in the wrong pins. After disassembly, resoldering and performing the tests again, everything seemed fine.
ROS
Now for the fun part. I have never used ROS until this project and I had a hard time at first trying to understand what ROS does and what it is for. There are a bunch of great tutorials on the internet and I do recommend reading the official ROS Wiki. It is a tool I have been wanting to learn and start using, as it makes robotics development easier, faster and more collaborative, as many people that work on ROS nodes can share their work which should function without problems in many other platforms.
The first thing I wanted to do was make the Jetson receive commands sent by the Arduino. There is already a rosserial node implementation that manages the serial connection and lets a device such as the Arduino publish and subscribe to topics, making this information available in the host computer (Jetson).
The sample application I made was the Arduino publishing a Twist message to the /cmd_vel topic, and used the left joystick for x_vel and z_rot, this would be useful for my robotics platform that was under development.
After uploading the Arduino sketch (also available in the files section), all I had left was running roscore and the python serial node. To visualize if everything was working, I first run a rostopic list, to see that the topic to which the Arduino was publishing was actually there, and the rostopic echo, to visualize the messages being published.
Instead of using the wireless adapters, I decided to go one step at a time, and wire up the RGCS to a network and try to control a robot connected to the same network. I had some network issues and difficulty to communicate the station with the robot. Luckily, there is a great tutorial made by Clearpath Robotics addressing network issues, huge thanks to them!
The robot that I was going to test this with has a Lidar and camera, so wanted to visualize these on the screen. Made a launch file that launches everything in the base station; the python serial node, gstreamer to view the live feed and Rviz to see the real time point cloud generated by the Lidar sensor.
I made a ros package that launches everything and can be found over at the Github linked to this project.
-
Assembly (part 2)
11/06/2021 at 03:18 • 0 commentsSo now that the wiring is sorted out for the bottom stack, let's install those 3d printed connector and missing components!
Prepared the contacts with a bit of solder for easier and faster soldering of the cables. (things can get hot and PLA doesn't like that!) Cables soldered. Doesn't that look neat? Prepped the voltage regulators ready to be placed on the bottom layer of the stack Components placed, You might note the connectors have standoffs to compensate for the large gap in between the mid and bottom layer of the stack. Soldered the connectors and plugged the contacts to the inputs on the Mega, Blue cables were used for analog while green cables for digital signals. Bottom stack ready to be assembled into one piece. There are still some cables that I couldn't run through connectors, but these still got a JST connector for them to be easily un plugged. Don't thee DIY connectors look good though? Connected the front panel and bottom stack together, leaving a towel in between to protect stuff. A nice aspect of the system is that it can be completely removed from the case without disconnecting anything just as you see in this picture! In case you wanted a front view of the bottom stack with the connectors, here you go! Finished RGCS, up and running! Leaving some aesthetic details aside, seems like we are all set to start turning this from a cool prop into a functioning controller! -
3D printed stack connectors
11/05/2021 at 21:24 • 0 commentsAs I explained in the last log, when assembling the bottom stack I realized the cable management was poor between the top and bottom panels. The serviceability and ability to make changes would be limited by such design. At first, I started looking throughout my stuff for any modular connector that could be incorporated to the panels. The main signals to go through these would be the sensor inputs to the Arduino. After going through many ideas, I settled on making my own connectors. Why not some experimentation too? That's part of what this is about!
Maybe this log deserves to be a whole separate project, but the motivation for making these connectors was the RGCS.
I had some 0.2 mm nickel strip for building lithium ion packs, that seemed to make a good contact surface. The tricky part was how would I get to hold the strips in place. So I made a quick design and printed a test.
This looked promising!
I still had to figure out how the strips would be held in place. Due to the size of the strips (and I didn't want to cut them longitudinally) and the limited ability to hold them down firmly, the connectors had a nice gap in between contacts.
Views of the CAD model of the connectors Each connector part (m/f) consists of 3 pieces. A main piece where the contacts are placed, and two plastic strips that are screwed down on top of the nickel to hold it in place. You might get a better idea when seeing assembly pictures.
3d printed M connector and nickel strips cut to length, ready to be assembled. Placed the strips into the cutouts Helped by a scrap 3d printed part that had an angle (anything small enough and with a 90degree angle should work), firmly marked the bends. Placed the 3d printed strip to hold everything in place Inserted the M connector into the F connector just as it was on the previous picture to make the bends naturally with the receiving part. Marked the remaining bends with the tool and secured the strips finally in place. M connector finished! The F connector was assembled in a similar manner. Here you can see the3d printed piece and the strips cut to length. Placed the nickel strips in position and firmly pressed them in with an auxiliary 3d printed tool that had the same width as the M connector. Then marked the bends with the same tool previously used and secured the contacts in place with the plastic 3d prints plastic strips. Mostly finished M and F connectors! The F is missing two plastic strips that were later added for securing the nickel strips in place. -
Assembly
11/05/2021 at 15:29 • 0 commentsFront panel
This stage of the project started with assembling the top (front) panel. Firstly, I pasted the vents and fans. Then screwed the antenna holders to the wifi adapters through the panel. Installed the power switches for each wireless adapter, and then the threaded SMA connectors that receive the antennas. The main display was put into place using 4 screws and the printed frame. The small display was then pasted into place. All the cables that had to go through to the bottom stack were routed through the cable passthrough cutout.
Front panel assembled, back view. You can see (top to bottom) the two cooling fans, power switches for the wireless adapters, the mini display, main display at the middle with its respective controller, the wireless adapters with their yellow frames to the sides, the cooling vents and the SMA antenna connectors.
An interesting comment on the HDMI cable. I wasn't able to find a cable with small connectors and short (~30cm). Of course I had to use the length available, but for the connector issue, I stripped the rubber part that covers the connector housing. The excess cable was then winded around the screen and left behind the front panel instead of winding it and leaving it inside the stack. I consider that leaving it behind the front panel makes better use of space.
Front panel, back view with winded HDMI cable Bottom stack
The bottom stack was made in a top down manner. I started placing the components (screwing and pasting) on the top panel and worked my way down.
Screwing the joysticks assembly Placing the cooling fan Soldering cables to the components Almost finished top panel of the stack (rear view). Here you can see the threaded rods inserted through the holes and the spacers already in place Placed the mid panel and ran the cables through their respective holes. You can see this panel is pretty much similar to the one of the top, except for a couple of holes. Arduino Mega is waiting to be connected. Arduino connected to the inputs. Some 3d printed strips hold the cables in place. The Jetson can also be seen near its definitive location. Everything seemed to be coming out great. Or did it? I really didn't like the look and lack of modularity this bunch of cables brings in. When assembling the stack, there would be quite a handful of cables struggling to go somewhere. I want this to be easily serviceable and this prevents that from happening. If I had to disassemble the stack, I'd have to mark down every cable to know where it was connected. I'm thinking some modular connectors. Maybe can recycle some old IDE connectors? Or maybe make my own?
-
Manufacturing - 3d Printing & Laser cutting
11/05/2021 at 11:41 • 0 commentsThe first step towards building this project was 3d printing the parts at home. I used grey and yellow PLA, with a nozzle of 0.4 mm and layer height of 0.2 mm. The first bunch I printed and assembled looked like this. The RJ45 port is a female-female RJ45 connector which I would connect with a short cable to the Jetson Nano port. The USB hub is an old one I had lying around, I stripped its enclosure, the DC jack connector, and soldered power cables directly to it.
Unluckily, I haven’t documented much of the printing process. Basically, I just printed all the parts and fitted the electronics into them. Some, of course, required modifications to the design and a couple of tries to get the sizing right.
3d printed parts fitted with the electronics In this picture you can see almost every 3d printed part that goes on the panels. Most of them have the elctronics fitted in. The components that aren’t held by screws or nuts were glued into place using some epoxy.
At first, i was going to do the panels in some 3mm mdf wood, as i had previously done with the first version of the Ground Station. After plenty of tests, changing laser intensity, speed and number of passes, i gave up with this material. The fact that it was not too dark probably had a negative effect as well. I was just stuck at this point, thinking about cutting the panels by hand.
My father came to rescue with some 3mm black PVC board which seemed ideal to make this, giving a much better look than the mdf. Would the laser cut through it though? Yes it did. It required some tweaking but after a couple of attempts, everything seemed to b working out. The laser engraver I was using was kind of a supplementary project to this one, I made the engraver so I could build this. Of course, there were a couple more reasons but the fabrication of the RGCS was a great motivation to build the engraver. Cutting quality wasn’t as good because the CNC had its physical limitations (some design flaws) and the PVC tended to melt in some occasions. Due to the worksize of the engraver, I cut each panel by halves. I though the seam could be covered up with something later. Purposely mmade a couple of holes to join the halves with screws and 3d printed parts.
Test fit of the panel cut in two halves. Oh boy that wouldn’t be easily dissimulated. After realizing that this wouldn’t end up looking good and that the joints of the halves would make great weak spots in the panels, I decided to go all in. Stripped down the engraver quite a bit, purchased some longer aluminum tubes, borrowed a belt from my 3d printer and set to cut the panels in one piece each.
Disassembled CNC engraver to be enlarged These panels looked much better. This started to seem like an actual neat product!
First test fit of the panels with the 3d printed pieces Ready to start assembly!
-
The bottom stack
11/04/2021 at 23:01 • 0 commentsMain design considerations
As the name of this log suggests, the design of the bottom section of the case was done in a stack configuration. I previously mentioned that I would avoid modifying the case so that it retains its weatherproof capabilities. The bottom half of it doesn't have anchoring points where the stack can be fixed. As it will have a considerable weight and won't be subject to any weird forces, I opted to leave the stack free. Don't panic. It fits quite snuggly and shouldn't come out unless the case is open and it suffers from a hard fall. While the case is closed, the idea is to make the height just big enough so that the top panel makes contact with the stack and it doesn't move while transporting it.
The stack consists of 3 layers held together by 4 threaded screws. The panel on the top holds the visible components, namely the joysticks, ports, fan, and any I/O. It also has a cutout matching the one on the top panel (lid), for cable routing. The bottom layer hold the Nvidia Jetson Nano, the Arduino Mega2560, power regulating circuits and (as a future upgrade) batteries. The second/middle layer is more of a separating layer that prevents any possible contact between the I/O and components mounted on the bottom layer.
Attention to detail is one of the aspects that characterizes this project. Yes there are quite some aesthetic fails but during the design phase I kept thinking about how everything would be fabricated, and always considering the best way to achieve something neat. The panels were cut using a flimsy CNC laser engraver I built a while back to experiment with brushless motors in CNC projects. Knowing its limitations, I preferred to cut the holes in the panels and cover the cut edges with more precise and clean 3d printed parts. As an example, the vents on the top lid panel could have been made cutting directly the panels, but preferred to cut the holes and 3d print the vents.
Bottom stack panel assembly As far as airflow goes, the fit allows for air to go in through the edges of the stack and is sucked up by the fan placed on the panel.
The joysticks
As simple as this might seem for some, I believe these components deserve their own section. Deciding what to do with the protruding joysticks required a couple of iterations. Let me start off by mentioning that I didn't want to use the so known (Playstation like) half-ball-shaped joysticks. These take the most importance out of every control and need to be comfortable and allow fine control of the robots.
The sticks could have been made removable, but I preferred to make them foldable with a lock mechanism. The whole base pivots on an axle, and a knob let's the be locked in place for when in use. A spring loaded mechanism could have been nice so that when these aren't locked, they stay retracted. As of today, this isn't the case and when the lock isn't on, they can pivot [quite] freely. The lock prevents them from folding when in use, and screws prevent them from exceeding their upright position.
Isometric views of the joysticks folding mechanism The turning lock is held in place by a screw which is fixed to the knob and spins (with a bit of resistance) through the folding tab. The casing is made to [1] prevent anything from getting in the way of the folding mechanism and [2]limit the range of motion of the pivoting tab. Two screws slide though the channel and make contact with the casing on the limits of the displacement range. The yellow stick is actually held in place by the joystick pcb which is not modeled.
-
Front panel design
11/04/2021 at 12:23 • 0 commentsFront panel
Front panel design The main element be mounted on this panel is the screen. For better viewing under hard lighting conditions, I have seen some GCS having a retractable sunshade over the screen. This would have been a nice addition, but adding the complexity of a folding mechanism wasn't in my todo list. I came out with the design of a small, fixed shade that also served as a mounting interface between screen and panel. Due to the print size of the printer I have available, I had to split it into two pieces. The screen was fit into a frame of its own that holds the LCD and the controller, and the panel is sandwiched between the shade and screen frame with 4 screws.
Antennas were placed on this panel for better positioning and a clear, unobstructed view to the robots. I though mounting them at the top of this panel would accomplish this. But leaving these in place wouldn't allow to close the case. So I made supports that store the antennas while transporting. When deploying, one can just remove the antennas and screw them to the SMA connectors.
The two wireless adapters were placed at the sides of the screen, as they are slim and take up little space. I added a power switch for each wireless adapter. These mighty adapters might get hot! Especially the ones I have, do get quite hot to touch in a free environment, so I though inside and enclosure this would be aggravated. That's why I added two fans (probably a bit overkill) and vents to create airflow through the adapters. I printed frames for the fans which are glued with epoxy to the panel, and the vents are fully 3d printed and glued as well.
Back view of the panel. Intended airflow In the back view you can also see the wireless adapters' frames. The panel is sandwiched between the antenna holders and these, that's how they stay in place.
The small 0.96" display was placed at the bottom-center of the panel, below the main screen. It is held in place with some epoxy. Could have used a couple of screws as well. This display serves as support for any information that might be relevant to have all the time. Maybe some info generated by the Arduino itself, or information that could be generated by the Jetson and transmitted to the Arduino to be displayed.
As of now you might be thinking, how would this all be firmly attached to the lid? And what a great question! In my search for a case, I looked for cases that had some kind of anchor points on the lid. This one has 4 plastic cylinder on the lid in which I inserted threaded rods. No perforations needed!
Mounting points for the top panel Finally, the panel has a cutout to make the connections between the top and bottom panel. HDMI cable, power for the screen and wireless adapters and the auxiliary display signals are routed through this cutout.
-
Concept
11/04/2021 at 04:04 • 0 commentsThis project intends to develop a portable, rapid -and easy- deployment controller for robotics. A drone, a rover, a boat, you name it.
The system was designed and built upon a Nvidia Jetson Nano as the main processing unit. It runs ROS for increased modularity and ease of integration. Inputs are handled through an Arduino Mega, and communicated to the computer through a serial connection, using rosserial.
It has a 7" LCD screen I had laying around and two wireless adapters that could work together and allow for different types of antennas to modify coverage, reach and directivity.
As far as controls go, I was looking to implement two joysticks (one could be for platform control and the other one for camera/gimbal control), two linear sliders for control of any continuous variable, 3 rotary potentiometers, 3 lever switches and two pushbuttons. The great thing about this system is that anyone could take the concept and modify the inputs to match the functionality of their robot. I am just adding a bunch of inputs to allow control of multiple robots/scenarios/payloads configurations without the need to modify the controls. The only modifications necessary would be the implementation of the functionality of each input, which should be done via software programming.
The Ethernet port and spare USB ports available on the Jetson were made accessible through extension cords and a USB hub respectively. The users can incorporate the system to a broader network of robotics control or interfacing with other systems is possible through the RJ45. The USB ports allow inserting a flash drive or connecting a mouse and keyboard which could be useful for any modifications or better control of the Jetson.
General considerations
Before starting the design, I had to get the dimensions of the hard case I would put the electronics in. As far as sizing goes, there are plenty of options. I wanted something portable but not too small for the sake of easier integration.
Wanted the components to be mounted inside the case, no external modifications required. Two interior panels fit all the required connectors and interfaces. This means that any antennas or large joysticks had to be made foldable/retractable.
I have seen other projects in which cases are used upside down. The lid is placed on a surface and most components are held inside the bottom half. Think of it as opening a laptop upside down. There are some very neat projects that adopted this format. I wanted to go the classic way though.
Due to the bottom portion of the case being the largest, and the lid having quite a small depth (~3cm), most big components were placed in the former, leaving small components for the lid panel.