Dynamixel Servo for “Schottel” Type Marine Thruster

Hi,

I am currently designing/building a “Rotortug”-type marine robot. It is moved around by 3 “Schottel” type thrusters, which can be continuously rotated over a full 360+° degree range.

For manual mode, a standard R/C transmitter should be used to control the thrusters directly, like the thrusters in this video (between 0:45-1:15):

I am planning for Dynamixel servos (especially the XL430-250T) since they are advertised as being “multi-turn” capable, which sonds quite good, but I am looking more for a “endless-turn” type of capability. I have already connected ROS to the R/C receiver and can receive the stick positions.

I am actually looking through the SDK (I do my coding in C++) , but I am not sure if the “endless-turn” capability I need is already in there (it seems to be something like multi-turn, but no quite it).

Is it possible to use Dynamixel XL’s in this fashion?`

Thanks in advance, any help is appreciated…

Kai

Hello @WaldoPepper, thank you for your post and welcome to our Community Page. Based on your description I should be able to provide some clarification that can be of assistance:

The DYNAMIXEL XL430-W250-T supports an “endless turn” capability in a number of its operating modes. Velocity Control Mode is the most common “endless turn” mode where the DYNAMIXEL accepts a Goal Velocity command to define the speed at which to turn. In addition, PWM Control Mode also offers endless turn functionality, but changes the desired input parameter for the DYNAMIXEL to begin movement (PWM Control Mode uses “Goal PWM”).

It should be possible to operate the units in this way using the DYNAMIXEL SDK or ROS, however my personal experience with custom programming is limited. For additional assistance with this, allow me to refer to some of our other Community members. @Yogurt_Man and @willson, can you possibly share more information about using Velocity Control Mode with the DYNAMIXEL SDK in this application?

As @Jonathon said that, you can use Velocity Mode if you are looking for the Endless Turn.

But literally this only controls velocity in motion. It may not reach certain position by given command merely using this mode. In this case, you could try PWM Control Mode, and build external controller for loop control (Such as gain controller). As DYNAMIXEL features information feedback via form of a packet (Networking with device), you could use this approach to reach certain position in regulating PWM (aka - a voltage control) in PWM Control Mode.

Hi @WaldoPepper

Thanks for the video link for more details. It really helps to fully understand what you are trying to accomplish.

For your specific application, using the Clear instruction will be the easiest way.
The Clear instruction basically resets the rotational count.

For example, when setting DYNAMIXEL to Extended Position Control mode, and let’s say that we set the Goal Position to 5000 which is 4096 (1 rotation) + 904 position.

If you send the Clear instruction while the DYNAMIXEL is in stationary(stopped) condition, it will clear the 1 rotation info and leaving the 904 value only for the Present Position.

Since the controller doesn’t seem rotating the thruster module all the time, you should be able to find a right timing to send this Clear instruction.

However, it is not recommended to clear the information when DYNAMIXEL is near the 0 or 4096 position as there could be a few fluctuation of the position value due to the external condition such as current of the water.

Thanks!

1 Like

Thank you all for the replies and the thoughts and ideas you shared. In the meantime I got hold of a XL430-250T and I am on backorder for a U2D2 (and a OpenCM9, just in case :wink:

I prepared a ROS node for the thruster steering, which subscribes to a topic of Azimut/Thrust values coming from a stick of the R/C transmitter, so exactly like in the video above I will be able to “point” the truster in a direction and control the thrust it propelles into that direction as soon as the code connecting the Dynamixel works.

As soon as my controller arrives I will implemented the ideas you mentioned and let you know, how it went… :wink:

1 Like

@WaldoPepper
Must be amazing project,

Hope your project is going good.

If this is hobby project, I believe the ROBOTIS can share your content through their SNS.

You can contact contactus2@robotis.com

Good day,

…while waiting for the U2D2 I 3D-printed a test stand, to kill some waiting time :wink:

PXL_20210924_100047370_small

As soon as the controller arrives I will start testing, I will keep you updated.

The U2D2 (together with the Power Hub) arrived and my thruster moved for the first time:

(Hint: it may seem that the thruster moves in the wrong direction, but since it’s of the “pusher” type the pointy end of the pod has to point to where the stick is moved)

Moving the thruster with the Dynamixel SDK was, up to this point, easy but I have yet to tackle the problem of the servo “winding-up” in multi-turn mode. I first made the mistake of not “clear”-ing the servo before reconnecting. After playing around for some time I disconnected and then when reconnecting and sending a 0° goal position, the thruster “unwound” ~10 revolutions.

Next step: Resetting to absolute angles after some turns…

1 Like

Awesome!
Thanks for sharing the progress.
You can simply switch the direction of rotation by configuring the Drive Mode.

Please note that very recently the X series firmware had been updated with a few new features that are extremely helpful.

EEPROM / RAM data back up.

Fast Sync / Bulk read when using multiple DYNAMIXEL (faster than the original sync / bulk read)

ID inspection when using multiple DYNAMIXEL

2 Likes

Ok, I solved it…well, sort of :wink:

Thanks to all the input, especially from @willson regarding the “Clear” instruction which helped me finding the “clearMultiTurn” method in the SDK, I built something that works.

I used this as a guideline and implemented a solution, which, after some turns wound up, clears the Present Position value to an absolute value within one rotation (0-4095).

But: as @willson pointed out, the “Clear” instruction can only be sent after the servo motion is stopped. To achieve this, the code mentioned above introduces a small (~300ms) delay before sending the “clear”.

Since my Rotortug will eventually support a mode which in nautical terms is called “Dynamic Positioning”, where it maintains position and heading by means of the thrusters based on the signals of an IMU and a RTK-GPS, the thrusters will be in almost constant motion. The delay let the thruster “hesitate” a moment, which is not that dramatic, but I consider this a technical debt I would prefer to avoid and this is where the “…sort of…” is footed.

If I could wish for something, I would love to see the ability to “point” the servo in a direction being part of the firmware, maybe a dedicated “Drive Mode” or a flag in the “Position Goal” in terms of “move to new position in direction of smallest angle difference”.

Next steps: integrate the thruster into a fiberglass hull with two siblings, which is fun of a different kind, so I mark this thread “Solved” :wink:

2 Likes

Thanks for the updates and glad to hear that the Clear instruction helps you to move forward.

Since Extended Position Control mode supports from -256 to +256 revolution(512 total), you might want to Clear the rotation when it gets higher than something like +250 or lower than -250.
It could be less likely that the 250 rotation will occur during a voyage unless the system intentionally keeps rotating the thrusters for some reason.

I think in this way you can minimize the frequency of delays that could occur during the Clear instruction.

Thank you for the feedback suggesting a new operating mode :slight_smile:
I’ll relay this to the dev team for future updates and product development.

Best Regards,
Will

Hi I´m doing almost the exact same thing and I have to ask if you have made any new progress with your setup? The only thing that is different in my project is that I´m going to send the commands over EPS-NOW protocol and take the value from a AS5600 in a lever and transfer to the servo.