ROS小车上电不启动的原因

文章目录


前言

最近在学习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

总结

小车上电不启动,有可能是电调的问题,电调损坏使电流过大,烧坏电机,如果不是电调的问题可能就是小车速度不够,以上就是本次的全部分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值