基于 ROS 的 Donkey Car 远程控制

引言

这次我们要实现的功能是用 g29 方向盘远程控制 Donkey Car 小车运动。

整个系统包括小车平台和 PC 端两部分:

  • 小车平台上的设置
    1. 安装 raspbian 操作系统
    2. 安装 ROS
    3. 安装 Donkey Car 相关的 ROS package
  • PC 端的设置
    1. 安装 ROS
    2. 编写程序提取 g29 方向盘控制命令并发布到 ROS topic 上

基于以上两个平台,设置它们之间的 ROS 通讯,就可以实现远程控制。

下边是具体操作步骤。

小车平台上的安装

虽然可以 ssh 到小车上进行远程设置,但是还是强烈推荐连接上显示器、鼠标、键盘,将 raspberry pi 板子当作一个普通的电脑主机使用,操作起来要方便很多。

以下的安装步骤都是假设已经给 raspberry pi 外接了显示器、鼠标和键盘。我们用的是 raspberry pi 3B+ 。

安装 raspbian 操作系统

第一步是将 sd 卡创建成一个系统启动盘。步骤如下:

  • 下载 raspbian 操作系统镜像
    目前 raspberry pi 官网提供了最新的 raspbian 版本 buster 。但是出于兼容性方面的考虑,我们选择用不那么新的 stretch 版本。
    下载地址 http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2019-04-09/
    只需要下载那个 1.9 G 的压缩文件即可。
  • 创建启动盘
    官网提供了非常详细的安装说明。也可以参考这里,通过命令行的形式烧录和备份镜像文件。如果不习惯用命令行方式,推荐用 Etcher 。
  • 最后的安装
    有了 sd 卡启动盘,插到 raspberry pi 板子上。通电启动就会进入系统安装界面,跟普通的 ubuntu 系统安装流程类似,不再赘述。

从 sd 卡启动是树莓派的标配,不过也可以从 USB 盘启动。基本方法也是通过 Etcher 将系统镜像文件写入 USB 盘。具体操作可以参考这里。对于最新版的树莓派 3B+,启动的时候只需要 USB 盘,对于旧版的树莓派,还需要 sd 卡做一下引导。
用 USB 做系统盘的好处是存储容量可能比 sd 卡大一些,缺点是暴露在外边,不小心碰到了就可能直接关机了。

安装 ROS

在 raspbian 上安装 ROS 跟 ubuntu 有点区别。raspbian 系统中没有现成的已编译好的 ROS debian package,所以不能简单地用 apt install ros-kinetic-desktop-full 之类的命令安装。我们有两个选择:

  • 从源码编译
  • 直接用别人分享的 raspbian + ROS 镜像文件

这里我用了源码编译的方式。具体流程如官网所示. 这里不再赘述。

在安装过程中有几个问题需要注意

  1. 注意 raspbian 的版本,不同的版本安装命令有些区别。我们用的是 stretch 版本。
  2. 在最后进行如下编译时sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic 默认编译参数是 -j4 。我们在编译时系统完全卡死。尽管 raspberry pi 板子是 quad-core 的,但整体计算能力还是比较低。为了避免编译死机,可以添加参数 -j2,如果还死机,用 -j1,最终的编译命令为sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 # 或 -j1
  3. 设置完这一步就可以结束了echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc 后边的步骤不需要。

根据我们的经验,整个源码安装过程至少 3 个小时 (用了参数 -j1)。

安装 Donkey Car 相关的 ROS package

本项目用到的 package 都在这里。实际上我们只需要其中两个 package: donkey_car 和 ros-i2cpwmboard

只要前一步的 ROS 编译过程没有问题,后边在使用 ROS 时跟普通 ubuntu 上是完全一样的。
基本步骤是创建一个 workspace,把上述两个 package 放进去, catkin_make 编译一下,就可以了。

在编译 ros-i2cpwmboard 时如果出现如下错误

‘i2c_smbus_write_byte_data’ was not declared in this scop

则需要额外安装一个 i2c 工具包

sudo apt-get install libi2c-dev

以上所有流程结束之后可以测试一下:

roslaunch donkey_car keyboard_demo.launch

通过 rqt_graph 可以看到一个 topic /cmd_vel ,此时只要向该 topic 发送控制命令,就可以驱动小车移动了。可以在命令行用rostopic pub 命令向 /cmd_vel 发送数据测试一下。

这里可能有个问题,运行上述 roslaunch 命令之后,在没有任何 topic 信息输入的情况下,车轮的角度可能会偏向一边,而不是朝向正前方。这是因为 donkey_car/src/low_level_control.py 这个文件中设置的参数跟实际小车不太匹配。这个文件中默认 center_value 的 pwm 值为 333,我们的小车设置为 300 时车轮才会朝前。具体搜索 pwm 值的过程可以参考这里

下一步我们就在 PC 端将 g29 方向盘的操作发布到该 topic 上。

PC 端安装

安装 ROS

PC 端的 ROS 安装比较中规中矩,按照官网步骤安装即可。对于我们这个项目,安装 desktop 就足够了,不需要 desktop-full。当然,安装 desktop-full 肯定也是没有问题的。

转换 g29 操作指令到 ros topic

我们这里用 Node.js 与 g29 通讯,Node.js 既可以提取 g29 的操作输入 (方向盘转角、踏板),也可以反向控制 g29 方向盘。关于反向控制的部分,可以参考我们之前的文章

下面我们要基于 Node.js 编写 ROS node 文件 g29_pub.js,实现 g29 控制命令的提取:

#!/usr/bin/env node

'use strict';

const rosnodejs = require('rosnodejs');
const g = require('logitech-g29');

const Twist = rosnodejs.require('geometry_msgs').msg.Twist;

const options = {
  autocenter: true, 
  debug: false,
  range: 900
}

const wheel = {
  currentPos: 0, 
  moveToPos: 0,  
  moved: true
}

var connected = false;
// once g29 is connected, run this function
    g.connect(options, function() {
    connected = true;
    g.forceFriction(0.4);
})

function g29_pub_node() {
    rosnodejs.initNode('/g29_pub')
    .then((rosNode) => {
        if (!connected)
        return; 
        var pub = rosNode.advertise('/cmd_vel', Twist);
        const msg = new Twist();
        g.on('wheel-turn', function(val){
            msg.angular.z = -(val-50.0)/50.0;    # 可以按照实际需要,将 g29 转角转换成小车的转角
            pub.publish(msg);
        })
        g.on('pedals-gas', function(val){
            msg.linear.x = val * 5;  # 可根据需要修改
            pub.publish(msg);
        })
        g.on('pedals-brake', function(val){
            msg.linear.x = val * - 5;   # 可根据需要修改
            pub.publish(msg);
        })
    })
}


if (require.main === module) {
    // Invoke Main Function
    g29_pub_node();
}

上述命令创建了名了 g29_pub_node 的 ROS node,可以将 g29 的操作转化成 /cmd_vel上的命令。

Donkey Car 与 PC 的连接

有了以上两个平台,现在需要配置 ROS 环境,实现两个平台之间的通讯。假设现在两个平台连接到同一局域网里,互相能 ping 通。

我们选择在 PC 端运行 ROS master, 小车远程连到 PC。

  • PC 平台:
    在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<PC IP addrss> 然后重开 terminal ,启动 ROS,运行刚才编写的 g29_pub.js 文件。这样就设置好了 g29 方向盘到 /cmd_vel 这一部分的连接。可以通过 rostopic echo /cmd_vel 查看一下方向盘转动时是否有数据输出。
  • 小车平台
    类似地,要在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<donkey car IP addrss> export ROS_MASTER_URI=http://<PC IP address>:11311 这里不仅要设置本地 IP,还要设置要远程连接的 ROS master 的 IP。设置好以上内容之后,运行如下命令: roslaunch donkey_car keyboard_demo.launch 这就设置好了从 /cmv_vel 到小车这一部分的连接。

如果一切顺利,应该可以通过 g29 方向盘远程控制 Donkey Car 运行了。

在Unity环境中用强化学习训练Donkey Car

作者:Felix Yu

编译:Bing

Donkey Car是一种为模型车开源的DIY自动驾驶平台,它利用一个带有相机的树莓派单片机,让模型车可在赛道上自动驾驶,Donkey Car会学习你的驾驶方法,在训练后懂得自动驾驶。对于那些没有背景知识的人来说,该平台能提供你所需要的必要细节,它既包含硬件也带有软件。阅读完这一教程,你也可以无需硬件背景知识组装一辆自己的自动驾驶汽车。

现在,训练汽车进行自动驾驶最常见的方法就是行为克隆和路线跟随。在高级层面,行为克隆是利用卷积神经网络学习汽车前方摄像机所拍摄的图像之间的映射,并通过监督学习控制角度和throttle values。而路线跟随是利用计算机视觉技术跟踪路线,并且利用一个PID控制器让小车跟着该路线。我尝试了两种方法,它们都很有用!

用行为克隆训练Donkey Car避开障碍物

用强化学习训练Donkey Car

重要的一点是,Donkey Car的目标是搭建一辆在比赛中跑的最快的车(能以最快速度跑完一圈)。我认为强化学习是训练的好方法,只需设计一种奖励,让汽车的速度达到最快,并且让它能一直保持在轨道内即可。听上去很简单对吧?但事实上,很多研究表示在实体目标上训练强化学习是很困难的。强化学习主要通过试错法训练,放在汽车身上,我们只能保佑车子不会在一次次的实验中撞碎。另外,训练时长也是一个问题,通常,强化学习智能体都要训练个几百回合才能掌握些许规律。所以,强化学习很少用在现实物体中。

模拟现实

最近有一些科学家们研究对现实进行模拟,即先用强化学习在虚拟模拟器上训练小车,然后将其迁移到现实世界里。例如,最近OpenAI就训练了一个灵活的机械手臂,可以做出多种动作,整个过程就是在虚拟中训练的。除此之外,谷歌大脑也曾训练过一个四足机器人,可以用模拟现实的技术学习灵活的动作。在虚拟器中学习控制策略,然后再将其部署到真正的机器人上。这样看来,若想用强化学习训练Donkey Car,一个可行方案就是先用模拟器训练,再把学到的策略用在真的小车上。

OpenAI训练的机械手

Donkey Car模拟器

第一步是先为Donkey Car建造一个高保真度的模拟器。幸运的是,Donkey Car社区里一位爱好者在Unity中创建好了一个模拟器。但是它设计的目的主要针对行为学习(即将相机中的图片保存在对应的控制角度和throttle values文件中以进行监督学习),但是和强化学习无关。我希望的是有一个类似OpenAI Gym那样的交互界面,可以用reset( )重置环境、对其进行操作。所以,我决定在现有的Unity模拟器基础上对其进行修改,让它更适合强化学习。

4.1 创建一种能用Python和Unity沟通的方法

因为我们要用Python书写强化学习代码,所以我们首先要找到一种方法能让Python在Unity环境中使用。结果我发现这现有的模拟器也是用Python代码进行沟通的,但它是通过Websocket协议进行的,Weosocket和HTTP不同,它支持服务器和客户端之间进行双向通信。在我们的案例中,我们的Python“服务器”可以直接向Unity推送信息(方向和油门),而我们的Unity“客户端”也可以反向对服务器推送信息(状态和反馈)。

除了Websocket,我还考虑使用gRPC,这是一种高性能服务器-客户端通信框架,用谷歌在2016年八月开源。Unity将其用于机器学习智能体接口通信的协议。但是它的设置有点麻烦,并不高效,所以我还是选择Websocket。

4.2 为Donkey Car创建一个定制化的环境

下一步是创建一个类似于OpenAI gym的交互界面,用于训练强化学习算法。之前训练过强化学习算法的人可能对各种API的使用很熟悉。常见的就是reset( )、step( )、is_game_over( )等。我们可以将OpenAI gym的种类进行扩展,然后用上面的方法创建自己的gym环境。

最终成果能和OpenAI gym相媲美,我们科用类似的指令与Donkey环境交互:

env = gym.make("donkey-v0")
state = env.reset()
action = get_action()
state, action, rewards, next_state = env.step(action)

环境同样可以让我们设置frame_skipping,并且用headless模式训练智能体(也就是无需Unity GUI)。

同时,Tawn Kramer还有3中Unity场景可用:生成道路、仓库和Sparkfun AVC,都可以用于训练。在我们开始运行自己的强化学习算法之前,我们要么自己搭建Donkey Car的Unity环境,要么下载预先搭建好的环境可执行程序。具体的环境设置和训练指导可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl

4.3 用DDQN训练Donkey Car

准备好了对强化学习友好的环境,我们现在就可以搭建自己的强化学习算法啦!我采取的是用Keras书写的Double Deep Q学习算法,这是DeepMind开发的经典强化学习算法,易于测试,编写简单。我已经在OpenAI gym中的cartpole和VizDoom中测试了,所以如果有什么问题,应该是Unity环境的问题,算法没有问题。关于DQN的文章,大家可以参考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

4.3.1 状态空间

我们用Donkey Car前方安装的摄像机所拍摄的像素照片,执行以下转换:

  1. 将尺寸从(120, 160)改为(80, 80)
  2. 变为灰度图像
  3. 框架堆叠:去前面几个步骤中的4个框架堆在一起

最后的状态维度应该是(1, 80, 80, 4)。

4.3.2 动作空间

现实和虚拟世界中的Donkey Car都是将持续的方向控制和油门数值作为输入。为了简介,我们将油门数值设为常量(例如0.7),仅仅改变控制方向。控制方向的值从-1到1,但是,DQN只能处理分离的动作,所以我将方向的值分为15个种类。

4.3.3 Q网络框架

我们的Q网络是一个3层卷积神经网络,以堆叠的框架状态为输入,输出表示方向值分类的15个值。

4.3.4 奖励

奖励是有关汽车偏离中线程度的函数,它由Unity环境所提供。奖励函数用以下公式表达:

其中max_cte是一个归一化常数,所以奖励的范围在0到1之间。如果abs(cte)大于max_cte,循环即终止。

4.3.5 其他重要变量

Frame skipping设置为2以稳定训练。Memory replay buffer的值为10000.Target Q网络在最终训练时会更新。CNN训练时的Batch size为64。贪婪函数用于探索。Epsilon初始值为1,逐渐在10000次训练后会成为0.02。

4.3.6 结果

经过上面的设置,在单个CPU和一个GTX 1080 GPU上,我训练了DDQN差不多100次。整个训练用了2到3个小时。可以从上面的视频中看到,小车跑得很好!

去除背景噪声

我们想让我们的强化学习智能体只根据路线的位置和方向进行决策输出(即方向控制),不要受环境中的其他因素影响。但是,由于我们的输入是全像素的图像,它可能对背景模式过度拟合,而无法认出行进路线。这在现实中尤其重要,因为旁边的车道可能会有障碍物(例如桌子、椅子、行人等)。如果我们想从虚拟世界将学习策略进行迁移,我们应该让智能体顾略背景中的噪音,只关注于车道。

为了解决这个问题,我创建了一个预处理通道,可以将行车路线从原始像素图像中分离出去,再输入到CNN中。分割过程受@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee” title=”这篇博文”>这篇博文的启发。这一过程概括如下:

  1. 用Canny Edge检测器检测并提取所有边框
  2. 用Hough直线转换确定所有直线
  3. 将直线分成positive sloped和negative sloped两类
  4. 删除所有不属于车道的直线

最终转换出的图片应该有最多2条直线,具体情况如下:

接着我把分割后的图像重新调整到(80, 80)的,将4个连续的框架堆叠在一起,用它们作为新的输入状态。我使用新状态再次训练了DDQN,生成的强化学习智能体可以学习良好策略进行驾驶!

然而,我注意到不仅仅训练时间会变长,学习策略也会变得不稳定,车子会经常在转弯的时候摇晃。我想可能是因为在训练的时候丢掉了有用的背景信息。不然的话,智能体应该不会过度拟合。

下一步

在这篇文章中,我们介绍了一种能和OpenAI gym相比的环境,用来训练Unity模拟器中的Donkey Car。还用DDQN训练它自动成功地自动驾驶。接下来,我计划让小车通过训练加速到最大值,并且将这一策略迁移到现实中。

新手学堂之电池选购常识

任何模型车,都不可避免的需要使用电池,本文介绍一些常见模型车用的主流电池知识。
FunRC Studio原创资料,只发RCFANS,如需转载务必注明出处。

本文旨在为新手解决电池的常识问题。

电池的选购不外乎几个方面:
电池类型 / 电压 / 容量 / 放电C数 / 外形尺寸 / 插头类型

电池类型常见的有: NiCd / NIMh / LiPo / LiFe

    NiCd,镍镉电池,老掉牙的类型,造价低廉,容量低,污染大,带记忆效应,现在只能在一些廉价的套装车上找到,强烈不推荐
    NiMh,镍氢电池,在AA和AAA电池中,nimh绝对是主流,但是在遥控模型的电池中,绝对有廉颇老矣的感觉
    LiPo,锂聚合物电池,是现在模型中的主流类型,使用广泛,各种型号琳琅满目,是本文需要介绍的重点
    LiFe,锂铁电池,不算太主流,一般用在遥控器,或者油车接受电,很少用做电车的动力电

NiCd由于太老了,已经没有介绍的必要。不建议玩家选购。
NiMh则还有用武之地,例如油车接受电,很多都还是6V的电压,单节电压1.2V的镍氢电用5节串联起来,就组成了6V电池组刚好。
    而电车上,NiMh则是6节串联,成为7.2V电池组。也有一些大脚车是使用7节串联组成8.4V的。
LiFe使用场合目前不多,单节电压3.3V,多数为圆柱形,2S封装成6.6V的情形多见,主要用于遥控发射电,或者油车接受电。

本文重点介绍模型车上用的最广泛的LiPo 锂聚合物电池。

LiPo,全称Lithium-Polymer Battery,锂聚合物电池外壳为软包,由Li-ion锂离子电池进化而来。
    锂离子单节电压3.6V,由于活性太高,爆炸几率较大,目前已几乎让LiPo取代,现在我们手机使用的几乎都是LiPo。

电压:LiPo单节电芯标称电压为3.7V,充满电时,目前主流电芯均为4.2V单节,目前模型上高压电芯开始逐渐显现,高压电芯充满为4.35V单节。
    每节电芯的电压3.7V我们称之为1S,但是我们的车子往往3.7V是不够的,主流电池电压都是需要7.4V,于是把电芯串联起来,提高电压就行了。
    而多少S则是把多少个3.7V串联起来,电压就是3.7V乘以多少S,例如2S就是3.7*2=7.4V;3S就是3.7*3=11.1V,以此类推。

锂电池还涉及到封装的问题,买电池时会看到有些写着2S1P,有些写着2S2P,这又是什么意思呢?
    2S就是上面说过的了,2S=3.7*2=7.4V,那么2P又是什么呢?
    由于工艺/体积/成本等限制,每个电芯的容量有限,如何最简单地提升容量呢?就是把2个同型号的电芯并联起来,就是多少P的概念。
    例如2个电芯并联起来组成1个3.7V,就称之为2P;而假如用3个电芯并联起来组成一个3.7V,那么就是3P了。
    于是,2S2P,可以理解为有4个一样的电芯,先把其中2块并联起来,组成1S,然后把另外2块并联起来,组成另外1S,再把这2个1S串联起来,成为2S,这个电池就称为2S2P
    例如一个电芯只有3.7V,2000MAH,那么就可以通过2S2P的形式,组成7.4V 4000MAH的电池。
    至于购买时,我们是建议购买1P的产品,例如2S1P,3S1P之类的。这样的电池出现问题的几率相对低一些。但是对于一些极限顶级电池来说,可能没有1P的选择,因为1P受限于技术/工艺限制,未必做得出来。于是2P之类的就成为了不得已的选择。

容量:每个电池都有自己的额定容量,电池的容量就像汽车的油箱大小,容量越高,能使用的时间就越长,条件允许的情况下,当然是买容量大的。
    但是也不是必须都选择容量大的,因为有些时候我们会特意选择容量小的以对车架进行减重,提升车架性能。因为容量小意味着重量一般都会轻一些。

容量的鉴定:电池的容量,往往只是产品外壳的一个标签。实际里面有多少我们如何得知?
    有些玩家在使用电池后,拿电池进行充电,例如一个5000MAH的电池,玩完之后,一充,怎么只有3000MAH?
    这个未必是电池容量不足,这可能只是因为你只用掉了3000MAH而已。

    电池的容量,如上面所写,就像汽车的油缸,如果一个5000MAH的电池,你只用掉了3000MAH就拿去充电,那么你肯定只能充进去3000MAH。极端的例子就是假设你刚充满,用都没用,你又拿去充电,那么你可能只能充0MAH。

    容量的鉴定方法:需要一台带放电功能的充电器。先将电池充满电,然后使用充电器的放电功能,将放电截止电压设置为3.0V/cell(每节3.0V),然后开始放电。
        到放电完成,看充电器上显示放出了多少容量,基本就是电池容量的90~95%左右。很少可以达到100%,因为按照电池厂的正常标法,大部分都是指充满到2.75V/cell(单节2.75V)下测出的容量,加上电池用过之后都会有损耗。所以如果要测量电池容量,最好在新买的时候就测量。
        (充电器显示放出多少容量,最终也只能大概参考,因为充电器本身也未必100%准确,但是误差一般不会太大。如果经过这个方法测量的数值与你电池的标签相差太远,那么这个标签就是很有水份的了,一些杂牌常见。而好的品牌很少会这样砸自己招牌,所以好的品牌往往都会贵一些,因为不会怎么虚标)

放电C数:也就是放电能力。C数越大,表示电池能在越短的时间内放完自身的容量。
    1C,就是在1个小时内放完自身容量。多少C,就是在多少份之一的小时内放完自身容量。例如60C就是1/60小时,也就是1分钟内,放完自身容量。
    C数越大的电池,其性能越高,价格越贵。
    对于同一台车来说,C数大的电池,与C数小的电池使用上的区别是:C数越大,其起步越暴力,尾速高一些,电池玩完之后发热越小。

    如何鉴定电池C数:一般玩家没有办法鉴定,因此网上很多虚标的电池,就是冲着新手去的。那些便宜,容量大,C数高,却很便宜的电池,往往就是为新手准备。很简单:新手没用过好的电池,他们不知道有什么区别。
        以下是比较简单的(对比法)鉴定方法:使用大品牌的电池进行对比。同C数接近容量,操作的手法与动力相同的情况下,发热大的电池,C数低,发热小的电池C数高。如果某杂牌40C玩起来发热比一些大品牌的30C还要热,那么并不是这个大品牌故意标低C数,而是杂牌恶意标高C数而已。

    放电C数的小猫腻:正常品牌标C数,都是标电池能长期持续工作的C数。但是一些小品牌,可能会标瞬间电流(常见是持续3~5秒),瞬间电流往往能达到持续电流的1.5~2倍。玩家在选购时应该注意。

说完C数,说一下放电电流:C数可以理解为一个单位,并不是电流。电流还要跟容量搭配。C数乘以容量才是放电电流。
    例如5000MAH 30C的电池,其放电电流为5000*30=150000MA,也就是150A,同理,一个3000MAH 50C的电池,放电电流也是一样的,150A。区别是:3000MAH能用的时间会更短。

    有些玩家可能会问:我的电调只有120A,或者60A,我买个有150A电流的电池,我的电调会烧掉吗?答案当然不会了。你家外面的供电线动辄有几千千瓦,你的电脑可能只有300瓦,你把300瓦的电脑接到几千千瓦的线上,电脑有烧掉了吗?

    因此,电池的放电电流只是电池具备的能力,但是实际使用时,消耗的电流大小则是由电调和马达决定的。只要买比你电调和马达消耗的电流大的电池就可以了,大多少都可以,只要你资金足。

外形与尺寸:玩家只要按照自己的要求去购买对应尺寸和形状的就可以了。LiPo大部分都是长条形,但是有一些旧车型则是圆柱形的,那么只能选择镍氢电或者圆柱形容量较低的锂电型号。

插头类型:主流是T插头,田宫插,JST插头,XT60插头,JST插头,香蕉插头(99%的4MM香蕉插加1%的5MM香蕉插),其他如小田宫,XT90之类的也有,但相对很少
    插头的选择,就根据自己动力设备的插头去选择对应的就可以了,记住目前主流是T插,如买错插头,则会造成用电设备与电池无法连接。

关于LIPO电池的保养:
    为什么一些比赛玩家或者老手的电池怎么玩都不涨,新手的很容易就发涨了呢?
        可能的原因有:新手可能被误导或者被无良商家瞒骗买了虚标的产品,或者不懂搭配的商家给搭配了不符合使用条件的电池,甚至是玩家自己根本不懂然后乱买这几种情况,都可能造成电池发涨之类的问题。

    最大的原因在于:保养。

        主要有充电,使用,以及存放三种情况

        充电:锂电池,除1S外,2S及以上的电池,都一定要使用锂电平衡充电器,插上锂电上的白色平衡小插头,使用平衡充电模式。多个S的电池,多少都会因为生产时,造成每片电芯的容量会有少许误差,这些误差就会造成电池在用过之后,电压出现不平衡,少则0.01V,多则可能有1V之大,越好的电池,差别越小,越差的电池,差别越大。而锂电平衡冲,则是在充电时平衡电压,让电压高的不要超电压,让电压低的迅速补充电压。

            充电涉及到充电电流的问题,建议电流是电池容量的一半至2倍的电流为妥,也就是0.5C~2C之间,例如5000MAH的电池,0.5C就是5000*0.5=2500MA=2.5A,2C就是5000*2=10000MAH=10A,那么这个电池最好使用2.5A~10A之间的电流。完全不用担心电流大了对电池有什么负面影响,现在的大品牌电池随便都能支持5C~6C的电流,区区10A 8A对于好的电池来说根本微不足道。

        使用:使用时,无论何时,都一定要记得设置好锂电保护电压,不要让单节电芯的电压低于2.75V这个极限电压。低于这个电压,会对电池容量和放电能力产生负面影响。一般建议将锂电保护电压设置到3.0V~3.2V之间就可以了。多数电调的保护电压都是指电池在短时间内达到保护值,就会切断输出。因此电调保护之后,电压是会有回升的。假设设置了3.0V,保护之后我们测量电压可能有3.4V也不奇怪。
            网上一些玩家说电池电压不要低于3.7V,这个是毫无必要的。对于模型电池来说,因为C数大,容量大,其极限也更高,玩到3.0V每节对电池来说毫不足道。重点是后面说的存放。

        存放:存放状态对于一个电池来说至关重要。锂电不使用,或者不充电,都是处于存放状态,占一个电池寿命的最多时间。只要做到存放时,电池的单节电压处于3.85V左右,那么对电池来说就是最佳的。也就是说,如果你的电池不是在车上使用,也不是在充电器上充放电的时候,都要尽快让电池的电压变成3.85V每节,这样的电池寿命最长。
            尽快要多快?用完之后,等电池凉快了就充电到3.85V就可以了。然后到你下次要使用之前,再把电池充满。3.85V的电池要充满也很快的,不要贪方便提前一晚就充好电。可能你今晚充满的电池,到明天中午想用的时候,发现电池已经微涨了,也毫不奇怪的。
            但是如果我刚充满了,今天又不用了,怎么办?这还要问吗?马上放电啊,放到3.85V每节,然后等下次要使用的时候再充满吧。如果这点保养都做不好,那电池提前说88就不是电池的错了。

            友情提示:如果电池用完了,一定要记得从电调上拔掉插头哦,不然电调会偷偷的把电池的电压榨干的。

                如果不小心过放(电压低于2.75V)了咋办?如果充电器还能正常识别,那没问题,赶紧充到保存电压。但是如果充电器不认这个电池了,说电压低,那就要人肉加电压让电池起死回生了。操作方法:把锂电池的平衡插头不接到充电器,只接电池的正负极那2根粗线,然后用镍氢或者镍镉电模式,小电流冲几分钟,仔细看电压变化,当电压高于3V每节的时候(假如2S就是总6V),就可以用回正常的锂电平衡冲啦!
                    如果是简易平衡充电器,没有镍氢电模式,但是又无法识别了怎么办?那就要暴力加电压了。假设2S 7.4V的无法识别了,要让电池电压回升到6V以上,不超过8.4V,那么就找个直流电压器,电压在6~8.4V之间的,如果没有,就用几个五号电池串起来变成这个电压值,然后直接正极对正极,负极对负极接到你的锂电池上等片刻就OK了。注意正负极对准啊,接反后果不堪设想。

论坛也有些帖子,教导大家说锂电池新买的时候还要激活。其实这是毫无必要的,现在的锂电池容量大,C数高,寿命有限,每一次循环,就是电池少一次寿命。新到手的电池完全不会比所谓激活过的电池性能差。激活既无必要,又浪费时间。