☰
永磁同步电机无感FOC:龙伯格观测器原理与Simulink仿真实践
2026/10/20 6:10:09 网站建设 项目流程

搞电机控制这几年,最难啃又最常碰到的方向,就是永磁同步电机(PMSM)的无位置传感器控制。我第一次做无感控制时,想当然觉得“把编码器摘了,用一个观测器把转子位置估出来”就行,实际调下来才知道,从模型推导到Simulink仿真,每一步都有让人熬夜排查的陷阱。这篇博文想和大家聊聊龙伯格(Luenberger)观测器的原理、增益设计、Simulink模型搭建的全过程,以及我在调试中踩过的坑,希望能给正在做无感FOC(磁场定向控制)的朋友省点时间。

这篇内容适合谁参考?如果你刚接触无感控制,想搞明白观测器在FOC环里到底处在什么位置,这篇能从数学模型讲到仿真落地;如果你已经在做有感FOC,想往无感方案迁移,这篇文章可以给你一套可复现的参考路径。我的建议是:别把无位置传感器理解成“拆掉编码器换个算法”这么简单,很多环节——启动策略、闭环切换、角度补偿——都需要工程细节支撑,仿真模型只是第一步。

1. 无位置传感器控制到底解决什么问题

1.1 为什么大家愿意拆掉编码器

很多刚入行的同学会问:电机转起来不就有角度吗?用编码器不是更直接?为什么非要折腾无位置传感器?

做项目你就会明白,位置传感器的痛点非常现实。第一是成本,一套增量式编码器加线缆,在工业批量产品里可能比MCU还贵,对于风机、水泵、压缩机这类对成本敏感的场合,能省则省。第二是可靠性,编码器、旋转变压器都是机电部件,振动、油污、高温都会影响它,一旦出问题就是电机停机或者飞车。第三是安装空间,很多超薄或一体化电机结构里根本塞不下编码器,尤其是家电和汽车零部件里面,布局空间比你想的紧张得多。

无位置传感器控制的本质,是把“装在轴上的硬件传感器”变成“跑在MCU里的软件算法”,通过电机绕组的电压、电流,在线估算转子位置和速度。代价是算法复杂度上升,启动和低速段需要额外策略,但它带来的成本下降和可靠性提升非常可观,所以从家电变频到工业伺服,无感方案已经成为标配方向。

1.2 常见无位置传感器方案怎么选:为什么先看龙伯格观测器

无位置传感器方案有好几个流派,不是越复杂越好,关键看你的工况和算力。

高频注入(High-Frequency Injection):在低速或零速时往定子注入高频电压信号,利用凸极效应或饱和凸极效应估算位置。它对表贴式电机效果一般,对内置式电机效果更好,但会增加噪音、损耗,而且实现复杂度高,目前主要用在低速大扭矩场合。

滑模观测器(Sliding Mode Observer):利用滑模面强制观测误差收敛,鲁棒性好,算法简单,但输出会伴随抖振,通常需要额外低通滤波,滤波又会带来相位延迟,后面还要补偿,所以实际做下来并不轻松。

扩展卡尔曼滤波(EKF):精度高,能同时估计速度,但算法复杂,矩阵运算量很大,在低端MCU上跑起来吃力,调参也需要一定功力。

龙伯格观测器(Luenberger Observer):本质上是一个带反馈校正的状态观测器,模型直观、增益设计清楚,在中高速段性能稳定,不抖振,代码和Simulink模型都容易实现。它的短板是零低速时反电动势信号太弱,所以通常要搭配I/F启动或开环切换来覆盖全速域。对大多数电机驱动项目来说,龙伯格观测器是很务实的选择,这也是我把它作为无感控制入门和落地首选的原因。

我画一个简单对比,方便你决策:

方案中高速性能低速性能实现复杂度MCU算力要求典型应用
高频注入差好高中低速重载、电梯
滑模观测器中上差低低风机、水泵
扩展卡尔曼高较差很高高高性能伺服
龙伯格观测器高差中低家电、工业驱动

2. 永磁同步电机数学模型与龙伯格观测器的推导

2.1 从三相电压到αβ坐标系:观测器设计的关键前提

要做龙伯格观测器,首先得有一个能用状态方程描述的电机模型。PMSM的电压方程最常用的是dq旋转坐标系,但有一个问题:dq坐标的转换需要转子位置,而我们现在恰恰没有转子位置。这是无感控制里典型的“先有鸡还是先有蛋”问题,所以观测器建模通常放在αβ静止坐标系中完成。

先看三相静止坐标,PMSM三相电压方程写出来很啰嗦,工程上一般先做Clarke变换把三相(uvw)变成两相(αβ):

vα = Rs·iα + Ls·diα/dt + eα
vβ = Rs·iβ + Ls·diβ/dt + eβ

这里Rs是定子电阻,Ls是同步电感(表贴式电机Ls=Ld=Lq,这个等式是龙伯格观测器简化的重要前提),eα和eβ是反电动势的αβ分量。对表贴式PMSM,反电动势可以写成:

eα = -ψf·ωe·sinθe
eβ = ψf·ωe·cosθe

其中ψf是永磁磁链,ωe是电角速度,θe是转子电角度。看出来了吗?转子的位置信息全部藏在反电动势里,只要把eα和eβ估准,θe就等于atan2(-eα, eβ)。所以整个无感控制的核心问题变成了:怎么从可测量的电压、电流里把反电动势准确估计出来。

从物理上看,反电动势是转子旋转时切割定子绕组产生的,它和转速成正比。这带来一个天然约束:转速很低时反电动势很小,小到被电压电流采样噪声淹没,这就是无感控制低速难的根源。后面章节我会详细说低速怎么处理,这里先把模型搭好。

2.2 反电动势作为状态变量:龙伯格观测器的状态方程

龙伯格观测器设计的第一步,是选择状态变量。电流iα、iβ是能直接测的,反电动势eα、eβ是测不了但想要的,所以把eα、eβ放进状态向量里,扩维估计。

把电压方程改写成状态方程形式。以α轴为例:

diα/dt = (vα - Rs·iα - eα) / Ls

同理β轴:

diβ/dt = (vβ - Rs·iβ - eβ) / Ls

反电动势的变化率呢?严格说eα、eβ是时变信号,但转速变化比电流变化慢得多,所以在单个控制周期里,可以近似认为反电动势“缓慢变化”,即:

deα/dt ≈ 0
deβ/dt ≈ 0

这个近似是工程上让龙伯格观测器落地的关键,虽然名字叫“缓慢变化”有点粗糙,但只要观测器带宽远高于转速变化频率,误差就是可控的。完整状态方程写成:

d/dt [iα; iβ; eα; eβ] = A × [iα; iβ; eα; eβ] + B × [vα; vβ]
y = C × [iα; iβ; eα; eβ]

其中:

A = [-Rs/Ls, 0, -1/Ls, 0;
0, -Rs/Ls, 0, -1/Ls;
0, 0, 0, 0;
0, 0, 0, 0]

B = [1/Ls, 0; 0, 1/Ls; 0, 0; 0, 0]

C = [1, 0, 0, 0; 0, 1, 0, 0]

C矩阵说明我们只能用电流作为可观测输出。接下来构建观测器,形式上就是把估计的状态通过增益矩阵K反馈回去修正:

d/dt [îα; îβ; êα; êβ] = A × [îα; îβ; êα; êβ] + B × [vα; vβ] + K × ([iα; iβ] - [îα; îβ])

K是观测器增益矩阵,它决定了估计状态向真实状态收敛的速度。这个结构你一眼就能认出来,和电机控制的PID反馈是同一个逻辑:电流误差大就多修正,误差小就少修正。

2.3 观测器误差方程与增益的物理含义

把真实状态减去估计状态,定义电流误差δiα = iα - îα,反电动势误差δεα = eα - êα。将两个方程相减,得到误差动态方程:

d/dt δiα = -(Rs/Ls)δiα - (1/Ls)δεα - k1·δiα
d/dt δεα = -k2·δiα

这里我把增益矩阵K写成两个参数:k1是电流误差反馈到电流估计通道的增益,k2是电流误差反馈到反电动势估计通道的增益。这样理解起来更直观:k1相当于“纠正电流估计”的比例项,k2相当于“对反电动势估计的积分修正”。

出现k2那个负号时很多人会困惑,直觉上电流误差大了,反电动势估计不是应该往上调吗?实际反着来。因为反电动势增大会压低电流,如果实际电流高于估计电流(δiα>0),说明实际反电动势很可能比估计值小,所以要向下修正êα。符号定错了,观测器直接发散,调试时第一件事就要检查这个。

误差动态方程最终可以写成二阶特征方程:

s² + (Rs/Ls + k1)s + k2/Ls = 0

这个方程是一切增益整定的起点。从方程能看出来,系统稳定的条件是k2>0且Rs/Ls+k1>0,但仅仅稳定不够,还要让特征根落在想要的收敛速度区间,这就带出了下一节的极点配置。

3. 观测器增益设计与稳定性分析

3.1 用极点配置设计增益:两个参数定生死

龙伯格观测器的增益设计方法很多,最简单的工程做法就是极点配置。把上面特征方程和标准二阶系统对比:

s² + 2ζωo·s + ωo² = 0

于是得到两组关系:

k1 = 2ζωo - Rs/Ls
k2 = Ls·ωo²

关键参数就是ωo(观测器带宽)和ζ(阻尼比)。我一般取ζ=1(临界阻尼),这样观测器状态直接收敛不超调,好判断。ωo的选择标准是:至少是电流环带宽的3到5倍,但又不能太高,否则高频噪声会通过反馈通路灌进来。

举个例子。某台表贴式PMSM参数:Rs=2.875Ω,Ls=0.0085H,Rs/Ls≈338 rad/s,也就是电磁时间常数约3ms。电流环带宽我按800 rad/s设计,观测器带宽取它的4倍,ωo=3200 rad/s。于是:

k1 = 2×1×3200 - 338 = 6062
k2 = 0.0085 × 3200² = 87040

这里要特别注意k2的数量级,上万很正常。有些人看到这个值以为算错了,其实是因为k2的量纲(伏特/安培/秒)天然就很大,Simulink里直接填这个数即可,不需要归一化。

极点配置做完,理论上观测器已经能收敛。但实际Simulink跑起来你会发现,增益只是基础,噪声、采样延迟、PWM延时都会改变等效模型,所以现场调参时k1、k2还要在这个基准值附近细调,后面调试章节我再展开。

3.2 带宽、噪声与模型假设的权衡

观测器带宽不是越高越好,这里面的矛盾很典型:带宽高,反电动势估计对真实变化的跟随快,启动切换时不容易丢步;但带宽高也意味着高频PWM噪声和采样噪声被直接放大,估计的反电动势会出现毛刺,位置提取时再一滤波,角度抖动更明显。

反过来,带宽低,模型“反电动势缓慢变化”的假设更能成立,滤波效果也好,但动态响应会变慢,转速突变时估计角度会滞后。我见过的很多无感项目出问题,不是算法不先进,而是观测器带宽和采样噪声之间没找到平衡,波形看着好看,负载一冲击就垮。

实操上我建议用两条标准卡边界。第一,观测器极点频率不超过PWM开关频率的十分之一。比如10kHz开关频率,ωo最多取到6000rad/s左右。第二,先用理想电源和连续模型仿真,把ωo从低往高调,观察反电动势估计波形从“平滑但滞后”变成“跟得紧但带毛刺”的临界点,然后往回调20%作为安全裕量。这个做法让调参从玄学变成有据可依。

3.3 低速工况的局限与对策

龙伯格观测器最大软肋在低速。反电动势幅值正比于转速,当转速低到额定值的5%以下,反电动势可能只有一两伏,而PWM开关噪声、采样量化噪声比这大得多,信噪比彻底恶化。此时观测器不是不收敛,而是估出来的角度被噪声牵着走,电机容易抖动甚至反转。

工程上绝不硬扛这个硬伤,而是换策略。最常用的是I/F启动:电流环正常投入,由控制器给定一个合成电流矢量,不管真实位置和给定位置有多大误差,先让电机强制转起来;等转速升到额定值的5%到10%、反电动势信噪比足够高时,再平滑切换到观测器闭环。也就是说,所谓的“无位置传感器控制”并不是全速域都用同一个算法,而是一个高低速协同的混合方案。这一点做项目时一定要想清楚,仿真也要把切换逻辑提前搭进去,否则后面实机验证会被打一个措手不及。

4. Simulink模型搭建全过程

4.1 模型整体结构与模块划分

搭Simulink模型之前先想清楚闭环拓扑。无感FOC的电流环和速度环与有感FOC是同一个套路,区别只在“转子位置来源”,所以模型可以在有感FOC模型的基础上替换位置反馈模块,建议你按功能拆成几个子系统,后面调试单独查问题会省力很多。

我习惯的模型顶层结构从前往后依次是:

  • 直流电源和三相逆变器,用Simscape或Simulink的Universal Bridge模块搭,PWM信号给到门极控制;
  • PMSM本体,Simulink自带PMSM模块,机械负载设置成恒转矩或者带惯量均可;
  • 电流采样与Clarke变换,将电机的ia、ib(或三相电流)变换到αβ轴;
  • 龙伯格观测器子系统,输入是vα、vβ、iα、iβ,输出是êα、êβ;
  • 位置速度估计子系统,一般用锁相环(PLL)从êα、êβ提取θ_hat和ω_hat;
  • Park变换、电流PI控制器、逆Park变换和SVPWM模块,构成完整电流闭环;
  • 最外层是速度环PI,输出iq_ref,id_ref一般设为0。

模块顺序很容易理解,但有一个细节容易被忽略:观测器需要的是电机端实际电压,不是指令电压。Simulink仿真里可以直接把逆变器输出电压引出来,但实机上电压检测成本高,通常用指令电压加上死区补偿来近似。所以仿真时留一个“指令电压/实际电压切换开关”,能帮你摸清模型误差对观测器的真实影响。

4.2 观测器子系统的Simulink实现细节

观测器核心代码如果用MATLAB Function模块写,非常简洁,但注意理解和调试方便性不如模块化搭建。我两种都试过,最终推荐用基础模块搭建,原因无他:MATLAB Function是黑盒,波形异常时不方便直接看每个中间量;而基础模块每个节点都能拉scope观察。

α轴观测器用模块搭的步骤大致是这样:

  • 输入端口:vα、iα;
  • 计算电流估计导数:用Fcn模块或Sum模块组合,实现 (vα - Rs·îα - êα)/Ls;
  • 加一个积分器Integrator1,输出îα;
  • 再加一个积分器Integrator2,输入是k2×(iα - îα)的相反数,输出êα;
  • 把误差(iα - îα)乘上k1后,反馈到第一个积分器的输入侧。

β轴完全相同,复制一份改端口就行。积分器的初始条件都设0,但注意这里有个坑:如果仿真开始时电机已经有转速,反电动势初始值不是0,你设0就会有一段收敛过程,角度误差很大。解决办法是让观测器在开环启动阶段就持续运行,等速度升起来角度误差自然收敛,而不是等到切闭环时才“唤醒”观测器。

离散化实现时,两个积分器要换成离散积分器,并用同一个采样时间Ts。Ts建议和电流环周期一致,比如10kHz控制频率对应Ts=1e-4秒,不要用变步长求解器跑完再转定步长,两者仿真结果会不一样,后者更接近真实MCU行为。

4.3 从估计反电动势到转子位置与速度提取

有了êα和êβ之后,最简单的角度计算是直接atan2:

θ_hat = atan2(-êα, êβ)

这个公式一学就会,但我在项目里基本不用它,原因是atan2对噪声过于敏感。反电动势估计波形只要有一点毛刺,角度就会跳变,电流环跟着抖,严重时发出啸叫电流声。

推荐做法是锁相环(PLL)提取角度。PLL的核心思想是把角度估计变成一个闭环跟踪问题,对输入信号中的谐波和噪声有天然抑制能力。用一个简单的PLL结构:

err = êα·cosθ_hat + êβ·sinθ_hat

这里err在θ_hat接近真实角度时趋于0,把它送给PI调节器,输出就是估角速度ω_hat,再积分得到θ_hat。PI参数可以先按经验设:Kp取200到500,Ki取5000到20000,然后在仿真里用频率阶跃观察角度跟随情况微调。

速度估计最直接的是PLL直接给出的ω_hat,不推荐对θ_hat做差分求速度,数值微分会把角度噪声放大成速度抖动,低转速时尤其严重。

4.4 仿真参数的设置与初始化注意事项

仿真参数设置直接影响观测器调试效率,我建议按下面套路来。

第一步,用连续步长(变步长、ode45)把算法逻辑跑通。此时把开关频率提高一点,让PWM谐波对观测器的影响尽量小,重点确认观测器估计收敛、PLL锁定、闭环稳定。

第二步,切换到定步长离散仿真,步长设为Ts=1e-4,所有PI控制器和观测器都按离散域整定。这一步的作用是发现离散化带来的额外延时,实际观测器效果会比连续仿真略差,这是正常的。

第三步,把电流采样模块改成在PWM载波底部触发的采样模式,模拟真实MCU的ADC采样时刻。这个细节决定了你后面实机调试时的电流噪声水平,别跳过。

一个容易被忽视的问题是反电动势量级。在仿真里看êα、êβ波形,如果幅值只有0.1V级别,说明转速太低,观测器天然工作不好,此时不是调增益能解决的,应该检查转速工作点,考虑切换I/F模式。另外要设置好“切换到无感闭环”的触发逻辑,一般用转速阈值加角度误差阈值双重判断,防止过早切换到低信噪比区域。

5. 调试实录:常见问题与排查技巧

5.1 启动振荡:观测器不收敛与闭环切换的坑

我调试无感模型时遇到的第一个严重问题,是启动阶段电流和转速一起振荡,振荡频率不高但幅度很大,直观感觉就是电机在“抖”。

排查发现原因并不是观测器增益不对,而是切换逻辑太粗暴。速度还没达到安全阈值就直接把电流环的角度源从“强制给定”换成“观测器估计”,两者当时存在几十度的电角度偏差,力矩方向瞬间变化,自然就振荡了。

解决办法分两步。第一步,把切换条件从单纯速度阈值改为“速度阈值且角度误差小于某个值”。角度误差能在开环阶段算出来吗?可以,因为开环强制角是已知的,而观测器一直在后台运行,它的估计角也是已知的,二者相减就是误差。第二步,角度切换做成斜坡过渡,用类似S函数或有限状态机实现:切换期间以固定步长把电流环角度参考从强制角平滑移动到估计角,过渡时间控制在50到100ms。

这个坑几乎是所有无感项目都会遇到的,强烈建议在Simulink模型里就把切换逻辑完整做出来,不要跳过,否则实机调试第一轮就会烧保险丝。

5.2 滤波延迟导致的角度偏移与补偿

第二个典型问题是:稳态时估计角度和真实角度存在一个几乎固定的偏移,导致dq轴电流解耦不彻底,q轴电流给上去,d轴也会出现耦合分量,电机表现为“带载时效率和力矩都达不到预期”。

我在仿真里对比了观测器估计角θ_hat和电机真实角θe的波形,发现差距不是毛刺,而是一个固定相位差,转速越高偏差越大。这就是低通滤波带来的相位延迟。

反电动势从PWM电压、采样电流里恢复出来,过程中一定有滤波环节。一级低通滤波器在截止频率f_c处会产生45°相位滞后,实际工作频率低于f_c时滞后角约等于:

Δθ ≈ arctan(f_e / f_c)

其中f_e是电频率。我模型里反电动势估计前加了一级500Hz截止频率的低通滤波,电机跑到3000rpm对应电频率约250Hz,Δθ≈arctan(0.5)≈26.6°,这已经是非常显著的位置误差了。

解决的办法有两种。一种是“算出来补回去”,在PLL输出或角度进入Park变换之前加上补偿角Δθ。这种办法简单,但补偿角依赖转速,随转速变化需要查表,而且在加减速动态过程中补偿会滞后。另一种是“减少相位延迟的源头”,用更高截止频率的滤波,或者用相位延迟更小的二阶Butterworth替代一阶RC,再配合PLL自身的跟踪能力。我最后采用的是后者为主,PI参数调好之后,角度偏差基本可以压在5°以内,比生硬查表补偿可靠得多。

5.3 两轮参数调整经验:从仿真到模拟工况

拿一个风机类负载的模拟项目举例。第一轮仿真用启动参数直接跑,在额定转速下观测器工作正常,但加载后转速跌落再恢复,动态过程里估计角度明显滞后,电流波形出现低频振荡。这时候我没动观测器增益,而是先检查PLL带宽,PLL响应太慢,角度跟踪跟不上转速突变。把PLL的Ki调大一倍,再观察角度误差能更快收敛。

第二轮发现高频抖动。转速稳定时行,êα波形会出现周期性毛刺,频率是开关频率倍数。排查出来是电流采样没有跟PWM同步,仿真里用的是连续采样,混入了开关纹波。把采样模块改成PWM载波底部采样,再给反电动势估计加一阶低通,毛刺基本消失。这个教训说明:调试观测器时,不要一上来就猛调增益,先把采样同步、PWM谐波这些基础问题排除干净,不然很容易陷入“调了这里那里抖”的恶性循环。

6. 参数敏度分析与个人调参体会

6.1 定子电阻与磁链参数偏差对观测结果的影响

龙伯格观测器是模型依赖型算法,模型参数和实际电机参数不一致时,观测结果必然有偏差。影响最大的是定子电阻Rs和永磁磁链ψf。

Rs偏差的影响在低速时最明显。反电动势方程里Rs直接参与电压方程,低速时反电动势小,真实定子电阻压降占比大,如果模型里的Rs比实际值偏大,观测器会把一部分电压误判成反电动势,导致位置估计超前;偏小则滞后。这个偏差随温度变化尤其麻烦:电机发热后铜阻会上升,实测一台小电机的定子电阻从冷态到热态能变30%以上,不做在线辨识或补偿,低速性能会有明显漂移。

ψf偏差的影响则贯穿全速域。磁链温度特性也不小,尤其用钕铁硼的永磁体,温度升高磁链会下降。模型里磁链偏大,估计的反电动势就会偏大,PLL输出的速度偏高,带来整体转速偏差。

仿真时可以做一次参数敏度分析:把Rs和ψf分别增减20%,跑同一工况,记录估计角度误差曲线。通常你会发现,期望估计角度误差控制在5°以内的话,Rs偏差允许范围有10%左右,ψf偏差容忍度更紧,因为ψf直接就是反电动势的幅值依据。这个分析做一次,后面实机遇到类似问题你就知道第一个该怀疑谁。

6.2 直流偏置与采样同步的重要性

这类模型最怕的其实是“软故障”:不直接让系统崩溃,但让性能缓慢变差。最典型的就是电流传感器直流偏置。采样后的电流即使为零也带一个微小偏移,相当于给观测器输入端灌入一个恒定扰动。电流环PI能把它压住一部分,但观测器里的积分环节会把偏置逐渐累积,最后反映为位置估计缓慢漂移,电机空载时可能转着转着突然偏一个角度。

在Simulink里模拟这个现象很简单:在电流采样模块后加一个常数偏置,看看θ_hat会怎么变化。我建议所有做无感的人把这个实验跑一遍,因为实机上ADC零点偏移是不可避免的。解决手段是采样前做硬件滤波,软件里做零点校准,控制周期里定期执行偏置更新。

采样时刻没和PWM同步引起的谐波问题我在上一节已经提过,这里再多说一句:不要在仿真模型里用连续采样模块直接测PWM逆变器的输出电流,那个波形里全是开关纹波,观测器很难得到干净的反电动势,更贴近真实的做法是用离散采样模块在载波底部采样。

6.3 几点实操体会

最后聊一点纯个人经验。无感FOC调试要有一个好习惯:把观测器估计角度和真实角度拉到同一个scope里对比,即使没有编码器,也务必在仿真初期用“真实角度”模块保留一个对比通道。只有亲眼看到估计角度从起始不收敛到逐渐贴合真实角度的过程,你才能真正理解观测器收敛的含义,而不是看着PLL输出那根sin曲线一头雾水。

还要留个心:Simulink自带PMSM模块的模型参数和你实际电机的参数一定有偏差,仿真阶段不要过度追求极致性能,把余量留足,比如观测器带宽、电流环带宽,都按实际可实现的80%来整定。仿真能收敛的,实机大概率也能稳定;仿真刚好能收敛的,实机基本跑不起来。

做这个项目最让我受用的教训是:无位置传感器控制不是“去掉传感器”这么简单,而是一整套从模型、观测器、PLL到启动切换的系统工程。算法本身并不神秘,把龙伯格观测器的数学原理吃透,把Simulink模型一步步搭好,后面遇到问题你就能分得清到底是增益问题、模型问题还是采样问题,而不至于把所有参数都乱试一遍。希望这篇总结能帮你少踩一些我踩过的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询