利用Java实现对云台和镜头的远程控制 (1)

2008-03-11 11:08:55   来源:互联网   

关键字:Java;云台;镜头;解码器

    摘要:结合我国实际情况和未来的发展趋势, 开发出基于Java的视频监控系统,实现对云台和镜头的远程控制。系统包括RS-232/RS-485 的转换,解码器和云台、镜头以及它们与计算机串口的硬件连接,通过Pelco-D协议,采用Java的扩展类库comm.Jar库进行串口通信。

    随着银行、宾馆、交通要道等大型场所和小区管理的发展,安全成为至关重要的问题。在此情形下,高性能的数码监控系统成为各应用部门所关心的热点。对于数码监控系统来说,其主要功能是将监控现场的场景转换成视频信号传递给计算机进行处理。为了加大监控范围,提高控制效率,一方面可以增加摄像机的数目,另一方面也可以在监控系统中配置具有云台和镜头调节功能的高性能摄像机,以便在视频信号的采集过程中,可以通过服务器端或客户端对摄像机的摄像角度和镜头实施控制[1]。另外,在科技飞速发展的今天,各种犯罪手段也层出不穷,通过网络对监控现场的云台及镜头进行控制和调节,并进行记录,对于警方破案尤为重要。
现在的许多视频监控系统是采用VC开发,而基于Java开发的远程监控系统并不多见。由于Java的平台无关性和天生完整的网络支持,Java在网络通信中得到广泛应用。本系统开发出基于Java的视频监控系统,通过串行通信及Pelco-D协议,实现对云台与镜头的远程控制。凭着Java跨平台的优点,基于Java开发的视频监控系统有望移植到手机平台。
       一、系统设计
     远程视频监控系统结构如图1所示。
     1、RS-232/RS-485转换器
     计算机的COM口采用的是RS-232 通信方式,本系统所采用的云台解码器的通讯接口为RS-485,因此需在计算机COM口接一个RS-232/RS-485转换器。RS-232-C(又称EIA RS-232-C)接口是目前最常用的一种串行通讯接口,是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准[2]。 RS-485由RS-232发展而来,弥补了RS-232的不足。 RS-232是点对点的通信,不能实现多机之间相互通信,而RS-485就可以实现多机通信。另外,RS-232的最大传输距离为15m,而R-2485则可达1.2km。转换器可使计算机与云台解码器之间构成点到点、点到多点的远程多机通信网络,实现多机应答通信。


      2、解码器
      本系统采用智能解码器,具有较强抗干扰、低功耗、防死机和强驱动力等优点,能自动识别国内大多数常用协议,包括特殊协议,如科力矩阵协议、EE矩阵协议和曼码矩阵协议等。在云台解码器中,通过跳线设置波特率、特殊协议及云台地址,由串口与服务器端计算机进行通信。解码器的主要作用是:通过串口接收服务器端计算机的控制码,并对此控制码进行地址和命令解析,将解析的命令转换成相应的能够驱动云台转动的控制电压,再传递给云台以控制云台的转动、摄像机镜头的调节及停止操作[3]
     3、云台和镜头
     云台由摄像头支架和驱动器组成。驱动器的作用是通过步进电机来驱动摄像头支架的转动,从而带动摄像头的转动。 一个高性能摄像机云台可以使支架向多个方向(上、下、左、右、左上、左下、右上和右下等)转动,并可以调节摄像头的焦距、光圈、景深等。通过解码器以及解码器的控制协议,可以对云台和镜头进行控制。
     4、解码器的控制协议
     (1)Pelco-D协议
     由于所采用的解码器可识别大多数常用协议,本系统选用了Pelco-D作为控制协议。Pelco-D协议一般用于矩阵和其他设备之间的通信。PTZ在安防监控中是"pan/t ilt/zoom "的简写, 代表云台全方位(上、下、左、右)移动及镜头变倍和变焦控制。以普通监控控制PTZ为例,一般采用多芯连线,控制器以开关触点控制云台、镜头各个方向的连接供电,以达到云台移动、镜头变倍的目的。协议分为一般PTZ命令及扩展命令。一般PTZ命令的格式为一个含7个元素的message数组,每个元素就是一个字节(byte),byte1,byte 2,...,byte7分别对应同步字、地址码、命令字1、命令字2、数据1、数据2和校验码。每个字节不同的位(bit)设置分别代表不同的控制命令。同步字通常都是FF;地址码是指与矩阵通信的那台设备的逻辑地址,可以在设备中设置;命令字1和命令字2的bit0,bit1,...,bit7的不同设置分别对应镜头和云台的不同操作;数据1表示镜头左右平移的速度,数值从$00(停止)到$3F(高速),另外还有一个值是$FF,表示最高速;数据2表示镜头上下移动的速度,数值从$00(停止)到$3F(最高速);校验码是指byte2到byte6这5个数的和(若超过255,则除以256,然后取余数)[4]
      扩展命令是由byte3至byte6这4个字节分别对应协议中定义的各个控制指令, 例如预设、清屏、自动对焦等。
      (2)用Java实现Pelco-D协议
PelcoD. java对命令字1、命令字2、数据1和数据2的定义:
//command1
p rivate final byte FocusN ear = 0x01;
p rivate final byte IrisOpen = 0x02;
p rivate final byte IrisClo se = 0x04;
p rivate final byte CameraO nO ff = 0x08;
p rivate final byte A utoM anualScan = 0x10;
p rivate final sho rt Sense = 0x80;
//command2
p rivate final stat ic byte PanR igh t = 0x02;
p rivate final stat ic byte PanL eft = 0x04;
p rivate final stat ic byte T iltU p = 0x08;
p rivate final stat ic byte T iltDow n = 0x10;
p rivate final byte ZoomTele = 0x20;
p rivate final byte ZoomW ide = 0x40;
p rivate final byte FocusFar = 0x80;
//data1
p rivate final byte PanSpeedM in = 0x00;
p rivate final byte PanSpeedM ax = 0xFF;
//data2
p rivate final byte T iltSpeedM in = 0x00;
p rivate final byte T iltSpeedM ax = 0x14;
以左右转动为例,写Pan 的类:
public enum Pan{
R igh t ( (byte) 0x02),
L eft ( (byte) 0x04);
p rivate byte value;
p rivate Pan (byte intV alue) {
value= intV alue;
}
public byte getV alue () {
return value;
}
}
控制云台转动,设定云台转动速度:
public byte [ ] CameraPan (byte deviceA ddress, byte act ion,
byte speed)
{
if (speed< = PanSpeedM in)
Speed = PanSpeedM in;
if (speed< PanSpeedM ax)
speed = PanSpeedM ax;
return M essage. GetM essage ( deviceA ddress, ( byte )
0x00, act ion, (byte) speed, (byte) 0x00) ;
}
向串口传递数组:
public stat ic byte [ ] GetM essage (byte address, byte
command1, byte command2, byte data1, byte data2)
{
A ddress = address;
Data1= data1;
Data2= data2;
Command1= command1;
Command2= command2;
CheckSum= (byte) (STX&A ddress&Command1&
Command2&Data1&Data2);
return new byte [ ] {STX, A ddress, Command1, Com2
mand2, Data1,Data2, CheckSum};
      二、Java串口编程
     Sun的J2SE中并没有直接提供串行通信协议的开发包,而是以独立的jar包形式发布在java.sun. com网站上,即comm. jar,称之为Java com-m un ication API,它是J2SE的标准扩展。comm.jar分别提供了对常用的RS-232串行端口和IEEE1284并行端口通讯的支持[5]
      下载了comm.jar开发包后,与之一起的还有2个重要的文件:win32com.dll和javax.comm.Prop-ert iesL comm. jar提供了通讯用的java API,win32com. dll提供了供comm. jar调用的本地驱动接口,而javax. comm. p ropert ies是这个驱动的类配置文件首先将comm. jar复制到\\lib\\ex t目录,再将w in32com. dll复制到JDK 的\\b in目录下,然后将javax.comm.p ropert ies复制到\\lib目录。
      1、打开串口
     使用串口前必先打开串口:
try{
portId = CommPort Ident ifier. getPort Identifier("COM 1" );
serialPort=(SerialPort)port Id. open ("My app", 60);
}catch (Port InU seExcep t ion e)
{. . . . . . }
catch (NoSuchPo rtExcep t ion e)
{. . . . . . }
      2、设定参数
     设定串口的物理参数:波特率、数据长度、

[1] [2]
相关阅读
编辑:ssb
本文引用地址: http://www.eeworld.com.cn/afdz/2008/0311/article_426.html
[发表评论]
[加入收藏]
[告诉好友]
[打印本页]
[关闭窗口]
[返回顶部]
[RSS订阅]

小广播

最热点击

专栏

向农,EEWORLD副总编。被英特尔董事长贝瑞特称为“中国可与之对话的两名记者之一”

【详细】

总编随笔
汤宏琳,人皆称为“汤汤”,电子工程世界高级编辑。随着EEWORLD一起成长。

【详细】

汤汤手记
今年,是中国集成电路产业丰收的一年,相比较往年都有大幅提升。

【详细】

凯哥博客

论坛精华

精选博文