- 浏览: 7364638 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
Android的二维码扫码应用
在企业应用中可能某一些情况,需要二维码扫码,大多数采用的开源组件zxing实现。简介
最近的Widget项目用到需要用摄像头来处理条形码,章师兄推荐了ZXing这个开源的项目,于是做一简单的调研。
ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。
当前,ZXing主要支持以下条形码:
UPC-A and UPC-E
EAN-8 and EAN-13
Code 39
Code 128
QR Code
Data Matrix ('alpha' quality)
ITF
首先,在http://code.google.com/p/zxing/上下载到ZXing的应用程序包,解压下载到的程序包后,我们可以看到整个应用程序分为一些组件。如下:
1.core: 核心包,是整个应用的主要组件组成部分。
2.javame: 为JavaME来定制的客户端工具。
3.javase: 为PC端定制的客户端工具。
4.android: 为Android端定制的客户端工具。
5.androidtest: Android测试应用程序,里面有在其它程序中使用此应用的示例。
基本测试
ZXing程序的运行需要我们使用Ant去打包编译之后才可。在这里,我主要调研了在PC端,在WTK上及android上的运行。
各种语言zxing的实现路径:
http://zxing.googlecode.com/svn
源代码svn路径:
http://code.google.com/p/zxing/downloads/list。
zxing APK路径:
http://zxing.googlecode.com/files/BarcodeScanner4.1.apk
zxing和应用整合官方代码:
http://zxing.googlecode.com/svn/trunk/android-integration
方法一:整合为一个项目:
前言
最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个以Apache License 2.0 开源的 ZXing项目。Zxing项目里的Android实现太过复杂多余东西太多,得对其进行简化。
前提条件
下载源代码:点击这里
编译核心库:Zxing的主页上有介绍具体步骤,大家也可以参照这篇博文:android 条码识别软件开发全解析(续2详解绝杀!)
导入项目
打开Eclipse 导入 源码中的 Android 项目,然后右击项目 选择“Build path”——》"Add External Archives" 把核心库 core.jar文件加入到项目中。
此时编译一下项目,会发现报错,“ Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?”之类的。打开raw 下的Values 发现错误是在一个<String>上。这里把 “preferences_custom_product_search_summary” 里的 %s %f 全部都改成 %1$s %1$f(因为我们用不到多国语言,建议只保留默认的Value ,其他全部删除)。
原因:由于新的SDK采用了新版本的aapt(Android项目编译器),这个版本的aapt编译起来会比老版本更加的严格,然后在Android最新的开发文档的描述String的部分,已经说明如何去设置 %s 等符号
“If you need to format your strings using String.format(String, Object...) , then you can do so by putting your format arguments in the string resource. For example, with the following resource:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In this example, the format string has two arguments: %1$s is a string and %2$d is a decimal number. You can format the string with arguements from your application...“
经过以上步骤后项目应该就可以运行了。
但是ZXing的android项目东西太多了,有很多是我们不需要的,得新建另一个项目简化它。
简化
在开始前大致介绍一下简化ZXing需要用到各个包 、类的职责。
- CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。
- CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
- DecodeThread 解码的线程。
- com.google.zxing.client.android.camera 包,摄像头控制包。
- ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。
新建另一个项目
新建另一个项目将启动的Activity命名为CaptureActivity,并导入核心库。项目新建完成后我们打开 CaptureActivity 的布局文件,我这里为main。把里面的XML修改为:
2 android:layout_width="fill_parent" android:layout_height="fill_parent">
3 <SurfaceView android:id="@+id/preview_view"
4 android:layout_width="fill_parent" android:layout_height="fill_parent"
5 android:layout_centerInParent="true"/>
6
7 <com.Zxing.Demo.view.ViewfinderView
8 android:id="@+id/viewfinder_view" android:layout_width="fill_parent"
9 android:layout_height="fill_parent" android:background="@android:color/transparent"/>
10 <TextView android:layout_width="wrap_content"
11 android:id="@+id/txtResult"
12 android:layout_height="wrap_content" android:text="@string/hello"/>
13
14 </FrameLayout>
可以看到在XML里面用到了 ViewfinderView 自定义view 。所以新建一个View 的包,然后把:ViewfinderView 和 ViewfinderResultPointCallback 靠到里面(记得对应修改XML里面的包)。
打开 CaptureActivity 覆盖 onCreate 方法:
2 publicvoid onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.main);
5 //初始化 CameraManager
6 CameraManager.init(getApplication());
7
8 viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
9 txtResult = (TextView) findViewById(R.id.txtResult);
10 hasSurface =false;
11 inactivityTimer =new InactivityTimer(this);
12 }
这里调用到的 CameraManager 类是控制摄像头的包里的类。新建一个camera包把:com.google.zxing.client.android.camera 里面的类全部拷入,另外我把PlanarYUVLuminanceSource也拷入到这个包里面。根据错误的提示来修正代码,主要是修改正包结构。(整个简化的流程都是如此:“根据错误提示,修改代码”)。
在修改的过程中,有很多是关于R 资源的问题,在此我们需要将Values 里面的两个xml资源文件拷入项目中:colos.xml 和ids.xml 。 ctrl+b 一下看看error 是不是少了很多。在CameraManager中有些地方需要用到项目的配置,这里需要把配置直接写入代码中:
//是否使用前灯
// if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) {
// FlashlightManager.enableFlashlight();
// }
FlashlightManager.enableFlashlight();
使用摄像头需要加入相应的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
当View 和 camera 包里的错误修正完成后,我们继续来看CaptureActivity。
覆盖onResume方法初始化摄像头:
protectedvoid onResume() {
super.onResume();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
if (hasSurface) {
initCamera(surfaceHolder);
} else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
decodeFormats =null;
characterSet =null;
playBeep =true;
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep =false;
}
initBeepSound();
vibrate =true;
}


2 try {
3 CameraManager.get().openDriver(surfaceHolder);
4 } catch (IOException ioe) {
5 return;
6 } catch (RuntimeException e) {
7 return;
8 }
9 if (handler ==null) {
10 handler =new CaptureActivityHandler(this, decodeFormats,
11 characterSet);
12 }
13 }


publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
if (!hasSurface) {
hasSurface =true;
initCamera(holder);
}
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
hasSurface =false;
}
initCamera () 方法用于初始化摄像头,如果排除了所有的error ,运行项目时就可以看到大致扫描界面了。 surfaceHolder.addCallback(this);表示让CaptureActivity实现其callback接口。
handler = new CaptureActivityHandler(this, decodeFormats,characterSet) 用于进行扫描解码处理。
解码
上面的步骤主要都是用于对摄像头的控制,而解码的真正工作入口是在CaptureActivityHandler 里面的。新建一个Decoding包把以下文件拷入包中:
- CaptureActivityHandler
- DecodeFormatManager
- DecodeHandler
- DecodeThread
- FinishListener
- InactivityTimer
- Intents
由于我们的包结构和Zxing 项目的有所不同所以需要注意一下类的可访问性
同样开始ctrl+B 编译一下,然后开始修正错误。
在CaptureActivityHandler 里 把 handleMessage 里的部分方法先注释掉如:“decode_succeeded ”分支,这是解码成功时调用 CaptureActivity 展示解码的结果。
在DecodeThread 类里,修改部分涉及Preference配置的代码:
Vector<BarcodeFormat> decodeFormats,
String characterSet,
ResultPointCallback resultPointCallback) {
this.activity = activity;
handlerInitLatch =new CountDownLatch(1);
hints =new Hashtable<DecodeHintType, Object>(3);
//// The prefs can't change while the thread is running, so pick them up once here.
// if (decodeFormats == null || decodeFormats.isEmpty()) {
// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
// decodeFormats = new Vector<BarcodeFormat>();
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D, true)) {
// decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
// }
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_QR, true)) {
// decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
// }
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_DATA_MATRIX, true)) {
// decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
// }
// }
if (decodeFormats ==null|| decodeFormats.isEmpty()) {
decodeFormats =new Vector<BarcodeFormat>();
decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
}
hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
if (characterSet !=null) {
hints.put(DecodeHintType.CHARACTER_SET, characterSet);
}
hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback);
}
这里是设置 解码的类型,我们现在默认将所有类型都加入。
错误类型基本上都是:包结构、PreferencesActivity 的配置 、类可访问性的问题。根据错误提示耐心把错误解决。
返回解码结果
还记得在 CaptureActivityHandler 的 messagehandler 里注销掉的Case分支吗?现在CaptureActivity 里实现它。
inactivityTimer.onActivity();
viewfinderView.drawResultBitmap(barcode);
playBeepSoundAndVibrate();
txtResult.setText(obj.getBarcodeFormat().toString() +":"
+ obj.getText());
}
最后
ZXing的简化已基本完成,有几位是可以运行成功的?呵呵。
下面是CaptureActivity的源码:


private CaptureActivityHandler handler;
private ViewfinderView viewfinderView;
privateboolean hasSurface;
private Vector<BarcodeFormat> decodeFormats;
private String characterSet;
private TextView txtResult;
private InactivityTimer inactivityTimer;
private MediaPlayer mediaPlayer;
privateboolean playBeep;
privatestaticfinalfloat BEEP_VOLUME =0.10f;
privateboolean vibrate;
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化 CameraManager
CameraManager.init(getApplication());
viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
txtResult = (TextView) findViewById(R.id.txtResult);
hasSurface =false;
inactivityTimer =new InactivityTimer(this);
}
@Override
protectedvoid onResume() {
super.onResume();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
if (hasSurface) {
initCamera(surfaceHolder);
} else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
decodeFormats =null;
characterSet =null;
playBeep =true;
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep =false;
}
initBeepSound();
vibrate =true;
}
@Override
protectedvoid onPause() {
super.onPause();
if (handler !=null) {
handler.quitSynchronously();
handler =null;
}
CameraManager.get().closeDriver();
}
@Override
protectedvoid onDestroy() {
inactivityTimer.shutdown();
super.onDestroy();
}
privatevoid initCamera(SurfaceHolder surfaceHolder) {
try {
CameraManager.get().openDriver(surfaceHolder);
} catch (IOException ioe) {
return;
} catch (RuntimeException e) {
return;
}
if (handler ==null) {
handler =new CaptureActivityHandler(this, decodeFormats,
characterSet);
}
}
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
if (!hasSurface) {
hasSurface =true;
initCamera(holder);
}
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
hasSurface =false;
}
public ViewfinderView getViewfinderView() {
return viewfinderView;
}
public Handler getHandler() {
return handler;
}
publicvoid drawViewfinder() {
viewfinderView.drawViewfinder();
}
publicvoid handleDecode(Result obj, Bitmap barcode) {
inactivityTimer.onActivity();
viewfinderView.drawResultBitmap(barcode);
playBeepSoundAndVibrate();
txtResult.setText(obj.getBarcodeFormat().toString() +":"
+ obj.getText());
}
privatevoid initBeepSound() {
if (playBeep && mediaPlayer ==null) {
// The volume on STREAM_SYSTEM is not adjustable, and users found it
// too loud,
// so we now play on the music stream.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mediaPlayer =new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnCompletionListener(beepListener);
AssetFileDescriptor file = getResources().openRawResourceFd(
R.raw.beep);
try {
mediaPlayer.setDataSource(file.getFileDescriptor(),
file.getStartOffset(), file.getLength());
file.close();
mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
mediaPlayer.prepare();
} catch (IOException e) {
mediaPlayer =null;
}
}
}
privatestaticfinallong VIBRATE_DURATION =200L;
privatevoid playBeepSoundAndVibrate() {
if (playBeep && mediaPlayer !=null) {
mediaPlayer.start();
}
if (vibrate) {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(VIBRATE_DURATION);
}
}
/**
* When the beep has finished playing, rewind to queue up another one.
*/
privatefinal OnCompletionListener beepListener =new OnCompletionListener() {
publicvoid onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(0);
}
};
简化过的包结构图:
简化后的ZXing 更加方便我们了解ZXing项目 是如何解码的。只要仔细查看源码,进行单点跟踪调试,相信大家很容易能理解。
顾客是上帝
很多人留言要源码, 其实我这不是什么源码,我只是把ZXing的东西简化了一下而已。事实上我也不喜欢直接放源码项目,这样大家就不想读ZXing的源码了。
下面是我简化的版本:Zxing简化
很多人需要Core 核心包(其实ZXing的源码里面就有),这里提供下我写文章时的版本 1.6的:
方法二:分别为两个项目:
测试代码如下:
package com.easyway.android; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * 二维码扫码应用实例 * * 1.安装zxing客户端android apk。 * 2.调用相关的zxing * 3.获取相关的执行的结果 * * 如何扫描条形码 * 现在做条形码扫描,java一般用zxing。zxing有多种复用方式,最简单的方式是, *安装zxing软件,通过google market。在自己的应用中,通过Intent调用zxing的扫描条码的Activity, *然后将扫描到的结果返回自己的Activity。 *比较复杂的办法是,将zxing库包含在自己的程序中,这比较适合正式的应用。 * @Title: * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-5-9 * @author longgangbai * @version 1.0 */ public class AndroidScanBarcodeActivity extends Activity implements OnClickListener { private Button button; private TextView textView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.button = (Button) this.findViewById(R.id.btnscan); this.button.setOnClickListener(this); this.textView = (TextView) this.findViewById(R.id.txtScan); } @Override public void onClick(View view) { //调用对应的扫描方法 Intent intent = new Intent("com.google.zxing.client.android.SCAN"); this.startActivityForResult(intent, 0); } /** * 获取扫描的结果 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode != 0) { this.textView.setText(R.string.noresult); return; } if(resultCode==RESULT_OK){ String contents = intent.getStringExtra("SCAN_RESULT"); String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); textView.setText(" 条形码为:"+contents+" 条码类型为: "+format);//利用页面的textveiw显示扫描后的结果 } else if (resultCode == RESULT_CANCELED) { } } }
源代码下载:
- AndroidScanBarcode.rar (49.4 KB)
- 下载次数: 113
发表评论
-
[转]年度最实用50款免费Android应用推荐
2012-11-08 16:39 3398据国外媒体报道,有人说Android应用市场比iPhone应用 ... -
GIS的学习(四十五)【转】Integration of the MBTiles format on Android
2012-10-22 17:13 2961转载自 http:/ ... -
GIS的学习(四十四)osmdroid sdcard检查
2012-10-15 16:12 2354在许多应用中使用到sdcard的检查,在osmdro ... -
GIS的学习(四十三)osmdroid基于几个经典代理类
2012-10-15 16:06 2646在osmdroid中给基于位置的代理类如下: pack ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-10-12 14:12 11560在Android中有很多级别的Window,不同级别的Wind ... -
【转】Android根据分辨率进行单位转换-(dp,sp转像素px)
2012-10-11 09:18 27151Android系统中,默认的单位是像素(px)。也就是说,在没 ... -
GIS的学习(二十九)Osmdroid 离线地图存放位置的研究和详细分析
2012-09-23 11:49 11612在手机通过osmdroid调用离线地图必须放在 ... -
GIS的学习(二十八)Osmdroid相关的开源项目
2012-09-23 11:31 25490osm 数据格式(openstreet map)与Ro ... -
GIS的学习(二十七)通过geoserver的georss访问第三方地图
2012-09-23 00:34 3617在geoserver中如果想调用第三方地图可以采 ... -
android中使用 定时更新界面定时器Timer的使用
2012-09-22 22:09 25545handler的使用 一、Handler的定义: ... -
【转】Android应用程序的自动更新升级(自身升级、通过tomcat) .
2012-09-16 15:03 7384http://blog.csdn.net/mu0206mu/a ... -
GIS的学习(二十七)OGC 的WCS WFS 及WMS 服务
2012-09-11 22:22 12169http://www.gisall.com/?6678/v ... -
GIS的学习(二十六)geotools 使用 部分代码总结
2012-09-11 22:20 5776前段时间的一个项目 本来用ae完成了种种的 查询,空间分析等等 ... -
GIS的学习(二十五)geoserver wms中的各种操作API详细讲解和使用
2012-09-10 17:42 9730官方geoserver中WMS服务中几种操作的API的详细说明 ... -
GIS的学习(二十四)android异步调用geoserver wms中的地图
2012-09-10 17:38 8197在geoserver的客户端通过wms的GetMap实现 ... -
GIS的学习(二十三)geoserver中CQL和ECQL的使用
2012-09-10 16:29 6673以下引用自官方文档: CQL and ECQL¶ CQ ... -
GIS的学习(二十二)osmdroid中添加縮放控件
2012-09-06 23:09 2798package com.geoserver.osmdroid; ... -
GIS的学习(二十一)在osmdroid 地图中添加marker 并添加事件
2012-09-06 22:27 6677我有 osmdroid,overlayswithf ... -
GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询
2012-08-30 18:48 11436基于Geoserver发布的wfs服务,与Openlayers ... -
GIS的学习(十九)Geoserver使用添加,删除,查询地图中的POI
2012-08-30 17:28 10382在geoserver自定义的地图中通过geoserver ...
相关推荐
南信大实验报告封面(Word版)专为英文课程设计,提供简洁、规范的模板,方便学生快速填写实验信息。适用于各类实验报告,确保格式统一,提升报告的专业性。下载后可直接编辑,节省时间,助力高效完成实验任务。
基于树莓派5使用L298N驱动模块驱动电机
甜面酱检验表格(食品企业原辅料质量验收记录表).docx
复现一篇nano letters,基于传输相位的双通道全息超表面,能掌握gs算法,传输相位,单元库的制备等知识 ,核心关键词:复现nano letters; 传输相位; 双通道全息超表面; GS算法; 单元库制备,复现Nano Letters双通道全息超表面:掌握GS算法与传输相位技术
《电力电子技术(第5版)》王兆安_第2章_电力电子器件
红曲红色素检验表格(食品添加剂食用香精质量验收记录表).docx
IMU和GPS融合 ekf融合定位 从matlab到c++代码实现 组合导航松耦合融合 34页超级详细的文档,对每个函数都进行了非常详细的讲解分析 ,IMU_GPS融合; EKF融合定位; 松耦合融合; Matlab到C++代码转换; 34页详细文档,IMU与GPS融合定位:Ekf算法从Matlab到C++的实现与解析
【CSP备考宝典】精选CCF计算机软件能力认证历年模拟考试题解,提供详细解析与高效备考策略,助你快速掌握考点,提升应试能力。无论你是初学者还是进阶者,这份指南都能为你指明方向,轻松应对CSP认证考试。
储能变流器pcs整流器仿真模型,联系默认发百度,ANPC电路拓扑,2.5MW,电压外环,电流内环,2016版本的matlab ,关键词:储能变流器; PCS整流器; 仿真模型; 联系默认发百度; ANPC电路拓扑; 2.5MW; 电压外环; 电流内环; 2016版Matlab;,储能变流器2.5MW整流器模型与ANPC电路拓扑的仿真研究
apollo 泊车轨迹优化代码 hybridastar+iaps平滑优化+obca平滑优化 第一个图是matlab绘制 后面的图是程序用sdl库绘制 ,apollo;泊车轨迹优化;hybridastar;iaps平滑优化;obca平滑优化;Matlab绘制;SDL库绘制,基于Apollo的泊车轨迹优化:HybridA*算法+平滑优化技术的实现与展示
对酒苏奥多资源尿酸
内容概要:本文基于Rayleigh梁理论,探究了湿热环境下具有弹性支撑根部的旋转复合材料非均匀梁的振动特性和动态响应。文中建立了考虑温度、湿度和其他参数对自然频率和动态响应影响的运动方程。运用哈密顿变分原理推导出该系统的控制方程,并基于最小势能原理获取弯曲基本频率的上界和下界。最终利用幂级数方法求解出半解析形式的自然频率和动态响应表达式。数值计算部分展示了不同条件下(如转速、根半径、纤维倾角比)对该系统的影响。 适合人群:从事复合材料力学性能研究的研究员、工程师以及机械工程专业高年级本科生和研究生。 使用场景及目标:该论文对于涉及航天航空领域的轻质高强度叶片结构的设计有重要的指导意义。通过对实际应用条件(如风力涡轮机翼型、直升机螺旋桨、飞机推进器)下非均匀截面复合材料梁的行为研究,可以更好地优化其形状设计和增强抗振能力。具体来说,本研究旨在解决因工作环境中复杂变化引起的材料属性和动力行为改变的问题。 其他说明:本文结合了前人大量研究成果进行了扩展性探讨,并通过对比有限元法验证了所提出的功率级数方法的有效性。同时提供了详细的理论模型推导过程及其应用背景介绍。
苹果酸检验表格(食品添加剂食用香精质量验收记录表).docx
内容概要:本文研究了一类含有混合阶次动力学、外部扰动以及执行器故障的异构多智能体系统的领导-跟随一致性跟踪问题。首先提出一种基于高阶滑模观测器和双层自适应规则相结合的新颖有限时间观测器实现了对未知扰动和故障快速估计与补偿。然后引入新颖滑模面实现固定时间一致协议并解决其奇异性问题,同时为各从动节点的一阶或二阶动力学设计分布式控制器确保与领导者节点同步化状态收敛。最后用仿真实验验证了所提算法的有效性和优越性。 适合人群:具备自动控制理论、系统工程、机器人学等相关背景的研究人员、博士生或高级工程师。 使用场景及目标:该研究适用于无人飞行器队形保持、移动传感器网络定位校准等多种实际工业应用场景,在外部扰动与自身可能发生的部分故障条件下仍然能够使不同动态特征的多个个体达到理想的协调行动。 其他说明:本文提出的非奇异固定时间观测和容错控制机制提高了多智能体系统鲁棒性能,克服了传统方法难以同时处理多种不确定因素(如随机噪声、建模误差)及复杂任务环境的影响的问题。此外,在具体应用过程中需要关注观测精度及时延特性等因素优化控制系统设计参数。
comsol声子晶体建模文件教程,带隙计算,传输损耗计算 ,comsol;声子晶体建模;文件教程;带隙计算;传输损耗计算,COMSOL声子晶体建模与传输损耗计算教程
SYT 5420-91 石油勘探开发仪器基本环境试验方法 试验D:低温试验.pdf
系统采用B/S架构,集成Spring Boot(后端)、Vue.js(前端)和MySQL(数据库),通过RESTful API实现前后端分离。采用MyBatis-Plus优化数据访问,模块化设计与自动配置提升开发效率,结合数据库索引和读写分离确保性能,Element UI提供友好交互,整体具备高扩展性和可维护性。
UniApp开发前景分析:专业视角引领未来 随着移动互联网的迅猛发展,跨平台应用开发框架UniApp以其独特的优势,展现出广阔的开发前景。 UniApp基于Vue.js,采用一次编写、多端运行的设计理念,极大降低了开发成本和时间。它提供了丰富的原生组件和API封装,保证了应用的原生性能体验,为用户带来流畅的操作感受。 此外,UniApp拥有庞大的社区支持和插件生态系统,为开发者提供了丰富的资源和技术支持。从多级选择器到自定义导航栏,再到二维码生成器,UniApp的控件封装合集为开发者提供了极大的便利。 面向未来,UniApp将继续优化性能,拓展功能,满足更多开发者的需求。如果你正在寻找一个高效、便捷的跨平台开发框架,不妨深入了解UniApp,并查看其丰富的资源文件,开启你的跨平台开发之旅。。内容来源于网络分享,如有侵权请联系我删除。
arm_麒麟系统V10_build-essential离线安装deb包
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。