Skip to main content

NekoRMD is a Python library for controlling RMD series motors through a CAN interface. It provides a wide range of functions for motor control and monitoring.

Project description

NekoRMD python

NekoRMD is a Python library for controlling RMD series motors through a CAN interface. It provides a wide range of functions for motor control and monitoring.

logo.JPG ~ logo was generated using DALLE 3 ~

TODO

  • Position control
  • Speed control
  • New initialization algorithm (HIGH)
  • Torque control
  • Full telemetry getters support
  • Write tests
  • Translate the documentation into English and Ru
  • Finish writing the remaining commands from the official documentation
  • Publish in pip
  • Many motors support (up to 3) using CAN
  • Many motors support (up to N) using multiple serial CAN devices with command sync
  • Visualization and Web control the motor

Installation

pip install NekoRMD

Configure CAN in your device: https://python-can.readthedocs.io/en/stable/installation.html

API

Each function checks the motor CAN address to ensure it corresponds to the motor being controlled, as well as verifies the command code to confirm that the response was received for the specific command that the function is expecting.

NekoRMD

The basic class for controlling RMD motors through a class object. When initializing in the constructor, it is mandatory to specify the CAN device address parameters and the motor type.

from NekoRMD.MotorType import MotorType
from NekoRMD.NekoRMD import NekoRMD

motor = NekoRMD(address=0x149, motor_type=MotorType.RMD8x_pro)

motor.setup() - Initializes communication with the motor. Establishes a CAN connection with the motor and allows communication with it.

motor.init() - Sends the command to turn on the motor.

Attention! After initializing the motor, it may not respond for 10 seconds! With a high degree of probability, your problems of non-fulfillment of motor commands are solved using time.sleep(10).

Therefore, by default, the motor does not execute the following commands until 10 seconds after initialization. To disable this, execute:

motor.WAIT_AFTER_INIT = False

motor.restart() - Restart the motor.

motor.wait(secunds=5) - # Delay task execution for a specific motor without blocking other motors and receiving data.

Control

motor.control.stop() - Send a command to stop the motor.

motor.contol.freeze() - Send a command to freeze the motor (the motor will hold its position).

motor.contol.unfreeze() - Send a command to unfreeze the motor.

Speed control

motor.control.speed.set_speed(degrees_per_sec) - Send a command to control the motor speed. Sending an argument of 0 will stop the motor.

Position control

set_increment_position(self, max_speed, angle) - Control the incremental position (multi-turn mode).

Parameters:

  • max_speed (int): Maximum speed in RPM.
  • angle (int): Incremental angle in hundredths of a degree.

Example:

motor.control.position.set_increment_position(max_speed=1000, angle=3600)

set_single_turn_position(self, direction, max_speed, angle) - Control the position within a single turn.

Parameters:

  • direction (int): Rotation direction (0x00 - clockwise, 0x01 - counterclockwise).
  • max_speed (int): Maximum speed in RPM.
  • angle (int): Control angle in hundredths of a degree.

Пример:

motor.control.position.set_single_turn_position(0x01, 1000, 3800)

set_absolute_position(self, max_speed, angle) - Control the absolute position (multi-turn mode).

Examples:

  • max_speed (int): Maximum speed in RPM.
  • angle (int): Absolute angle in hundredths of a degree.

Example:

motor.control.position.set_absolute_position(max_speed=1000, angle=7200)

Get the current motor position. Returns timestamp, current_position:

motor.control.position.get_position_data()

Output motor position to the console and logs:

motor.control.position.print_position_data(is_loop=True, subscriber="gRPC-monitor")

Torque control

Send a torque control command with 1 A:

motor.control.Torque.set_current(current = 1.0) # A

Telemetry

Reading acceleration value:

motor.telemetry.read_acceleration()

Reading software version:

motor.telemetry.read_software_version()

return: Software version date.

Reading motor temperature and current torque:

motor.telemetry.read_motor_temperature_and_torque()

return: Dictionary with temperature Temp, torque Iq, speed Speed, and angle Angle.

Reading system error status:

motor.telemetry.read_system_errors()

return: Dictionary with system errors, brake, voltage, and temperature.

Reading motor power:

motor.telemetry.read_motor_power()

Encoder

The RMD 8X Pro motor uses two encoders:

Relative encoder: used to determine the current position within one revolution.

motor.telemetry.print_relative_encoder()

Returns: (encoder_position, encoder_raw_position, encoder_offset)

It is also possible to log and print the encoder values using the method print_relative_encoder(is_loop=False, delay=1).

Absolute encoder: used to track the motor position over several revolutions.

motor.telemetry.get_absolute_encoder()

It is also possible to log and print the encoder values using the method print_absolute_encoder(is_loop=False, delay=1).

PID

Getting the value of the motor's PID parameters:

motor.telemetry.read_pid_params()

This function sends a command to get the current PID parameters of the motor and returns them as a dictionary. The parameters include the proportional (KP) and integral (KI) coefficients for the current loop, speed loop, and position loop.

Returns:
    dict: Dictionary with PID parameters in the format:
        {
            "current_kp": int,
            "current_ki": int,
            "speed_kp": int,
            "speed_ki": int,
            "position_kp": int,
            "position_ki": int
        }
        If the response is incorrect, None is returned.

Print motor PID parameters with repetition option:

motor.telemetry.print_pid_params()

This function calls __print_pid_params to print the current PID parameters of the motor.

If the is_loop parameter is set to True, the function will repeatedly print the parameters with the specified delay.

Args:

  • is_loop (bool): Flag indicating whether to repeat the parameter printout. Default is False.

  • delay (int): Delay between repeated parameter printouts in seconds. Default is 1 second.

Writing PID parameters to motor RAM:

This function sends a command to write the PID parameters to the motor's random access memory (RAM).

Args:
    current_kp (float): Proportional coefficient for the current loop.
    current_ki (float): Integral coefficient for the current loop.
    speed_kp (float): Proportional coefficient for the speed loop.
    speed_ki (float): Integral coefficient for the speed loop.
    position_kp (float): Proportional coefficient for the position loop.
    position_ki (float): Integral coefficient for the position loop.
Returns:
    response: Device response. If the response is incorrect, None is returned.

Writing PID parameters to motor ROM:

This function sends a command to write the PID parameters to the motor's read-only memory (ROM).

Args:
    current_kp (float): Proportional coefficient for the current loop.
    current_ki (float): Integral coefficient for the current loop.
    speed_kp (float): Proportional coefficient for the speed loop.
    speed_ki (float): Integral coefficient for the speed loop.
    position_kp (float): Proportional coefficient for the position loop.
    position_ki (float): Integral coefficient for the position loop.
Returns:
    response: Device response. If the response is incorrect, None is returned.

Logs

STATUS: working on it...

Command description:

The 8 byte CAN command can be converted into a textual description in EN-en and RU-ru languages by calling the methods of the logs class:

motor.logs.decode_motor_message(command)

Response description:

Similarly, for processing and converting motor responses into text format, you can use:

motor.logs.decode_motor_response(response)

Protocol Docs

RMD-X Motor Motion Protocol V3.9-240415.pdf

Another links:

https://github.com/K-Lab-Students/MyActuator-RMD-X8-Pro-firmware

https://github.com/K-Lab-Students/RMD_Cock_Edition

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nekormd-0.2.2.tar.gz (10.5 kB view details)

Uploaded Source

Built Distribution

NekoRMD-0.2.2-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file nekormd-0.2.2.tar.gz.

File metadata

  • Download URL: nekormd-0.2.2.tar.gz
  • Upload date:
  • Size: 10.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.6

File hashes

Hashes for nekormd-0.2.2.tar.gz
Algorithm Hash digest
SHA256 2ee3de4bd4f32656dedf30f7d520a68334a56b85c2795d2e44df990d860292fb
MD5 91ca3b9af82bdff216b7d42154bd2bd4
BLAKE2b-256 7349eff17dd849e6fda578d88179e0663543f3f7842b8c905c059df77b1c5cf7

See more details on using hashes here.

File details

Details for the file NekoRMD-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: NekoRMD-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.6

File hashes

Hashes for NekoRMD-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1add6c116aac4d2760ce93416975cdd54d779d4db5196996f8860ba922eda04b
MD5 78b99b74cd1e8ac78595b0a5aacb9e65
BLAKE2b-256 b1bdcd8687b69f936206ebea5c17501ee466351fcff7de5819f94887c136459d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page