Hi everyone!
I’m Marco from Italy, I’m a roboticist but I’m quite new to ROS: I usually develop manipulation projects using native robotic programming languages (e.g. RAPID and KRL).
I’m creating some new projects using robots from a producer I never used before and since they offer ROS drivers natively I thought to go with it instead of learning yet another language. ROS always fascinated me but I never found the time to brush away some dust from C++ and python studies and dig into it.
Honestly I found quite challenging coming up with a complete project that included motion planning, signals and objects management and logic design, but patching together some great packages I think I’m close to achieving something usable.
Probably this is a very basic project, but I couldn’t find something that covers all the various aspects of programming an industrial robot, so I thought to share it.
I’ll be using it in production within next month, but I still consider it and Alpha version: please be very careful if you try it, its still at an experimental state!
Currently only working in ROS2 HUMBLE!!! Do not try the Jazzy version, it won’t work.
I will be porting to Jazzy as soon as I can, but fist I need to deploy a project in production in March…
The project name is ManyMove, here’s the github link:
ManyMove - github
You can find a description and some instructions in the main readme and some more in the readme of some of the packages.
To sum up what this is:
- ManyMove: a general manipulator framework for ROS2 Humble, MoveIt2, Behavior Trees.
- Aims to standardize I/O, object management, motion planning, etc, to program cobots and industrial robots.
To sum up the structure:
Feedback/Tips needed!
In this repo I tried to use the most basic and generalized functionalities as possible in every package. Here’s some issues I encountered where I could use some tips:
- For now I’m using just OMPL/RRTConnect since it’s fast and versatile. I added some cartesian speed control on every kind of move since the cobots I’m working on would do an emergency stop if the cartesian speed is not respected. I noticed that OMPL is fast but takes some tries to get a trajectory close to the optimal, so I implemented a mechanism to get a number of valid plans and then choose the shortest in a mix of cartesian and joint distance. This is still faster than CHOMP most of the time in moveitcpp, but I have to admit that I still have to dig deeper on both CHOMP and PILZ planner. About the Pilz planner: I tried to avoid it because I think in the future most of the projects will be based on vision systems and AI, and I didn’t want to use a deterministic planner like Pilz. I still like it since it’s similar to how I’m used to program robots, and implementing it may mean I need to add some complexity to the project. On the other hand, it permits to chain together several PTP, LIN and CIRC moves without stopping between each move, which is often important to achieve optimal cycle times. So, versatility vs efficiency:
What planner would you experiment on in a project like this? - In manymove_planner I implemented a version for move_group and one for moveit_cpp. The first one is more complete but is slower when used on the real robot, probably due to the messages going through the Ethernet network. In simulation the performance is just a bit slower, but on real robot is hardly usable. I still have to tweak the network settings, any suggestion on how to do it? Is this solvable or do I have to factor a much slower speed when using move_group?
- The moveit_cpp is faster both in simulation and with real robots, but it seems to freeze the planning scene while the robot is moving. This wouldn’t be a huge problem since the project doesn’t require a dynamic scene, but in the future it will. Moreover, when I have 2 robots moving one of them can lose some little detail, for example if an object is attached to it while the other robot is moving. Not fun. I didn’t find a way to force the moveitcpp’s internal planning scene to update. I was thinking about running both move_group and moveitcpp and to use the scene from move_group just to check for collisions, but it seems to add unnecessary overhead. I can give instructions on how to reproduce the problem in the examples in the repo. Any suggestion on how to solve this?
Sorry for the long post, I’ve been designing this alone and I wanted to be at least close to usable before sharing, I would have hundreds of questions, design choices to discuss and possible new features to implement!
Please keep in mind that this is highly experimental, be very careful if you try it on a real robot!!
Also consider that I’ll be updating it very frequently until the first complete project is live, possibly in March, and I may also make very deep changes to it.
PS: the BT repo using py_trees is just drafted right now, I’m planning to complete it once I have some time!