新闻  |   论坛  |   博客  |   在线研讨会
利用Java实现对云台和镜头的远程控制
gsfei2009 | 2009-05-25 21:48:58    阅读:714   发布文章

          摘要:结合我国实际情况和未来的发展趋势, 开发出基于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、设定参数
     设定串口的物理参数:波特率、数据长度、数据的停止位长度和数据校验类型L根据Pelco2D协议设置波特率为4 800 b it/s,1位起始位和1位停止位,8位数据位,无校验:
t ry{
 serialPo rt. setSerialPo rtParam s(2400,
 SerialPo rt. DA TAB ITS- 8,
 SerialPo rt. STO PB ITS- 1,
 SerialPo rt. PAR ITY- NON E);
 }catch (U nsuppo rtedCommOperat ionExcep t ion e)
 {. . . . . . }
      三、网络控制
     1、Socket通信
     采用Socket(套接字)通信。Socket是实现客户机与服务器进行通信的一种机制,它是2台计算机进行通信的端口。在Java程序中,可以将Socket类 function ImgZoom(Id)//重新设置图片大小 防止撑破表格 { var w = $(Id).width; var m = 550; if(w  
     和ServerSocket类分别用于客户机和服务器中,分别创建独立的Socket,将2个Socket进行连接,实现连接后,就可以通过Socket进行通信[6]。
在本系统中,服务器端起一线程进行监听,一旦收到客户端对服务器的指定端口发出的请求,即根据客户端传来的指令来控制云台和镜头。客户端通过发送字符串与服务器端匹配控制命令。如控制云台向上,则客户端:
public vo id up () {
t ry{
Socket mysocket= new Socket ( InetA ddress. getLocal2
Ho st () , 5678);
mysocket. getO utputSt ream ( ). w rite ( " up ". getBytes
() );
mysocket. clo se ();
}catch ( IO Excep t ion e) {
e. p rintStackT race ();
}
}
服务器端:
if (command. equals ("up " ) ) {
. . . . . .
??实现向上操作
}
     用户只需在界面中点击"上"、"下"、"左"、"右"等命令按钮,系统即向服务器发送命令。
     2、控制冲突的解决
     当有多个客户端同时登陆并控制云台,或服务器端和客户端同时控制云台,便会发生控制冲突。解决控制冲突的策略是设置控制状态。客户端对云台或镜头的控制是通过服务器端进行的。 客户端若要发送云台或镜头控制命令,必须首先向服务器端发送控制申请命令,服务器在接收到客户端控制申请命令后,就会检查控制状态。
     (1)当没有控制申请的时候控制状态为空,服务器接受控制申请;当云台和镜头正在被控制,控制状态为忙,申请控制需要等待,服务器将通知正在控制的用户。
     (2)正在控制的用户若在15min内无控制操作,服务器端自动解除控制,若要继续控制则要重新申请。
     (3)若申请控制的是服务器端,服务器会告知正在操作的客户端将在1min内退出。
      四、实现方法
      根据Pelco-D协议,对云台和镜头的控制,实质是通过串口对解码器输入一个包含七位数据码的数组,解码器通过所输入的数据码对云台及镜头进行控制建立好协议的主体,就可以建立一个控制窗口界面,实现各种控制功能,使用户在客户端方便地进行监控。如要建立云台上、下、左、右的控制,则在界面中建立4个控制按钮并分别实现对应的消息。
     以下是实现控制云台向左转动的程序:
public stat ic vo id main (St ring[ ] args)
{
PelcoD pelcoD= new PelcoD ();
addressin= 0x01;
speeding= 0x20;
//获得数据码流
byte [ ] messagesend= pelcoD. CameraT ilt (addressin,
PelcoD. Pan. L eft. getV alue () , speedin);
  t ry{
//写入数据码流
out. w rite (messagesend, 0, 7);
}catch ( IO Excep t ion e)
{. . . . . . }
catch (N ullPo interExcep t ion e)
{. . . . . . }
//关闭串口
serialPo rt. clo se ();
}
发送数据码流的例子:
如第1 个云台, 开启摄像机: FF, 01, 88, 00, 00,
00, 89;
第2 个云台, 关闭摄像机: FF, 02, 08, 00, 00,
00, 09;
第2 个云台, 以最大速度的一半左转: FF, 02,
00, 04, 00, 20, 26;
第2 个云台, 停止: FF, 02, 00, 00, 00, 00, 02;
第10 个云台,开启摄像机,焦距拉远,左转:
FF, 0A , 88, 90, 00, 40, 62。
     五、结束语
      本系统利用Java串口通信,实现了对云台和镜头的控制。软件具有工作于多种操作系统的性能,用户可随时随地通过IP网控制监控现场,使监控网络的互通成为现实,为现代视频监控提供一种可行方案。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客