6 SDK开发指南
1 SDK概述
本章介绍SDK的定义和组成,帮助用户更好的了解SDK。
1.1 SDK 简介
ED-AIC2000系列Camera的SDK是一组软件工具开发包(Software Development Kit),给用户提供上层应用所需的接口,便于对Camera进行二次开发。
ED-AIC2000系列Camera的SDK功能包含Trigger/Tune按键的定义、12-Pin M12接口中的DI的定义、激光开关的控制、状态指示灯的控制、报警指示灯的控制、2路DO的控制、灯光和灯源的控制、相机工作模式的设置、相机曝光时间的设置、相机增益的设置和图像数据的处理。
SDK在整个Camera系统中的位置如下图所示。
1.2 SDK组成
Camera的SDK是由多个头文件和库文件组成的,具体文件名和安装路径如下表。
功能类型 | 文件类型 | 文件名 | 安装路径 |
---|---|---|---|
IO控制 | 头文件 | eda-io.h | /usr/include/eda/ |
库文件 | libeda_io.so | /usr/lib/ | |
Camera Senso控制 | 头文件 | camera.h | /usr/include/eda/ |
CameraManger.h | |||
camera_0234.h | |||
camera_2311.h | |||
库文件 | libeda_camera.so | /usr/lib/ |
在开发过程中用户可以根据实际需要实现的功能,参考下文对应的功能代码来完成上层应用的开发。
2 功能说明
本章介绍各项功能对应代码的编写方法,帮助用户编写上层应用所需要的代码。
2.1 IO控制(C++)
本节介绍指示灯控制、激光控制、事件监听和输出控制等的具体操作。
2.1.1 流程图
2.1.2 获取实例并初始化
在操作IO前需要先获取IO实例并对实例进行初始化,操作步骤如下。
- 获取IO实例。
eda::EdaIo *em = eda::EdaIo::getInstance();
- 对实例进行初始化。
em->setup();
2.1.3 事件回调
IO控制支持对事件注册回调函数,包含注册Input信息、注册Trigger按键和注册Tune按键。
- DI1触发事件
em->registerInput(trigger_input);
12-Pin M12接口中的COMMON_IN引脚接地,DI1引脚接5V触发
- 注册Trigger按键
em->registerTrigger(trigger_trigger);
- 注册Tune按键
em->registerTune(trigger_tune);
举例:
#include "eda/eda-io.h"
void trigger_input(int b){
printf("[Test] Tirgger input: %d\n", b);
}
int main(int argc, char *argv[]){
eda::EdaIo *em = eda::EdaIo::getInstance();
em->registerInput(trigger_input);
em->setup();
....
}
2.1.4 控制IO
通过IO来控制激光的开/关、状态指示灯的点亮/熄灭、报警指示灯的点亮/熄灭和2路输出信号的使能/禁用。
前提条件:
已完成实例的初始化。
操作说明:
- 控制激光
em->openLaser();
em->closeLaser();
- 控制状态指示灯
em->setScanStat(true);
em->setScanStat(false);
- 控制警报指示灯
em->openAlarm();
em->openAlarm();
- 控制2路输出信号
em->setDo1High(false);
em->setDo2High(false);
2.1.5 控制灯光
Camera侧面灯和区域灯均可独立控制。
前提条件:
已完成实例的初始化。
操作说明:
控制侧灯颜色
em->setRgbLight(1);
- 0: 关闭
- 1: 红色
- 2: 绿色
- 3: 蓝色
控制侧灯RGB颜色
void setRgbLight_rgb(uint8_t r, uint8_t g, uint8_t b);
控制灯源
- 使能(默认状态为使能)
em->enableLightSection(1);
取值范围为1~4,分别对应不同的分区
- 禁用
em->disableLightSection(1);
取值范围为1~4,分别对应不同的分区
灯源的使能/禁用不是打开/关闭灯源,灯源与摄像头是联动的,只有当灯源已使能且摄像头打开的条件下灯源才会亮。
2.1.6 源文件
IO控制Class(C++语言)
typedef void (*IoTrigger)(int level);
class EdaIo{
public:
static EdaIo* getInstance();
static void close_io();
~EdaIo();
/**
* @brief 打开激光
*
*/
void openLaser();
/**
* @brief 关闭激光
*
*/
void closeLaser();
/**
* @brief 设置状态指示灯
*
* @param good
*/
void setScanStat(bool good);
/**
* @brief 打开alarm 指示灯
*
*/
void openAlarm();
/**
* @brief 关闭alarm 指示灯
*
*/
void closeAlarm();
/**
* @brief
*
* @param section 1~4
* @return int
*/
int enableLightSection(int section);
/**
* @brief
*
* @param section 1~4
* @return int
*/
int disableLightSection(int section);
/**
* @brief 设置output1 输出 [高/低]
*
* @param high
*/
void setDo1High(bool high);
/**
* @brief 设置output2 输出 [高/低]
*
* @param high
*/
void setDo2High(bool high);
// void setAimerColor(RGBColor color);
/**
* @brief 注册input触发回调函数
*
* @param callback
*/
void registerInput(IoTrigger callback);
/**
* @brief 注册register按键 回调函数
*
* @param callback
*/
void registerTrigger(IoTrigger callback);
/**
* @brief 注册Tune按键 回调函数
*
* @param callback
*/
void registerTune(IoTrigger callback);
/**
* @brief set RGB light
*
* @param light 0: Close; 1: Red; 2: Green; 3: Blue,
* @return int
*/
void setRgbLight(uint8_t light);
/**
* @brief Set the RGB Light
*
* @param r red
* @param g green
* @param b blue
*/
void setRgbLight_rgb(uint8_t r, uint8_t g, uint8_t b);
/**
* @brief 初始化IO 设置
*
*/
void setup();
};
2.2 IO控制(Python)
本节介绍指示灯控制、激光控制、事件监听和输出控制等的具体操作。
2.2.1 流程图
2.2.2 导入模块
在操作IO前需要先导入模块。
from libedaio import EdaIo,registerInput,registerTrigger,registerTune
2.2.3 获取实例并初始化
在操作IO前需要先获取IO实例并对实例进行初始化,操作步骤如下。
- 获取IO实例。
eda = EdaIo.singleton();
- 对实例进行初始化。
eda.setup();
2.2.4 事件回调
IO控制支持对事件注册回调函数,包含注册Input信息、注册Trigger按键和注册Tune按键。
- DI1触发事件
registerInput(func_input);
12-Pin M12接口中的COMMON_IN引脚接地,DI1引脚接5V触发
- 注册Trigger按键
registerTrigger(func_trigger);
- 注册Tune按键
registerTune(func_tune);
举例:
#!/usr/bin/python3
from libedaio import EdaIo,registerInput
def func_input(v):
print("[Debug] Trigger: input!", v)
def main() -> int:
eda = EdaIo.singleton();
registerInput(func_input)
eda.setup()
…
if __name__ == "__main__":
main()
2.2.5 控制IO
通过IO来控制激光的开/关、状态指示灯的点亮/熄灭、报警指示灯的点亮/熄灭和2路输出信号的使能/禁用。
前提条件:
已完成实例的初始化。
操作说明:
- 控制激光
eda.openLaser();
eda.closeLaser();
- 控制状态指示灯
eda.setScanStat(true);
eda.setScanStat(false);
- 控制警报指示灯
eda.openAlarm();
eda.openAlarm();
- 控制2路输出信号
eda.setDo1High(false);
eda.setDo2High(false);
2.2.6 控制灯光
Camera侧面灯和区域灯均可独立控制。
前提条件:
已完成实例的初始化。
操作说明:
控制侧灯颜色
eda.setRgbLight(1);
- 0: 关闭
- 1: 红色
- 2: 绿色
- 3: 蓝色
控制灯源
- 使能(默认状态为使能)
eda.enableLightSection(1);
取值范围为1~4,分别对应不同的分区
- 禁用
eda.disableLightSection(1);
取值范围为1~4,分别对应不同的分区
灯源的使能/禁用不是打开/关闭灯源,灯源与摄像头是联动的,只有当灯源已使能且摄像头打开的条件下灯源才会亮。
2.2.7 源文件
IO控制(Python3)
from libedaio import EdaIo,registerInput,registerTrigger,registerTune
def func_trigger(v):
print("[Debug] Trigger: trigger button!", v)
...
eda = EdaIo.singleton(); # 获取IO控制实例
registerTrigger(func_trigger); # 注册Trigger 按键回调
# registerInput(func_trigger); # 注册Input输入回调
# registerTune(func_trigger); # 注册Tune 按键回调
eda.setup(); # 初始化
...
eda.openLaser(); # 打开激光
# eda.closeLaser(); # 关闭激光
eda.setScanStat(True); # 设置状态指示灯
eda.openAlarm(); # 打开警告指示灯
# eda.closeAlarm(); # 关闭警告指示灯
eda.setDo1High(True); # 设置第一路输出
eda.setDo2High(False); # 设置第二路输出
eda.setRgbLight(1); # 设置侧灯,0: 关闭; 1: 红色; 2: 绿色; 3: 蓝色
2.3 Camera Sensor控制(C++)
本节介绍打开/关闭camera、设置相机工作模式、设置相机曝光时间和设置相机增益等的具体操作。
2.3.1 流程图
2.3.2 操作步骤
在操作Camera之前,需要先获取IO实例并初始化(具体操作参见2.1.2 获取实例并初始化),再进行如下操作。
- 获取实例
eda::Camera *t_camera = eda::load_default();
- 查询Sensor类型
t_camera->name()
eda::CameraName::AR0234
eda::CameraName::OV2311
AR0234表示230万像素的Camera
OV2311表示200万像素的Camera
- 打开摄像头并设置工作模式、摄像头区域宽和摄像头区域高。
t_camera->open(mod, width, height);
mod表示工作模式,取值包含0、1和5
0表示连续模式(一直打开摄像头),AR0234和OV2311均支持
1表示硬件触发模式,AR0234和OV2311均支持,通过Trigger引脚接5V触发
5表示软件触发模式,仅OV2311支持,通过手动调节来触发
int call_trigger();
width表示摄像头区域宽度
height表示摄像头区域高度
- 设置增益
t_camera->set_gain(gain);
- OV2311:gain取值范围为0~30
- AR0234:gain取值范围为0~64
- 设置曝光
t_camera->set_exposure(exposure);
- OV2311:exposure取值范围为0~65523,单位为us
- AR0234:exposure取值范围为1~1500, exposure的值乘以6.8后的值的单位是us)
- 通过回调方式获取摄像头数据
t_camera->callback_image_ready(image_callback);
回调函数中,推荐只获取数据不处理逻辑。
- 关闭摄像头
eda::EdaIo::close_io();
2.3.3 源文件
Sensor控制
typedef int(*img_Callback)(char *img_buff, int img_len);
enum CameraName{
AR0234, OV2311
};
class Camera
{
public:
/**
* @brief 初始化摄像头
*
* @param mode 0 - 连续工作模式; 1 - 硬件触发模式; 5 - 软件触发模式
* @param width
* @param height
* @return int
*/
int open(int mode, int width, int height) = 0;
/**
* @brief 关闭摄像头
*
* @return int
*/
int close() = 0;
/**
* @brief 设置曝光时间
*
* @param exp_value
* @return int
*/
int set_exposure(int exp_value) = 0;
/**
* @brief 获取曝光时间
*
* @param exp_value
* @return int
*/
int get_exposure(int *exp_value) = 0;
/**
* @brief 设置增益
*
* @param gain_value
* @return int
*/
int set_gain(int gain_value) = 0;
/**
* @brief 获取增益
*
* @param gain_value
* @return int
*/
int get_gain(int *gain_value) = 0;
/**
* @brief 注册回调函数,获取图像数据
*
* @param callback
* @return int
*/
int callback_image_ready(img_Callback callback)=0;
CameraName name() = 0;
};
获取AR0234实例
#include "CameraManger.h"
#include "camera_0234.h"
void test()
eda::Camera *t_camera = eda::create_ar0234();
if(t_camera){
eda::Camera_0234 *t_camera_1 = static_cast<eda::Camera_0234*>(t_camera);
}
...
}
2.4 Camera Sensor控制(Python)
本节介绍打开/关闭camera、设置相机工作模式、设置相机曝光时间和设置相机增益等的具体操作。
2.4.1 流程图
2.4.2 操作步骤
在操作Camera之前,需要先导入IO模块再获取IO实例并初始化(具体操作参见2.2.2 导入模块和2.2.3 获取实例并初始化),再进行如下操作。
- 导入模块
from libedacamera import EdaCamera
- 获取实例
eda = EdaCamera.load_default();
- 查询Sensor类型
eda.get_name();
return “AR0234”
return “OV2311”
AR0234表示230万像素的Camera
OV2311表示200万像素的Camera
- 打开摄像头并设置工作模式、摄像头区域宽和摄像头区域高。
ret = eda.open(t_mode,t_width, t_height);
t_mode表示工作模式,取值包含0、1和5
0表示连续模式(一直打开摄像头),AR0234和OV2311均支持
1表示硬件触发模式,AR0234和OV2311均支持,通过Trigger引脚接5V触发
5表示软件触发模式,仅OV2311支持,通过手动调节来触发
eda.call_trigger();
t_width表示摄像头区域宽度
t_height表示摄像头区域高度
- 设置增益
eda.set_gain(int(t_gain));
- OV2311:t_gain取值范围为0~30
- AR0234:t_gain取值范围为0~64
- 设置曝光
eda.set_exposure(int(t_exposure));
- OV2311:t_exposure取值范围为0~65523,单位为us
- AR0234:t_exposure取值范围为1~1500, t_exposure的值乘以6.8后的值的单位是us)
- 通过回调方式获取摄像头数据
eda.callback_image_ready(func_image_data);
回调函数中,推荐只获取数据不处理逻辑。
- 关闭摄像头
eda.close();
3 示例
本章介绍具体的操作示例,包含编写代码、编译代码和运行代码。
3.1 编写代码
下文以实现“打开激光等待2s后关闭激光”的功能为例,使用C++语言进行编写代码。
编写的内容如下:
#include "eda/eda-io.h"
#include <unistd.h>
#include "stdlib.h"
int main(int argc, char *argv[]){
eda::EdaIo *em = eda::EdaIo::getInstance();
em->setup();
//打开激光
em->openLaser();
sleep(2);
// 关闭激光
em->closeLaser();
eda::EdaIo::close_io();
return 0;
}
编写完成后,保存为test123.cpp文件。
提示
文件名自定义即可。
3.2 编译和运行代码
C++代码编写完成后需要登录Camera设备,在Raspberry Pi系统上进行编译和运行。
前提条件:
- 已完成Camera的硬件部分的连线,具体的操作请参见《ED-AIC2020用户手册》。
- 已将Camera上电并正常接入网络。
- 已获取Camera IP地址,并成功登录Camera系统。
操作步骤:
在Camera系统上创建一个文件夹,将章节3.1 编写代码中编写的代码文件上传至文件夹中。
执行ls
命令,查看文件夹中的文件,确保代码文件已上传成功。
- 执行如下命令,对编写的代码进行编译。
g++ -l eda_io -o test-io test123.cpp
test123.cpp
:表示章节3.1 编写代码中编写的代码文件。
test-io
:表示编译后生成的文件名(可自定义)
执行ls
命令,查看编译后生成的新文件,如下图test-io
。
执行如下命令,运行编译后的代码。
sudo ./test-io
test-io
:表示编译后生成的文件名。
提示
运行成功后,可以看到激光点亮且等待2s后熄灭。