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实例并对实例进行初始化,操作步骤如下。

  1. 获取IO实例。

eda::EdaIo *em = eda::EdaIo::getInstance();

  1. 对实例进行初始化。

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实例并对实例进行初始化,操作步骤如下。

  1. 获取IO实例。

eda = EdaIo.singleton();

  1. 对实例进行初始化。

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 获取实例并初始化),再进行如下操作。

  1. 获取实例

eda::Camera *t_camera = eda::load_default();

  1. 查询Sensor类型

t_camera->name()

  • eda::CameraName::AR0234
  • eda::CameraName::OV2311

​ AR0234表示230万像素的Camera

​ OV2311表示200万像素的Camera

  1. 打开摄像头并设置工作模式、摄像头区域宽和摄像头区域高。

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表示摄像头区域高度

  1. 设置增益

t_camera->set_gain(gain);

  • OV2311:gain取值范围为0~30
  • AR0234:gain取值范围为0~64
  1. 设置曝光

t_camera->set_exposure(exposure);

  • OV2311:exposure取值范围为0~65523,单位为us
  • AR0234:exposure取值范围为1~1500, exposure的值乘以6.8后的值的单位是us)
  1. 通过回调方式获取摄像头数据

t_camera->callback_image_ready(image_callback);

​ 回调函数中,推荐只获取数据不处理逻辑。

  1. 关闭摄像头

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 获取实例并初始化),再进行如下操作。

  1. 导入模块

from libedacamera import EdaCamera

  1. 获取实例

eda = EdaCamera.load_default();

  1. 查询Sensor类型

eda.get_name();

  • return “AR0234”
  • return “OV2311”

​ AR0234表示230万像素的Camera

​ OV2311表示200万像素的Camera

  1. 打开摄像头并设置工作模式、摄像头区域宽和摄像头区域高。

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表示摄像头区域高度

  1. 设置增益

eda.set_gain(int(t_gain));

  • OV2311:t_gain取值范围为0~30
  • AR0234:t_gain取值范围为0~64
  1. 设置曝光

eda.set_exposure(int(t_exposure));

  • OV2311:t_exposure取值范围为0~65523,单位为us
  • AR0234:t_exposure取值范围为1~1500, t_exposure的值乘以6.8后的值的单位是us)
  1. 通过回调方式获取摄像头数据

eda.callback_image_ready(func_image_data);

​ 回调函数中,推荐只获取数据不处理逻辑。

  1. 关闭摄像头

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命令,查看文件夹中的文件,确保代码文件已上传成功。

  1. 执行如下命令,对编写的代码进行编译。
  2. g++ -l eda_io -o test-io test123.cpp

test123.cpp:表示章节3.1 编写代码中编写的代码文件。

test-io:表示编译后生成的文件名(可自定义)

执行ls命令,查看编译后生成的新文件,如下图test-io

执行如下命令,运行编译后的代码。

sudo ./test-io

test-io:表示编译后生成的文件名。

提示

运行成功后,可以看到激光点亮且等待2s后熄灭。