前言
最近在学习ROS智能车,遇到了许多问题,写博客记录一下错误,同时帮助后来人,更好的上手
一、电调
ROS智能车的电调极易损坏,所有有可能时电调损坏导致小车无法运动,下面介绍一些与电调有关的知识。
1. 电调的作用
电调的作用就是将单片机控制板的PWM控制信号转变为电流信号,以控制电机的转速。因为电机的电流是很大的,通常每个电机正常工作时,平均有3A左右的电流,如果没有电调的存在,单片机控制板根本无法承受这样大的电流(另外也没驱动无刷电机的功能)。
简单说电调就是用来驱动电机的模块,没有电调,就没法驱动起来电机;其次,电调也有很多针对电机的功能。
2. 电调的使用
接线方式如图所示,其中接收机就是智能车里的单片机控制板。
3.电调参数介绍
1.运行模式(Runing Model):
“正转带制车”模式下,车辆只能前进和刹车,但不能倒车,该模式通常用于竞赛。
“正反转带刹车”模式则提供了倒车功能、通常用于训练。"正反转带刹车”模式采用双击式倒车方式,即油门摇杆在第一次从中点区域推至反向区域时,电机只是刹车,不会产生倒车动作;当油门摇杆快速回到中立点区城并第二次推至反向区域时,如果此时电机已停止,则产生倒车动作,如果电机未停止,则不会倒车,仍是刹车,需要再次将油门回到中点并推向反向区,此时如果电机已经停止才会倒车,这样做的目的是防止车辆行驶过程中因多次点削而造成误倒车。
“直接正反转”模式采用单击式倒车方式,即油门摇杆从中点区域推至反向区域时,电机立即产生倒车动作,该模式一般用于攀岩车等特种车辆。
2.拖(Drag Brake)力度:
拖刹是指当油门摇杆从正向区域转入中点区域内时,对电机产生一个微量的刹车力,这样做可以模拟有刷电机的碳刷对电机转子的阻力,适合减速入弯等场合。 (值得注意的是,拖刹会消耗比较多的电量,选择合适的拖刹力度即可)。
3.电池低压保护阈值(Low Voltage Cut-Off):
这项功能主要是防止锂电池过度放电而造成不可恢复的损坏。电调会时刻监视电池电压,一旦电压低于设定的阈值,在3秒内动力输出将逐步降为正常功率的30%,此时车手应立即 靠边退出比赛,以免阻碍赛道上的其他车辆或被后面快车撞到,10秒后动力将完全关闭。当进入电压保护后,电调内红色LED会以 “☆-,☆-,☆-”方式闪烁。
4.启动加速度(Start Mode / Punch):
可根据个人习惯、场地、轮胎抓地特性等条件,选择从1级(“非常柔和”)到9级(“非常劲暴”)等9种启动加速度。本功能可以防止启动时轮胎打滑,并可在竞赛过程中实现弹射追车的效果。此外,使用“7级”—“9级”选项时,对电池的放电能力要求较高,若电池放电能力较差,不能提供瞬时大电流,则反而会影响启动效果。当启动时出现停顿或瞬间失去动力时,则可能是电池放电能力不足引起的,这时需要降低启动加速度,或增大齿轮减速比。
5.最大刹车力度(Brake Force):
电调提供比例式刹车功能,刹车力度的大小和油门摇杆的位置相关,最大刹车力是指油门摇杆处于刹车极限位置时所产生的刹车力。请根据车辆的具体情况及个人的使用习惯,选择合适的最大刹 车力参数。
6.最大倒车力度(Reverse Force):
选择不同的参数值可以产生不同的倒车速度(一般情况下推荐使用比较小的倒车速度,以免因倒车太快而导致失控撞车)。
7.初始刹车力度(Initial Brake Force):
也叫做最小刹车力度,是指在刹车初始位置作用于电机上的刹车力,在它的作用下可以达到类似点刹的效果,默认值是等于拖刹力度,以便形成柔顺的刹车效果。
8.油门中立点区域宽度(NeutralRange):
请根据个人习惯进行调整。
9.进角(Timing):
此选项具有调节马达输出功率的功能,进角越大则马达转速越高、输出功率越大。本电调使用了先进的Boost增压进角技术,在有感模式下,调整进角能够显著地提高马达转速。 请注意: 在增加进角后,应加大车架的减速齿比,并留意马达和电调的温度,以免过温损坏电子设备。
4. 电调参数调整方法
方法一:无编程卡(不推荐,比较麻烦)
需要根据流程图,通过按动电调开关进行参数调整,调整过程较为麻烦,且效率较低,
建议使用下面介绍的方法进行参数调整。
方法二:有编程卡(推荐,但需要买编程卡,50元左右)
使用编程卡调整参数就方便许多,只需要将编程卡和电调的信号线连接,通过按键调整即可。下面是对应VALUE值的参数值。
ITEM对应的就是基本设定项目,VALUE对应的是参数选项。
按键ITEM是切换基本设定项目,VALUE是更改选项值,RESET是初始化全部参数到默认值,也就是下表中黑色的选项,最后设置完成后一定要按OK按键才能设置成功。
<5> 比赛时一般把参数设置为:
运行模式我们选择的是选项2,因为在比赛过程中,经常采用点刹车;拖刹力度调整到了最大,是因为在行驶过程中速度很快,想要过直角和入弯必须很快的吧速度降下来;启动模式也尽力加大,这样加速度会更大;其他参数影响不是很大,可以使用默认参数即可。
一般完成这一步之后,再次上电,电调的风扇转动,电调上的绿灯常亮,说明电调此时正常工作。
二、小车的初始速度
1.racecar_teleop.py
这是小车按键控制文件,下面9个按键是控制键
u i o 左前进 前进 右前进
j k l 左转弯 停止 右转弯
m , . 左后退 倒车 右后退
w键是加速键,s键是减速键,有些车无法倒车,可能是电调没有配置对
#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist
import sys, select, termios, tty
import time
msg = """
Control Your racecar!
Reading from the keyboard and Publishing to Twist!
---------------------------
Moving around:
u i o
j k l
m , .
For Holonomic mode (strafing), hold down the shift key:
---------------------------
U I O
J K L
M < >
space key, k : force stop
w/x: shift the middle pos of throttle by +/- 5 pwm
a/d: shift the middle pos of steering by +/- 2 pwm
CTRL-C to quit
"""
moveBindings = {
'i':(1,0),
'o':(1,-1),
'j':(0,1),
'l':(0,-1),
'u':(1,1),
',':(-1,0),
'.':(-1,-1),
'm':(-1,1),
'I':(1,0),
'O':(1,-1),
'J':(0,1),
'L':(0,-1),
'U':(1,1),
'<':(-1,0),
'>':(-1,-1),
'M':(-1,1),
}
def getKey():
tty.setraw(sys.stdin.fileno())
rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
if rlist:
key = sys.stdin.read(1)
else:
key = ''
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
return key
def vels(speed,turn):
return "currently:\tspeed %s\tturn %s " % (speed,turn)
if __name__=="__main__":
#一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。
#因此 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在 if __name__ == 'main': 下的代码只有在第一种
#况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
settings = termios.tcgetattr(sys.stdin)
rospy.init_node('racecar_teleop') #初始化ROS节点
发布名 消息类型 队列长度
pub = rospy.Publisher('~/car/cmd_vel', Twist, queue_size=5) #创建发布者对象
speed_start_value =10 # can roll
turn_start_value = 60 # max value
speed_mid = 1500
turn_mid = 90
speed_bias = 0
turn_bias = 0
speed_add_once = 5
turn_add_once = 2
control_speed = speed_mid
control_turn = turn_mid
speed_dir = 0
last_speed_dir = 0
last_turn_dir = 0
last_control_speed = control_speed
last_control_turn = control_turn
run = 0
try:
while(1):
key = getKey()
twist = Twist()
if key in moveBindings.keys():
run = 1
#print "key =",key
speed_dir = moveBindings[key][0]
if(speed_dir!=0 and speed_dir + last_speed_dir == 0):#Reverse
control_speed = speed_mid
last_speed_dir = speed_dir
control_turn = turn_mid
#print "Reverse"
else:
if(speed_dir > 0):
control_speed = speed_dir * (speed_start_value + speed_bias) + speed_mid
elif(speed_dir < 0):
control_speed = speed_dir * (speed_start_value + speed_bias) + speed_mid - 140
else:
control_speed = 1500
control_turn = moveBindings[key][1] * (turn_start_value + turn_bias)+ turn_mid
last_speed_dir = speed_dir
#print " "
#print "speed_dir = ",speed_dir
#print "control_speed = ",control_speed
#print "control_turn = ",control_turn
last_control_speed = control_speed
last_control_turn = control_turn
elif key == ' ' or key == 'k' :
speed_dir = -speed_dir #for ESC Forward/Reverse with brake mode
control_speed = last_control_speed * speed_dir
control_turn = turn_mid
run = 0
elif key == 'w' :
speed_bias += speed_add_once
if(speed_bias >= 450):
speed_bias = 450
else:
last_control_speed = last_control_speed+speed_add_once
run = 0
elif key == 's' :
speed_bias -= speed_add_once
last_control_speed = last_control_speed-speed_add_once
if(speed_bias <= 0):
speed_bias = 0
run = 0
elif key == 'a' :
turn_bias += turn_add_once
last_control_turn = last_control_turn+turn_add_once
if(turn_bias >= 80):
turn_bias = 80
run = 0
elif key == 'd' :
turn_bias -= turn_add_once
last_control_turn = last_control_turn-turn_add_once
if(turn_bias <= 0):
turn_bias = 0
run = 0
else:
run = 0
print (vels(control_speed,control_turn))
#print "speed_dir=",speed_dir,"last_speed_dir",last_speed_dir
if(run == 1):
twist.linear.x = control_speed; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn
#print "control_speed =",control_speed
pub.publish(twist)
else:
twist.linear.x = speed_mid; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = turn_mid
pub.publish(twist)
if (key == '\x03'): #for ctrl + c exit
break
except:
print ("error")
finally:
twist = Twist()
twist.linear.x = speed_mid; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = turn_mid
pub.publish(twist)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
2.初始速度与转向
speed_mid是初始速度,1500就是静止,可以按k键加速,再按i键,速度就能加上,s键为减速键。trun代表小车的方向,90代表正前。小车不动,可能是速度不够,导致无法动起来。
speed_mid = 1500
turn_mid = 90
总结
小车上电不启动,有可能是电调的问题,电调损坏使电流过大,烧坏电机,如果不是电调的问题可能就是小车速度不够,以上就是本次的全部分享。