1.题记
提起谷歌Map相信大家都不会陌生,那进入我们今天的话题,如何在Android手机上进行Google Map的开发。
2.Map应用程序的开发
2.1 准备工作
2.1.1 申请Android Map API KEY
步骤一: 找到你的debug.keystore文件,在Eclipse 首选项中可以看到该文件。如下图:
![](http://dl.iteye.com/upload/attachment/437789/aba41192-54c7-34d1-8943-299d5f1968de.jpg)
步骤二:取得debug.keystore的MD5值
在命令行下进入debug.keystore文件所在的路径,执行命令:keytool -list -keystore debug.keystore,会提示输入密码,输入默认密码“android”,即可取得MD5值。
步骤三:申请Android Map的API key。
在浏览器重输入网址:http://code.google.com/intl/zh-CN/android/maps-api-signup.html,登录Google账号,输入步骤2中得到的MD5值,即可申请到API Key。记下API Key。
2.1.2 创建基于Google APIs的AVD
在Eclipse中打开AVD 界面,创建AVD,选择Target为Google APIs的项,如下图:
![](http://dl.iteye.com/upload/attachment/437970/ad8ca8dc-9ce4-3fc7-9b96-a21840deef52.jpg)
若在Target处无Google APIs选项,请自行添加maps.jar文件。
2.1.3 创建基于Google APIs的工程(略),即选择Build Target为Google APIs。
2.2 Google Map API的使用
其类均在com.google.android.maps包中,一下是该包中几个重要的类:
MapActivity用于显示Google Map的Activity类,该类为抽象类,开发时请继承该类,并实现onCreate()方法。在该类中必须创建一个MapView实例。
MapView 用户显示地图的View组件.
MapController 用于控制地图的移动、缩放等
Overlay 这是一个可显示于地图上的可绘制的对象
GeoPoint 一个包含经纬度位置的对象
2.3 实例
2.3.1 创建工程,注意选择Build Target为“Google APIs”
2.3.2 修改AndroidManifest.xml文件,增加访问网络的权限
<uses-permission android:name="android.permission.INTERNET" />
2.3.3 创建Map View,代码如下:
<com.google.android.maps.MapView
android:id="@+id/MapView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0u7spJisVnJZmy3X6nX1M01SirYWYgNm-EQZbhQ"/>
其中APIKEY即为之前得到的APIkey。
2.3.4 实现MapActivity,代码和讲解如下:
package com.sulang.android.map;
import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
public class Activity01 extends MapActivity
{
private MapView mMapView;
private MapController mMapController;
private GeoPoint mGeoPoint;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.MapView01);
//设置为交通模式
//mMapView.setTraffic(true);
//设置为卫星模式
//mMapView.setSatellite(true);
//设置为街景模式
mMapView.setStreetView(false);
//取得MapController对象(控制MapView)
mMapController = mMapView.getController();
mMapView.setEnabled(true);
mMapView.setClickable(true);
//设置地图支持缩放
mMapView.setBuiltInZoomControls(true);
//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);
//设置倍数(1-21)
mMapController.setZoom(12);
//添加Overlay,用于显示标注信息
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = mMapView.getOverlays();
list.add(myLocationOverlay);
}
protected boolean isRouteDisplayed()
{
return false;
}
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point myScreenCoords = new Point();
// 将经纬度转换成实际屏幕坐标
mapView.getProjection().toPixels(mGeoPoint, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText("**广场", myScreenCoords.x, myScreenCoords.y, paint);
return true;
}
}
}
2.3.5 启动模拟器,看效果图:
![](http://dl.iteye.com/upload/attachment/438268/f70cd902-a539-3e7c-82e3-0c8b78136d89.png)
至此关于Google Map的开发已完成,下面是GPS的开发。
3.GPS应用开发
3.1相关API说明
关于地理定位系统的API全部位于android.location包内,其中包括以下几个重要的功能类:
LocationManager:本类提供访问定位服务的功能,也提供了获取最佳定位提供者的功能。
LocationProvider:该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能
LocationListener:提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。
Criteria:该类是的应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者.
Geocider:用于处理地理编码和反向地理编码的类。
要使用地理定位,首先需要取得LocationManager的实例:
locationManager = (LocationManager) getSystemService(context);
取得LocationManager对象之后,还需要注册一个周期性的更新视图:
locationManager.requestLocationUpdates(provider, 3000, 0,locationListener);
其中第一个参数是设置服务提供者,第二个参数是周期。最后一个参数是用来监听定位信息的改变的。
3.2 具体实例
3.2.1 在AndroidManifest.xml文件中添加权限,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sulang.android.map" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".Activity01" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
3.2.2 给模拟器设置个默认的坐标值
启动Eclipse ,选择Window ->Show View 打开 Emulator Control 界面即可进行设置。
3.2.3 实现MapActivity
具体代码和讲解如下:
package com.sulang.android.map;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
/*
*@author 七里香的悔恨,2011-3-16
*MyMapActivity.java
*Blog:[url]http://bigboy.iteye.com/[/url]
*/
public class MyMapActivity extends MapActivity {
public MapController mapController;
public MyLocationOverlay myPosition;
public MapView myMapView;
private static final int ZOOM_IN = Menu.FIRST;
private static final int ZOOM_OUT = Menu.FIRST + 1;
@Override
protected boolean isRouteDisplayed() {
return false;
}
class MyLocationOverlay extends Overlay {
Location mLocation;
// 在更新坐标时,设置该坐标,一边画图
public void setLocation(Location location) {
mLocation = location;
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when) {
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point myScreenCoords = new Point();
// 将经纬度转换成实际屏幕坐标
GeoPoint tmpGeoPoint = new GeoPoint(
(int) (mLocation.getLatitude() * 1E6), (int) (mLocation
.getLongitude() * 1E6));
mapView.getProjection().toPixels(tmpGeoPoint, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.home);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText("Here am I", myScreenCoords.x, myScreenCoords.y,
paint);
return true;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取得LocationManager实例
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(context);
myMapView = (MapView) findViewById(R.id.MapView01);
// 取得MapController实例,控制地图
mapController = myMapView.getController();
myMapView.setEnabled(true);
myMapView.setClickable(true);
// 设置显示模式
myMapView.setSatellite(true);
myMapView.setStreetView(true);
// 设置缩放控制
myMapView.setBuiltInZoomControls(true);
myMapView.displayZoomControls(true);
// 设置使用MyLocationOverlay来绘图
mapController.setZoom(17);
myPosition = new MyLocationOverlay();
List<Overlay> overlays = myMapView.getOverlays();
overlays.add(myPosition);
// 设置Criteria(服务商)的信息
Criteria criteria = new Criteria();
// 经度要求
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 取得效果最好的criteria
String provider = locationManager.getBestProvider(criteria, true);
// 得到坐标相关的信息
Location location = locationManager.getLastKnownLocation(provider);
// 更新坐标
updateWithNewLocation(location);
// 注册一个周期性的更新,3000ms更新一次
// locationListener用来监听定位信息的改变
locationManager.requestLocationUpdates(provider, 3000, 0,
locationListener);
}
private void updateWithNewLocation(Location location) {
String latLongString;
String addressString = "没有找到地址\n";
if (location != null) {
// 为绘制标志的类设置坐标
myPosition.setLocation(location);
// 取得经度和纬度
Double geoLat = location.getLatitude() * 1E6;
Double geoLng = location.getLongitude() * 1E6;
// 将其转换为int型
GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
// 定位到指定坐标
mapController.animateTo(point);
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "经度:" + lat + "\n纬度:" + lng;
double latitude = location.getLatitude();
double longitude = location.getLongitude();
// 更具地理环境来确定编码
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
// 取得地址相关的一些信息\经度、纬度
List<Address> addresses = gc.getFromLocation(latitude,
longitude, 1);
StringBuilder sb = new StringBuilder();
if (addresses.size() > 0) {
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
sb.append(address.getAddressLine(i)).append("\n");
sb.append(address.getLocality()).append("\n");
sb.append(address.getPostalCode()).append("\n");
sb.append(address.getCountryName());
addressString = sb.toString();
}
} catch (IOException e) {
}
} else {
latLongString = "没有找到坐标.\n";
}
// 显示
// myLocationText.setText("你当前的坐标如下:\n"+latLongString+"\n"+addressString);
}
private final LocationListener locationListener = new LocationListener() {
// 当坐标改变时触发此函数
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
// Provider被disable时触发此函数,比如GPS被关闭
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
// Provider被enable时触发此函数,比如GPS被打开
public void onProviderEnabled(String provider) {
}
// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
}
至此 GPS 应用开发完毕。
源代码
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0043/7789/aba41192-54c7-34d1-8943-299d5f1968de-thumb.jpg)
- 大小: 70.5 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0043/7970/ad8ca8dc-9ce4-3fc7-9b96-a21840deef52-thumb.jpg)
- 大小: 44.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0043/8268/f70cd902-a539-3e7c-82e3-0c8b78136d89-thumb.png)
- 大小: 60.6 KB
分享到:
相关推荐
校园疫情防护知识培训
COMSOL模拟下的卡门涡街发电系统模型研究与应用,COMSOL卡门涡街发电模型:探究流体动力学与能源转换的融合机制,COMSOL卡门涡街发电模型 ,COMSOL; 卡门涡街; 发电模型; 核心关键词,COMSOL 下的卡门涡街发电模型研究
微控制器 (MCU) 是单个集成电路上的小型计算机,旨在控制电子系统内的特定任务。它将中央处理器 (CPU)、内存和输入/输出接口的功能全部集成在一个芯片上。 微控制器广泛用于嵌入式系统,例如家用电器、汽车系统、医疗设备和工业控制系统。它们还用于消费电子产品,例如游戏系统、数码相机和音频播放器。 典型的微控制器由处理器内核、易失性和非易失性存储器、输入/输出外设和各种通信接口组成。处理器内核负责执行指令和控制微控制器的其他组件。存储器用于存储数据和程序代码,而 input/output 外设用于与外部环境交互。 微控制器是可编程的,这意味着它们可以进行定制以执行特定任务。用于为微控制器编写代码的编程语言因制造商和微控制器类型而异。一些常用的编程语言包括 C、C++ 和汇编语言。 微控制器是可在嵌入式系统中使用的独立桌面。一些微控制器可能以 clock rate 速率运行并使用 4 位表达式。由于它们控制的许多设备都是电池供电的,因此微控制器通常必须是低功耗的。微控制器广泛应用于各种产品中,包括消费电子产品、汽车发动机、计算机外围设备以及测试和测量设备。这些也非常适合长期电池使用
Wincc高级报表工具:自定义模板,多格式输出与打印预览功能全解析,Wincc高级报表工具:自定义模板,多功能打印预览与导出,支持PDF打印及Excel表格导出,显示统计数据,兼容多种版本使用。,wincc高级报表,支持自定义模版,支持打印预览,支持打印PDF,支持导出Excel表格,支持自定义打印区域,可显示最大值,最小值,平均值,可求和。 可以在wincc7.4 7.5 8.0,博图wincc上使用。 ,wincc高级报表; 自定义模板; 打印预览; 打印PDF; 导出Excel; 自定义打印区域; 显示最大值/最小值/平均值; 求和; wincc7.4-8.0; 博图wincc。,Wincc高级报表:全功能自定义,打印、预览、PDF、Excel输出工具
电机控制算法中的死区补偿技术详解视频教程,电机控制算法之死区补偿策略深度解析视频教程,电机控制算法之死区补偿视频教程 ,电机控制; 死区补偿; 视频教程,电机控制算法死区补偿视频教程
使用 Python 学习数据科学教程
Qt CPPO优化的高效多能表格小部件——适用于工业级应用的强大Excel类程序,基于Qt CPP的高性能多功能表格小部件:工业级应用之首选,Qt CPP实现的高性能表格小部件。 是功能齐全的高性能表格小部件,适用于工业强度的应用程序。 它采用了模型视图控制器架构,因此多个表小部件可以显示相同的数据。 小部件具有广泛的打印功能,包括以与屏幕上的表格显示不同的视觉特征打印表格的功能。 一个功能强大高性能的类似excel表格程序。 支持合并单元格,查找替,打印预览,分页,字体加颜色,粗体,单元格边线,字体大小,撤销前进,背景颜色等功能。 源码: 使用Qt5.13.1_MinGW、Qt5.15.1_MinGW编译通过,其他版本请自行尝试。 ,核心关键词: Qt CPP; 高性能表格小部件; 工业强度应用; 模型视图控制器架构; 打印功能; Excel类似功能; 源码兼容Qt5.13.1_MinGW; Qt5.15.1_MinGW。,Qt C++高性能多功能表格控件
PFC2D云图绘制技术与实现:以鱼式数据导出为基础,运用MATLAB进行高精度图谱绘制,适应各种不规则模型与含空洞模型的绘图需求,利用PFC2D云图绘制技术:导出数据至Matlab绘图平台,实现不规则模型(含孔洞)可视化分析,pfc2d云图绘制。 使用fish将数据导出后,用matlab画图。 适用于各种不规则的模型,例如模型中存在孔洞。 ,pfc2d云图绘制; 数据导出; Matlab画图; 不规则模型; 孔洞处理,Matlab绘制PFC2D云图:不规则模型孔洞处理
山峰图,折线图,基本时序图,区域图,饼状图,环形图,圆弧进度条,多边形雷达图,仪表盘;适用uni-app,小程序端,android端,iOS端,鸿蒙app,前端,微信小程序,支付宝小程序,快手小程序,抖音小程序等
STM32 NUCLEOH753ZI FreeRTOS + UDP 基于 | CubeIDE |1.17.0 | | Firmware Package Name and Version |STM32Cube FW_H7 **V1.12.1** | |板子|NUCLEO-H753ZI| 查看配套教程:https://blog.csdn.net/Jobs_ZhaoCB/article/details/145631105?fromshare=blogdetail&sharetype=blogdetail&sharerId=145631105&sharerefer=PC&sharesource=Jobs_ZhaoCB&sharefrom=from_link
2024免费毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 技术栈:Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode。
永磁同步电机多参数高精度辨识仿真研究:电阻、电感、磁链全面解析,永磁同步电机多参数高精度辨识仿真研究:电阻、电感、磁链全面解析,永磁同步电机多参数辨识仿真【电阻、电感、磁链】 [1]定子辨识原理:通过施加固定脉冲的占空比,测量电流及电压,计算定子电阻 [2]电感辨识原理:① 分别施加三组脉冲,测试获得线电感Lab、Lbc、Lca; ② 根据线电感以及角度,计算Ld及Lq; [3]磁链辨识原理:采用转速、电流双闭环控制,其中D轴给定固定电流,转速设定为额定转速50%左右 [hot] (1)定子电阻辨识:精度在0.1%左右 (2)DQ电感辨识:采用脉冲电压法,精度在0.02%左右 (3)转子磁链辨识:精度在0.12%左右; 2018b版本 ,定子电阻辨识;电感辨识;磁链辨识;脉冲电压法;精度,基于多参数的永磁同步电机辨识仿真:电阻、电感及磁链精确辨识方法
基于Comsol的工件感应加热仿真计算模型:多物理场耦合的电磁热分析与温度场分布研究,Comsol工件感应加热仿真模型:电磁热多物理场耦合计算揭秘温度场与电磁场分布,Comsol工件感应加热仿真计算模型,采用温度场和电磁场耦合电磁热多物理场进行计算,可以得到计算模型的温度场和电磁场分布 ,Comsol;感应加热;仿真计算模型;温度场;电磁场;耦合电磁热多物理场;温度场分布,Comsol仿真计算模型:多物理场耦合感应加热的温度与电磁场分布
永磁同步电机PMSM矢量控制仿真模型:负载波动下的稳定转速电流跟随与SVPWM实现原理详解,永磁同步电机PMSM矢量控制仿真模型:助力新人快速掌握转速与电流控制,理解SVPWM原理,带位置传感器仿真指导,参数计算精准便捷,永磁同步电机PMSM矢量控制仿真,该模型可以指导新人快速入门,了解各个控制环节的波形及搭建方法。 波形见附图,可见在负载波动情况下转速及电流跟随稳定; 模型可助于理解转速及电流环路设计; 模型可助于理解svpwm实现原理; 模型内提供参数计算方法,不用经验值整定; 带位置传感器矢量控制仿真; 可以简单; ,关键词:永磁同步电机; 矢量控制仿真; 波形; 负载波动; 转速; 电流环路设计; SVPWM实现原理; 参数计算方法; 位置传感器。,PMSM矢量控制仿真模型:轻松理解SVPWM与位置传感控制,快速入门之必备工具
团队合作培训课件
基于Simulink的永磁同步电机发电仿真控制模型及其双类型模型结构研究,基于永磁同步电机的发电仿真控制及其Simulink模型构建,永磁同步电机发电仿真控制simulink模型。 邮箱发送。 模型包括两种。 ,永磁同步电机; 发电仿真; 控制; Simulink模型; 邮箱发送; 模型多样性; 两种模型;,Simulink模型在永磁同步电机发电仿真控制中的应用研究
二手手机回收平台系统
本项目是自己做的设计,有GUI界面,完美运行,适合小白及有能力的同学进阶学习,大家可以下载使用,整体有非常高的借鉴价值,大家一起交流学习。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。
Buck-Boost双向DC-DC电源技术详解:基于STM32F334C8T6的自动切换稳压输出学习资料集,基于STM32F334C8T6芯片的Buck-Boost双向DC-DC电源全套学习资料:从原理到实战,涵盖AD原理图、程序源码、仿真模型与硬件设计报告,Buck-Boost双向DC-DC电源整套学习资料 功能:采用STM32F334C8T6芯片,能够根据输入电压和输出电压的大小关系,实现自动切工作模式,将参数信息进行显示,并且可以实现稳压输出。 程序+仿真+硬件软件说明报告+原理图+计算书等等 详细资料内容包括: (1)AD原理图:主电路原理图、辅助电源电路、信号调理与滤波电路、控制器电路等 (2)程序源码:三套程序(Buck模式、Boost模式、Buck-Boost模式),具有软起动、完整的短路保护,过流保护,输出过压保护,输入过压欠压等保护功能 (3)仿真模型:使用PSIM搭建,包括开环和闭环程序,PI控制参数可以参考数字环路设计计算书。 (4)Word硬件设计报告:包括电路参数设计、器件选型、原理分析等等 (5)代码计算书:电压电流采样计算、短路保护计算等等 (6)Word
基于STM32F405的HFI高频方波注入与无感FOC控制方案:永磁同步电机零速带载启动与全速域运行技术,STM32F405实现的无感FOC控制及HFI高频方波注入方案:零速启动、永磁同步电机控制,全速域运行,代码全C语言,含详细开发资源,HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制,0速带载启动,堵转保持扭矩 低速HFI, 高速SMO,全速域运行。 基于stm32f405。 高频注入零速启动三步走: 1 .先是高频注入,角度估算收敛。 2.脉冲NS磁极辨识。 3 .角度,速度双闭坏零速启动运行。 包括完整的cubemx配置文件,mdk工程,原理图和开发笔记,初始角度检测仿真,代码全C语言,宏定义选项均有中文注释,方便我植到自己的项目中。 内涵升级版hfi程序和新的foc程序框架,新版hfi程序速度波动更小。 ,关键词: HFI高频方波注入; stm32f405; 无感FOC控制; 直接闭环启动; 永磁同步电机无感控制; 零速启动三步走; 脉冲NS磁极辨识; 速度波