大家好,又见面了,我是你们的朋友全栈君。
版本说明
ODrive 硬件版本: v3.6-56V
ODrive 硬件内部固件版本: fw-v0.5.1
odrivetool 版本: 0.5.1.post0(pip install odrive==0.5.1.post0)
P_brake = V_emf * I_motor
其中 V_emf = motor_rpm / motor_kv
。
确保编码器、电机和 ODrive 之间的接线牢固,接触不良会导致电机振荡或失控
所有非电源 I/O 均为 3.3V 输出,输入耐压 5V
将编码器连接到 J4 端子。A,B相是必需的,Z(索引脉冲)是可选的。 ODrive 的 A,B,Z 输入内部集成了 3.3k 上拉电阻,用于开漏输出型编码器的输入。对于具有弱驱动电流(<4mA)的单端推挽信号,您可能需要自行去掉 ODrive 上的上拉电阻(它们分别对应 M0 的丝印 R12、R13、R14 和对应 M1 的丝印 R9、R10、R11)。
牢记把安全放在首位。在给 ODrive 通电之前考虑一下一旦上电电机立即开始旋转会不会造成什么影响。
odrivetool 是 ODrive 配套的配置和调试软件,请根据您使用的电脑操作系统安装 odrivetool。
C:\Users\YOUR_USERNAME\AppData\Local\Programs\Python\Python36-32\Scripts\pip
替换掉 Python 2 中的 pip。cmd
Enter
pip install odrive==0.5.1.post0
Enter,进行 odrivetool v0.5.1 的安装。
ODrive 3.x Native Interface (Interface 2)
。
我们将在 Terminal 中运行以下命令进行安装。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install python
Error: python 2.7.14_2 is already installed
通过以下命令进行升级:brew upgrade python
brew install libusb
pip3 install odrive
常见问题:
sudo pip install odrive==0.5.1.post0
sudo pip3 install module_name
然后再次尝试第5步。
sudo apt install python3 python3-pip
Enter)。
如果安装过程中出现 (Ex. “E:Package ‘python3-pip’ has no installation candidate”),在命令终端中输入 sudo apt update
Enter。
sudo pip3 install odrive==0.5.1.post0
Enter。
~/.local/bin
添加到系统环境变量中(如在Ubuntu系统,在命令终端中输入 sudo gedit ~/.bashrc
Enter,在文件末尾另起一行添加 export PATH=$PATH:~/.local/bin
然后保存文件,关闭并重新打开终端使新的环境变量生效)。
在命令终端中输入 odrivetool
Enter,启动 odrivetool
。 通过 usb 连接 ODrive 然后等待 odrivetool 发现它。 然后就可以输入指令和 ODrive 交互了。例如:可以输入 odrv0.vbus_voltage
Enter 来查看当前供电电压。
它看起来应该像这样:
ODrive control utility v0.5.1.post0
Website: https://odriverobotics.com/
Docs: https://docs.odriverobotics.com/
Forums: https://discourse.odriverobotics.com/
Discord: https://discord.gg/k3ZZ3mS
Github: https://github.com/madcowswe/ODrive/
Please connect your ODrive.
You can also type help() or quit().
Connected to ODrive 208136905753 as odrv0
In [1]: odrv0.vbus_voltage
Out[1]: 35.8963623046875
常见问题:
更多有关 odrivetool 的介绍可以参考 odrivetool入门指南。
仔细阅读本节内容,否则有可能弄坏一些东西
怎样设置限制值?
上一个步骤我们已经启动了 odrivetool
。您可以直接输入变量名称进行设置。
例如:设置M0的限制电流为10A您可以输入 odrv0.axis0.motor.config.current_lim = 10
Enter
电机电流限制
odrv0.axis0.motor.config.current_lim
单位为 [A]
出于安全考虑,ODrive固件内部默认电流限制设置为10A。 这是相当小的,但是对于初次调试驱动器是有好处的。 配置完 ODrive 后,可以将其增加到60A以提高性能。 请注意:重新设置电流限制值后需要重新设置电流采样范围(odrv0.axis0.motor.config.requested_current_range
)。 例如:配置 M0上的电流采样范围为 90A:odrv0.axis0.motor.config.requested_current_range = 90
Enter ,然后保存配置并重新启动 ODrive 以生效,因为 ODrive 仅在启动时才会将电流采样运放增益写入DRV(MOSFET 驱动器)。
注意: 电机电流和从电源汲取的电流通常不相同。 您不应该查看电源电流以了解电机电流的状况。为什么电机电流和电源电流不同呢?详情请参考 为什么无刷电机电流和电源电流不同。
电机校准电流限制值
您可以将odrv0.axis0.motor.config.calibration_current
更改为您感到合适的值,即在电机校准时连续流过电机的电流大小。 如果您使用的是小功率电机(即15A额定电流),则可能需要将此值适当调小。
电机转速限制值
odrv0.axis0.controller.config.vel_limit
单位为 [turn/s]。
电机将被限制为该转速,电机转速超过此值将报错。 同样,默认值很低,需要您根据您的应用调整到合适大小。
odrv0.config.brake_resistance
这是功率耗散电阻的电阻值,单位为 [Ohm]。 如果您不使用它,则可以将其设置为0
。 请注意,您的接线和螺钉端子中可能会有一些额外的电阻,因此,如果使用时遇到问题,则可能需要将此参数在功率耗散电阻阻值的基础上增加约0.05欧姆。
odrv0.axis0.motor.config.pole_pairs
这是永磁电机中的磁极对数(磁钢个数除以2)。 如果可以看到的磁钢您可以简单地数一下数量然后除以2。注意: 不是定子中的线圈的数量
如果看不到它们,请尝试用手拿着一块磁铁在转子上滑动,并计算其停顿的次数,这将是 磁极对数。 如果使用磁性金属片而非磁铁,则会得到 磁极数。
还有一种方法是,使用有电流限制功能的电源,将输出电流限制为2A,将正负极接到无刷电机三根线中的任意两根,然后用手转动电机轴一圈,感受停顿的次数,停顿的次数即为磁极对数。如果用手转动时感受不到停顿或者停顿不明显,请适当调高电源输出电流,如果用手转动比较困难则适当调低电源输出电流。
odrv0.axis0.motor.config.motor_type
这是使用的电机类型。 当前支持两种类型的电机:大电流电机(MOTOR_TYPE_HIGH_CURRENT
)和云台电机(MOTOR_TYPE_GIMBAL
)。
我该选择哪种电机类型
如果您使用的是常规的无刷电机,类似下图:
您应该设置电机类型为 MOTOR_TYPE_HIGH_CURRENT
对于小电流的云台无刷电机,类似下图:
您应该设置电机类型为 MOTOR_TYPE_GIMBAL
注意:不要把非小电流云台电机配置为 MOTOR_TYPE_GIMBAL
,这样可能会使电机或 ODrive 过热。
更多细节:
如果100毫安的电流噪声对您来说“很小”,则可以选择 MOTOR_TYPE_HIGH_CURRENT
。
如果100毫安的电流噪声对您来说“很大”,并且您的应用不需要电机快速旋转(Ω* L << R),并且电机的相电阻相当大(1 ohm或更大),则应当选择MOTOR_TYPE_GIMBAL
。
如果100毫安的电流噪声对您来说“很大”,并且您的应用需要电机高速旋转,则需要更换 ODrive 上的电流采样电阻为更大值,使之能采集到相对较低的电流。
注意: 使用云台电机时,current_lim
和calibration_current
实际上是“电压极限”和“校准电压”,因为我们不使用电流反馈。 这意味着如果将其设置为10,则这个参数将被设置为10V。
如果使用编码器
odrv0.axis0.encoder.config.cpr
编码器每转计数 [CPR]
这是每转产生的脉冲数(PPR)值的4倍,通常,这在编码器的手册中会有说明。
如果不使用编码器
您可以将所有带有 .config 的参数保存到 ODrive 内部 FLASH 中,以便 ODrive 在重启后配置的参数仍然有效。
odrv0.save_configuration()
Enter让电机0启动并运行。 电机1的操作步骤完全相同,只需要在axis0
的地方替换axis1
即可。
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
Enter。大约2秒钟后,应听到电机发出哔声。 然后电机将在一个方向上缓慢旋转几秒钟,然后在另一方向上缓慢旋转几秒钟。
这个过程是在做什么?
ODrive 首先测量电机的电气特性(即电机相电阻和相电感),然后进行编码器偏移校准。此视频演示了此过程。
注意:在启动过程中,必须允许转子旋转而且不能有偏载。 这意味着载荷均匀和较弱的摩擦载荷才行,重载或类似弹簧载荷不行。
无法正常工作?
检查编码器接线,并确保编码器已牢固连接至 ODrive。参考故障排除查看具体的错误信息。一旦理解了错误并解决了问题,就可以执行 odrv0.axis0.error = 0
Enter 来清除 M0 上的错误,然后重试即可。odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
Enter。此时 ODrive 将保持电机转子的位置。如果用手去扭动电机轴,电机会试图阻止转子被扭动,您可以调高odrv0.axis0.motor.config.current_lim
,这样电机将能提供更大的扭力去对抗您的旋转。如果电机进入闭环运行后开始抖动,或在您用手去扭动电机轴后开始抖动,您需要降低控制器增益。odrv0.axis0.controller.input_pos = 10
Enter。单位为 [转],可以为小数,如 input_pos = 0.5,则电机正向转动到180°机械角度。默认控制模式是直接位置控制。您可能会希望使用轨迹控制模式,或者您希望使用环形位置控制模式,以此达到持续向一个方向旋转而不需要持续增大位置的设定值。
您也许希望使用速度控制模式(直接设置转速或者使用速度爬升机制使转速以设定加速度达到设定转速).
您也可以直接控制电机电流,电机电流与转矩成比例。
当使用直接位置控制时由于输入的位置值直接赋予到 ODrive 中,所以运转会不够平顺。即使使用外部控制器生成好的轨迹位置,当外部控制器以一定频率向 ODrive 发送位置指令时某些状态下还是会不够平滑。这时候使用平滑位置控制模式会是不错的选择,推荐将输入滤波带宽设置为位置指令发送频率的一半。
您可以配置 ODrive 的平滑位置控制模式中的二阶滤波参数。
配置滤波带宽:axis.controller.config.input_filter_bandwidth = 2.0
[1/s]
配置平滑位置控制模式生效:axis.controller.config.input_mode = INPUT_MODE_POS_FILTER
现在您可以继续使用指令 axis.controller.input_pos = 1
[turns],来平滑的进行位置控制了。
上图为由位置1000到0输入的阶跃响应,滤波器带宽为1.0 [/ sec]。
此模式使您可以平滑地使电机旋转,从一个位置加速,匀速和减速到另一位置。 使用位置控制时,控制器只是试图尽可能快地到达设定点。 使用轨迹控制模式可以使您更灵活地调整反馈增益,以消除干扰,同时保持平稳的运动。
上图中蓝色曲线表示位置,橙色曲线表示转速。
<odrv>.<axis>.trap_traj.config.vel_limit = <Float>
<odrv>.<axis>.trap_traj.config.accel_limit = <Float>
<odrv>.<axis>.trap_traj.config.decel_limit = <Float>
<odrv>.<axis>.controller.config.inertia = <Float>
vel_limit
最大速度,即上图中匀速阶段的转速
accel_limit
最大加速度,以 [turns/ sec^2] 为单位
decel_limit
最大反向加速度,以 [turns/ sec^2] 为单位
controller.config.inertia
负载惯量大小,此项和电机负载转矩和加速度相关,默认为 0。设置为 0 即忽略此项影响,但是如果将此项调整到合适的值可以改善系统的响应速度,请注意:此项和系统负载相关。
上述四个参数值都应为正数(>= 0)。
请记住,您仍然须像以前一样设置限制值。 建议您将这些值设置为比预设值稍高(> 10%),以赋予控制器足够的冗余。
<odrv>.<axis>.motor.config.current_lim = <Float>
<odrv>.<axis>.controller.config.vel_limit = <Float>
当您配置好轨迹控制的相关参数后,并且当前为位置控制的前提下,只需要将输入模式改为轨迹控制输入即可,如下:
<odrv>.<axis>.controller.config.input_mode = INPUT_MODE_TRAP_TRAJ
然后直接发送位置指令即可:
<odrv>.<axis>.controller.input_pos = <Float>
您还可以使用move_incremental
函数来让电机转动到相对位置。
要相对于当前实际位置设置目标位置,请设置参数from_goal_point = False
。
要设置相对于先前目标位置的目标位置,请设置参数from_goal_point = True
。
<odrv>.<axis>.controller.move_incremental(pos_increment, from_goal_point)
要启用环形位置控制,请设置axis.controller.config.setpoints_in_cpr = True
此模式对于连续的增量位置移动很有用。 例如,机器人轮子会无限期滚动,或者挤出机马达或传送带会以受控的增量无限期地移动。
在常规位置模式下,input_pos
将增长到非常大的值,并且由于浮点舍入而失去精度。
在这种模式下,控制器将尝试仅在电动机旋转一圈之内跟踪位置。 具体而言,input_pos
的范围应为 [0,1) 。 如果input_pos
增加到该范围之外(例如通过step / dir输入),则会自动将其约束到正确的范围内。注意:在此模式下,将使用encoder.pos_circular
作为位置位置反馈,而非encoder.pos_estimate
。
如果尝试以超过turn/2
步的大步幅增加位置,则电机将以相反的方向旋转至相同角度。当输入控制量干扰很大时,也会出现这种情况。 如果您有一个需要处理较大步幅的应用,则可以通过设置 controller.config.circular_setpoints_range = N
来自己决定想要约束的环形范围值。
设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL
现在您就可以使用 axis.controller.vel_setpoint = 5000
[turn/s] 来控制转速了。
设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL
设置转速爬升速度 (加速度): axis.controller.config.vel_ramp_rate = 0.5
[turn/s^2]
配置转速爬升模式生效: axis.controller.config.input_mode = INPUT_MODE_VEL_RAMP
现在您就可以通过 axis.controller.input_vel = 1
[turn/s] 来设置想要爬升到的转速了。
设置 axis.controller.config.control_mode = CONTROL_MODE_TORQUE_CONTROL
现在您就可以通过 axis.controller.input_torque = 0.1
[Nm] 来设置想要电机输出的扭矩了。
注意: 如果电机转速超过您设置的 vel_limit
,电机输出的力矩将会减小。 您可以设置 axis.controller.enable_current_mode_vel_limit = False
来禁止力矩减小。
每个 axis 都有一个可配置的看门狗定时器,如果与 ODrive 的控制连接中断,则可以使电机停止,保证系统安全性。
每个 axis 都有一个可配置的看门狗超时:axis.config.watchdog_timeout
,以秒为单位。 值设置为0
禁用看门狗功能。 大于0的值看门狗将启用,如果没有在设置的时间间隔内喂狗,电机将停止。
您可以使用 axis.watchdog_feed()
来为每个 axis 手动喂狗。
接下来您可以:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146679.html原文链接:https://javaforall.cn