对接海康综合安防管理平台经验总结

2023-05-16

前言:因业务需要对接海康威视的综合安防管理平台获得下属所管理的摄像头,根据摄像头code获得监控视频流信息

1、详情可以浏览海康开放平台,在官网上有对应的接入指南以及开放的API接口【前提是本地已部署了海康视频流媒体服务器】

2、通过海康开放平台我们看到相关的对接指南,进行开发前准备。如下图所示:

在这里插入图片描述

3、AK/SK可以要求甲方提供,如果是驻场开发可以在当前的局域网下通过运管中心的登录名/密码登陆该平台,通过下面的索引步骤来获得 AK/SK。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、获得到 AK/SK后,通过参考开放的API文档,找到项目所需的对用接口,本文所用到的接口主要为:

  • 分页获取区域列表
  • 根据区域获取下级编码设备列表
  • 获取监控点预览取流

5、相应开发代码

  • 引入海康依赖
        <!--海康依赖-->
        <dependency>
            <groupId>com.hikvision.ga</groupId>
            <artifactId>artemis-http-client</artifactId>
            <version>1.1.3</version>
        </dependency>
  • 对应接口的测试代码
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import net.sf.json.JSONObject;

import com.hikvision.artemis.sdk.config.ArtemisConfig;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Orange
 * @version 1.0
 * @Description:调用海康接口获得监控视频流
 * @date 2020/11/16 14:44
 */
public class HkTest {

    private static final Logger logger = LoggerFactory.getLogger(HkTest.class);

    static {
        ArtemisConfig.host = "10.*.1.99:443"; // artemis网关服务器ip端口
        ArtemisConfig.appKey = "25411867";  // 秘钥appkey
        ArtemisConfig.appSecret = "*************";// 秘钥appSecret
    }

    /**
     *设置OpenAPI接口的上下文
     */
    private static final String ARTEMIS_PATH = "/artemis";


    /*
     * @Description: 分页获取区域信息
     * @author: Orange
     * @Param: /api/resource/v1/regions/root
     * @Return: java.lang.String
     * @Date: 2020/11/17 11:21
     */
    public static String getRegionsPageList(int pageNo, int pageSize){

        //获取区域信息路径  /api/resource/v1/regions/root
        final String getRegionsList = ARTEMIS_PATH + "/api/resource/v1/regions";

        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getRegionsList);
            }
        };
        //定义提交类型
        String contentType = "application/json";
        //参数装换
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("pageNo", pageNo);
        jsonBody.put("pageSize", pageSize);
        String body = jsonBody.toString();
        //传参调用方法
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);

        //返回编码信息
        return result;
    }

    /*
     * @Description: 根据区域编号获取下级监控点列表
     * @author: Orange
     * @Param:
     * @Return: java.lang.String
     * @Date: 2020/11/17 11:36
     */
    public static String getCamerasByRegionCode(String regionIndexCode, int pageNo, int pageSize) {

        //根据区域编号获取下级监控点列表路径
        final String getRootApi = ARTEMIS_PATH + "/api/resource/v1/regions/regionIndexCode/cameras";

        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getRootApi);
            }
        };

        String contentType = "application/json";

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("pageNo", pageNo);
        jsonBody.put("pageSize", pageSize);
        jsonBody.put("regionIndexCode", regionIndexCode);
        String body = jsonBody.toString();

        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);

        //返回编码信息
        return result;
    }

    /*
     * @Description: 根据摄像头编码code获得播放流
     * @author: Orange
     * @Param:
     * @Return: java.lang.String
     * @Date: 2020/11/17 13:19
     */
    public static String getCamerasUrlByCode(String cameraIndexCode) {

        final String getCamsApi = ARTEMIS_PATH + "/api/video/v1/cameras/previewURLs";
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getCamsApi);
            }
        };

        String contentType = "application/json";

        net.sf.json.JSONObject jsonBody = new net.sf.json.JSONObject();
        jsonBody.put("cameraIndexCode", cameraIndexCode);//监控点唯一标识
        jsonBody.put("streamType", 0);//码流类型,0:主码流,1:子码流,2:第三码流,参数不填,默认为主码流
        jsonBody.put("protocol", "rtsp");//取流协议,“rtsp”:RTSP协议,“rtmp”:RTMP协议,“hls”:HLS协议
        jsonBody.put("transmode", 1);//传输协议,0:UDP,1:TCP,默认是TCP
        jsonBody.put("expand", "streamform=ps");//扩展内容,格式:key=value
        String body = jsonBody.toString();

        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);

        //返回编码信息
        return result;
    }

    /*
     * @Description: 获取摄像头列表
     * @author: Orange
     * @Param: int
     * @Return: java.lang.String
     * @Date: 2020/11/17 10:32
     */
    public static String getAllRegionInfo(int pageNo, int pageSize) {

        //获取摄像头列表路径
        final String getCameraList = ARTEMIS_PATH + "/api/resource/v1/cameras";

        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getCameraList);
            }
        };
        //定义提交类型
        String contentType = "application/json";
        //参数装换
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("pageNo", pageNo);
        jsonBody.put("pageSize", pageSize);
        String body = jsonBody.toString();
        //传参调用方法
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);
        //返回结果
        return result;
    }

    public static void main(String[] args) {

        //调用获取区域信息接口 JSONObject pa=JSONObject.parseObject(params)
        String regionsPageList = HKGetCamera.getRegionsPageList(1, 100);
        System.out.println( regionsPageList.getClass());

        //根据区域id来获取下属于摄像列表
        Object camerasByRegionCode = HkTest.getCamerasByRegionCode("e2a69da6-e406-4404-b7f5-6101357248fd", 1, 5);

        //根据摄像头code来获得视频流地址
        String camerasUrlByCode = HkTest.getCamerasUrlByCode("7ab2f03ffef245dca9345deb02d12997");

        //获得摄像头列表
        String cameraResult= HkTest.getAllRegionInfo(1,500);
        //打印查看返回信息
        System.out.println("获得区域信息列表:"+ regionsPageList);
        System.out.println("根据区域节点获得摄像头信息:"+ camerasByRegionCode);
        System.out.println("根据摄像头code来获得流:"+ camerasUrlByCode);
        System.out.println("获得摄像头列表:"+ cameraResult);
    }
}
  • 获得接口返回数组中的有效信息,下属代码以获取摄像头 code 以及 视频流 url 举例,
        String regionsPageList = HKGetCamera.getRegionsPageList(1, 100);
        JSONObject jsonObject = JSONObject.parseObject(regionsPageList);
        String data = jsonObject.getString("data");
        JSONObject jsonData = JSONObject.parseObject(data);
        String list = jsonData.getString("list");
        JSONArray jsonArray = JSONObject.parseArray(list);
        ArrayList<String> regionsResult = new ArrayList<>();
        if (Objects.nonNull(jsonArray) && jsonArray.size() > 0) {
            for (Object object : jsonArray) {
                JSONObject parseObject = JSONObject.parseObject(object.toString());
                String cameraIndexCode = parseObject.getString("indexCode");
                //2、将获得的地区信息编码封装到list中
                regionsResult.add(cameraIndexCode);
            }
        }
	for (String regionsCode : regionsResult) {
            String camerasByRegionCode = null;
            try{
                camerasByRegionCode = HKGetCamera.getCamerasByRegionCode(regionsCode, 10, 1);
                JSONObject json = JSONObject.parseObject(camerasByRegionCode);
                String resultData = json.getString("data");
                JSONObject da = JSONObject.parseObject(resultData);
                String url = da.getString("url");
            }catch (Exception e){}

        }

5、对接监控视频流的处理,可以根据接口传参来设置返回结果中的视频流格式。注意:rtsp格式的视频流无法直接在web端进行播放,但是 rtmp格式的视频流可以,部分摄像头支持返回的 rtmp流可以播放,部分不支持,所以要根据实际的业务需求来进行选择,若是摄像头不支持返回可直接播放的 rtmp流,可以将返回的 rtsp格式的视频流经ffmpeg+nginx进行装换为rtmp。但是效率很低,一般不推荐使用。

在这里插入图片描述
在这里插入图片描述

6、参考海康开放 API 时要注意对应海康综合安防管理平台的版本,不同版本间的 API 几乎不可通用,下图举例 1.10 版本对应 V1.0 版本接口

在这里插入图片描述

8、近期所使用的海康综合管理平台升级,由最初使用的1.1.0 升级为1.5.1,因此项目上需要更改视频信息的api版本,海康平台Hikvision AI Cloud默认显示的API为高版本,且支持向下兼容,对应历史版本api在如下位置

在这里插入图片描述

9、为了更快捷的将接口返回的数据信息进行分析整理入库,提供了如下代码,

/*                                           @Description: HkTest工具类补充代码                                         */
    /**
    * @Description: 数据处理
    * @author: 作者
    * @Param:
    * @Return:
    * @Date: 2021/2/3 14:52
    */
    public static JSONArray checkData(String regionsPageList) {
        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(regionsPageList);
        String code = jsonObject.getString("code");
        if (StringUtils.isBlank(code) || !"0".equalsIgnoreCase(code)) {
            return null;
        }
        com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");
        if (ObjectUtil.isNull(data)) {
            return null;
        }
        Integer total = data.getInteger("total");
        JSONArray list = data.getJSONArray("list");
        System.out.println("所有的list 的长度" + list.size());
        return list;
    }



    /**
     * @Description: 数据处理
     * @author: 作者
     * @Param:
     * @Return:
     * @Date: 2021/2/3 14:52
     */
    public static JSONArray checkCameraData(String cameraList) {
        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(cameraList);
        if (ObjectUtil.isNull(jsonObject)) {
            return null;
        }
        String code = jsonObject.getString("code");
        if (StringUtils.isBlank(code) || !"0".equalsIgnoreCase(code)) {
            return null;
        }
        com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");
        if (ObjectUtil.isNull(data)) {
            return null;
        }
        Integer total = data.getInteger("total");
        JSONArray list = data.getJSONArray("list");
        System.out.println("所有的 list 的长度" + list.size() +"total:" + total +" list 的长度 和 total是否相等:"+ (total==list.size()) );
        return list;
    }

10、数据提取封装到对应的数据表实现入库存储

package cn.stylefeng.guns.base;

import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.guns.modular.led.entity.LedCameraArea;
import cn.stylefeng.guns.modular.led.entity.LedCameraAreaCameras;
import cn.stylefeng.guns.modular.led.service.LedCameraAreaCamerasService;
import cn.stylefeng.guns.modular.led.service.LedCameraAreaService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Orange
 * @version 1.0
 * @Description:此类用于获得数据并解析入库
 * @date 2021/2/3 14:04
 *
 * 根节点:"root000000"
 */
public class HkOptainData {


    private Map getmap(List<LedCameraArea> allAreas) {
        Map<String, LedCameraArea> map = new HashMap<>();
        for (LedCameraArea allArea : allAreas) {
            map.put(allArea.getIndexCode(), allArea);
        }
        return map;
    }

    private void digui(List<LedCameraArea> ledCameraAreas, Map<String, LedCameraArea> noleaf, Map<String, String> map) {
        for (LedCameraArea ledCameraArea : ledCameraAreas) {
            StringBuffer namebuffer = new StringBuffer();
            StringBuffer codebuffer = new StringBuffer();
            diguitree(ledCameraArea, noleaf, map, namebuffer, codebuffer, ledCameraArea.getIndexCode());
        }
    }

    private void diguitree(LedCameraArea ledCameraArea, Map<String, LedCameraArea> noleaf, Map<String, String> map, StringBuffer namebuffer, StringBuffer codebuffer, String key) {
        String pid = ledCameraArea.getParentIndexCode();
        namebuffer.append(ledCameraArea.getName()).append(",");
        codebuffer.append(ledCameraArea.getIndexCode()).append(",");

        LedCameraArea ledCameraArea1 = noleaf.get(pid);
        if (ObjectUtil.isNotNull(ledCameraArea1)) {
            String parentIndexCode = ledCameraArea1.getParentIndexCode();
            if (!"root000000".equalsIgnoreCase(parentIndexCode)) {
                diguitree(ledCameraArea1, noleaf, map, namebuffer, codebuffer, key);
            } else {
                map.put(key, codebuffer.toString() + ";" + namebuffer.toString());
            }
        } else {
            map.put(key, codebuffer.toString() + ";" + namebuffer.toString());
            System.out.println(pid);
        }
    }

    @Autowired
    LedCameraAreaService ledCameraAreaService;

    @Autowired
    LedCameraAreaCamerasService ledCameraAreaCamerasService;

    @Test
    public void testHkRegions() {

        //初始化根节点
        String[] roots = new String[]{"root000000"};
        String regionsPageList = HkTest.getRegionsPageList(roots, 1, 1000);
        JSONArray objects = HkTest.checkData(regionsPageList);
        if (CollectionUtils.isNotEmpty(objects)) {
            for (Object object : objects) {
                com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) object;
                LedCameraArea entity = JSONObject.parseObject(jsonObject.toJSONString(), LedCameraArea.class);
                ledCameraAreaService.add(entity);
            }
        }

    }

    @Test
    public void testHkCameros() {
        QueryWrapper<LedCameraArea> wrapper = new QueryWrapper<>();
        wrapper.eq("leaf", 1);//叶子节点筛选
        List<LedCameraArea> ledCameraAreas = ledCameraAreaService.selectLedCameraArea(wrapper);

        QueryWrapper<LedCameraArea> allwrapper = new QueryWrapper<>();
        List<LedCameraArea> allAreas = ledCameraAreaService.selectLedCameraArea(allwrapper);

        Map<String, LedCameraArea> noleaf = getmap(allAreas);

        //先把相应的 tree 弄出来
        for (LedCameraArea ledCameraArea : allAreas) {
            noleaf.put(ledCameraArea.getIndexCode(), ledCameraArea);
        }
        Map<String, String> map = new HashMap<>();

        digui(ledCameraAreas, noleaf, map);

        //初始化计数器
        int n=0;

        for (LedCameraArea ledCameraArea : ledCameraAreas) {
            String nameandcode = map.get(ledCameraArea.getIndexCode());
            String namepath="";
            String codepath="";
            if (StringUtils.isNotBlank(nameandcode)) {
                String[] split = nameandcode.split(";");
                codepath=split[0];
                namepath=split[1];
            }
            String name=ledCameraArea.getName();
            String code=ledCameraArea.getExternalIndexCode();
            Object camerasByRegionCode = HkTest.getCamerasByRegionCode(ledCameraArea.getIndexCode(), 1, 1000);
            JSONArray objects = HkTest.checkCameraData((String) camerasByRegionCode);
            if (ObjectUtil.isNull(objects)) {
                continue;
            }

            n+=objects.size();
            System.out.println(ledCameraArea.getName()+":"+ledCameraArea.getIndexCode()+";"+objects.size());

            for (Object object : objects) {
                com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) object;
                LedCameraAreaCameras entity = JSONObject.parseObject(jsonObject.toJSONString(), LedCameraAreaCameras.class);
                entity.setRegionCode(code);
                entity.setRegionName(name);
                entity.setRegionPath(codepath);
                entity.setRegionPathName(namepath);
                ledCameraAreaCamerasService.add(entity);
            }

        }

        System.out.println("总共多少个摄像头:"+ n +" 总共多少个区域 :"+ledCameraAreas.size());
    }
}

11、实体类的创建可根据api返回的数据创建对应的属性,也可仅对部分可用数据进行封装

	/*此处举例部分属性*/
	@TableField("dept_id")
    private Long deptId;

    @TableField("indexCode")
    private String indexCode;

    @TableField("nodeType")
    private String nodeType;

    @TableField("name")
    private String name;

    @TableField("regionPath")
    private String regionPath;

    @TableField("parentIndexCode")
    private String parentIndexCode;

    @TableField("cascadeCode")
    private String cascadeCode;

    @TableField("cascadeType")
    private String cascadeType;

    @TableField("externalIndexCode")
    private String externalIndexCode;

    @TableField("available")
    private boolean available;

    @TableField("leaf")
    private boolean leaf;

    @TableField("catalogType")
    private Long catalogType;

12、平台版本升级后通过api所返回数据【json格式】内容变得更多,仅获取项目所需得内容即可

{
	"code": "0",
	"msg": "success",
	"data": {
		"total": 46,
		"pageNo": 1,
		"pageSize": 100,
		"list": [{
			"indexCode": "root000000",
			"nodeType": 0,
			"name": "根节点",
			"regionPath": "@root000000@",
			"parentIndexCode": "-1",
			"cascadeType": 0,
			"externalIndexCode": "370102",
			"sort": 1,
			"createTime": "2021-01-19T14:53:39.136+08:00",
			"updateTime": "2021-01-22T09:55:17.075+08:00",
			"regionCode": "",
			"available": true,
			"leaf": false,
			"catalogType": 10,
			"cascadeCode": "0"
		}]
	}
}

13、最后感谢一位CSDN博主,对我所提问题的耐心解答,这是他的博文地址,欢迎大家前去拜读!

https://blog.csdn.net/weixin_43716343/article/details/108054096#comments_13802942

14、话外:高版本的综合安防平台可以获得支持web端直接播放得rtmp格式视频流,如果返回的rtmp 视频流可以在第三方工具,如 VLC 上播放但是在页面使用 video.js 无法进行播放,可以考虑是否是视频码流所造成的影响。可以通过调用接口时指定码流格式 【0:为主码流】【1:为子码流】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对接海康综合安防管理平台经验总结 的相关文章

  • C语言实现任意栈之间的进制转换

    题目 xff1a 利用栈 xff0c 将十进制数字N转换为D进制 xff08 D 61 2 8 16 xff09 xff0c 其中16进制对应的符号是0 9 xff0c A F 要求 xff1a 十进制数字和N进制从键盘输入获得 xff0c
  • 防止C语言头文件被重复包含

    文章目录 方法一 xff1a 使用宏保护防止C语言头文件被重复包含 xff08 很常用 xff09 方法二 xff1a pragma once 在头文件的最开始加入 比较常用 xff09 参考链接 xff1a https blog csdn
  • 栈的应用之括号匹配算法

    算法思路 xff1a 初始化一个栈 xff0c 命名为s 依次遍历待匹配的字符串 如果当前字符为左括号 xff08 即 39 39 39 39 39 39 中的任意一个 xff09 xff0c 则将其入栈 如果当前字符为右括号 xff08
  • jsp页面在浏览器中显示乱码( 没有账号?)

    错误 xff1a jsp页面在浏览器显示乱码 xff0c 如下图所示 xff1a 解决方法 xff1a 主要是因为浏览器使用的编码格式与自己开发文件存储内容的编码不一致导致的 xff0c 所以需要在jsp页面中添加如下代码 xff0c 问题
  • 队列的应用之打印杨辉三角形

    题目 xff1a 利用队列打印杨辉三角形 特点 xff1a 杨辉三角除第一行为两个1以外 xff0c 从第二行开始 xff0c 每一行的首尾都为1 xff0c 中间位置的数为上一行中与之相邻的两个数之和 xff0c 可以使用我们学过的队列问
  • 栈和队列的应用之停车问题

    题目 xff1a 设停车场是一个可停放n辆汽车的狭长通道 xff0c 且只有一个大门可供汽车进出 汽车在停车场内按车辆到达时间的先后顺序 xff0c 依次由北向南排列 xff08 大门在最南端 xff0c 最先到达的第一辆车停放在停车场的最
  • Jupyter Notebook 安装与使用教程

    一 什么是Jupyter Notebook xff1f 1 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序 其可被应用于全过程计算 xff1a 开发 文档编写 运行代码和展示结果 Jupyter Notebook官
  • java.lang.NoSuchMethodError: org.springframework.core.type.AnnotationMetadata.introspect之解决方法

    错误 xff1a idea中使用spring整合mybatis报错 xff1a java lang NoSuchMethodError org springframework core type AnnotationMetadata int
  • 栈和队列的应用之回文数判断

    题目 xff1a 采用栈和队列的方法检测并输出一个单词是否为回文 代码 xff1a include lt stdio h gt include lt malloc h gt define SIZE 20 using namespace st
  • 二叉链表树的遍历

    题目 xff1a 使用二叉链表树创建算法Status CreatBiTree BiTree amp T 和其他代码 二叉树的遍历有三种 xff1a 前序遍历 xff1a 先访问根节点 xff0c 再遍历左子树 xff0c 最后遍历右子树 x
  • opencv的框架与各模块功能介绍

    记录一下自己的所学知识 xff0c 便于日后回顾与整理 文中内容多为摘录 xff0c 具体链接如下 xff1a 摘录自 xff1a https zhuanlan zhihu com p 33008701 xff08 框架介绍 xff09 h
  • Android调用C/C++库

    AndroidStudio版本2021 1 1 一 AndroidStudio将C C 43 43 库打包成so库过程 AndroidStudio新建NativeC 43 43 工程 xff1b 在Tools gt SDK Manager里
  • SocketCan 应用编程

    SocketCan 应用编程 由于 Linux 系统将 CAN 设备作为网络设备进行管理 xff0c 因此在 CAN 总线应用开发方面 xff0c Linux 提供了SocketCAN 应用编程接口 xff0c 使得 CAN 总线通信近似于
  • QT开发笔记(继承 QObject 的线程 )

    继承 QObject 的线程 在第 10 章章节开头已经说过 xff0c 继承 QThread 类是创建线程的一种方法 xff0c 另一种就是继承 QObject 类 继承 QObject 类更加灵活 它通过 QObject moveToT
  • CoppeliaSim:视觉传感器的使用与属性参数

    视觉传感器类型 http www coppeliarobotics com helpFiles index html Orthographic projection type the field of view of orthographi
  • 华为Atlas200DK环境配置指南(版本20.0.0)

    官方参考文档 https support huaweicloud com usermanual A200dk 3000 atlas200dk 02 0024 html 务必保证配置时版本 20 0 0 一致 1 配置开发环境 自己电脑 若不
  • PX4 QGC地面站自定义参数

    QGC地面站自定义参数 xff08 新手操作 xff09 v1 8 2 QGC以往版本下载地址 htps github com mavlink qgroundcontrol tags 最终的添加结果如下 xff1a 具体步骤如下 xff1a
  • Linux网络编程----UDP编程基础知识

    UDP概述 UDP 是 User Datagram Protocol 的简称 xff0c 中文名是用户数据报协议 xff0c 是一个简单的面向数据报的传输层协议 xff0c 在网络中用于处理数据包 xff0c 是一种无连接的协议 UDP 不
  • get 命令汇总

    get 命令汇总 git config 配置 Git 的相关参数 Git 一共有3个配置文件 xff1a 1 仓库级的配置文件 xff1a 在仓库的 git gitconfig xff0c 该配置文件只对所在的仓库有效 2 全局配置文件 x
  • c++ socket简单封装

    简单封装 并不实际应用 框架图 Mysocket 主要是定义TCP和UDP的一些相同的操作 xff0c 需要的他们各自去实现 Mysocket h ifndef MYSOCKET H define MYSOCKET H class MySo

随机推荐

  • pixhawk2飞控接头型号

    BM04B GHS TBT BM05B GHS TBT BM06B GHS TBT
  • 多种视觉SLAM方案对比

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 新机器视觉 在SLAM研究中 xff0c 我们通常需要在各数据集上测试各个方案的性能情况 如下主要对表1中6个视觉SLAM方
  • 激光雷达核心技术及行业格局梳理

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 引言 xff1a 车载摄像头是ADAS 的核心传感器 车载摄像头搭载颗数稳步提升 根据 Yole 数据 xff0c 2018 年全球平
  • 2 ROS1通讯编程基础(2)

    2 ROS1通讯编程基础 2 3 配置文件的解读2 3 1 CMakeList txt解读2 3 1 1 find package的配置2 3 1 2 messages services and actions的配置2 3 1 3 动态重配
  • Rviz 使用Arbotix控制机器人运动

    需求 控制机器人模型在 rviz 中做圆周运动 实现流程 安装 Arbotix创建新功能包 xff0c 准备机器人 urdf xacro 文件添加 Arbotix 配置文件编写 launch 文件配置 Arbotix启动 launch 文件
  • VINS问题整理

    VINS的初始化过程 xff1f 首先进行纯视觉SfM xff1a 把滑窗填满 xff0c 然后选择枢纽帧 xff08 和最后一帧有足够的视野重叠保证计算的位姿精度 xff0c 并且和最后一帧有足够的视差保证三角化地图点的精度 xff09
  • 两台ubuntu电脑如何搭建局域网以及通信

    两台ubuntu电脑如何搭建局域网以及通信 功能 xff1a 用自己的电脑代替设备中的电脑进行数据处理 xff0c 以及将最后的结果传给设备电脑 需要做的内容的 xff1a 首先用网线将自己的pc与设备连接起来 1 将自己的笔记本ip地址手
  • PC偏振控制器、锁模激光器技术、AOM声光调制器、相位噪声、锁相环、光耦合器类型

    1 PC 偏振控制器 xff08 1 xff09 什么叫做偏振光 xff1f polarized light 光是一种电磁波 xff0c 电磁波是横波 xff0c 它具有偏振性 xff0c 具有偏振性的光则称为偏振光 具体体现 xff1a
  • 小梅哥——38译码器

    三八译码器 xff0c 即是 3 种输入状态翻译成 8 种输出状态 真值表 代码展示 module decoder 3 8 a b c out input a 输入端口a input b 输入端口b input c 输入端口c output
  • 基本RS触发器(SR锁存器)

    一 前言 SR锁存器 Set Reset Latch 是静态存储单元当中最基本 xff0c 也是电路结构最简单的一种 xff0c 通常由两个或非门或者与非门组成 其中S表示Set xff0c R表示Reset 则S D称为置位端或置1输入端
  • 01-RTOS

    对于裸机而言 xff0c 对于RTOS而言 即 xff1a 对于裸机 xff0c 打游戏意味着不能回消息 回消息意味着不能打游戏 对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事 xff08 但
  • uORB笔记

    不同的类调用同一函数orb subscribe ORB ID vehicle gps position xff0c 来订阅GPS信息是 xff0c 该函数返回的值不同 xff0c 也就是说每个订阅者针对同一主题 xff0c 在调用函数orb
  • STM32 SystemInit()函数学习总结

    拿到程序后如何看系统时钟 xff1f User文件夹 system stm32f4xx程序 xff0c 先找systemcoreclock 系统时钟 xff09 但是这里这么多个系统时钟应该如何选择 点击魔法棒 xff0c 然后点击C C
  • FPGA IP核之PLL四种输出模式的理解

    一 源同步模式 使得进入管脚时的数据和上升沿的相位关系与到达芯片内部第一级寄存器时数据和上升沿的相位关系保持不变 xff08 通过调整内部的布局布线延时做到的 xff0c 用于数据接口 xff0c 特别是高速的情况下 xff09 详细理解
  • FPGA_边沿监测理解

    一 简易频率计设计中为什么一定要获取下降沿 gate a 实际闸门信号 gate a stand 将实际闸门信号打一拍之后的信号 gate a fall s 下降沿标志信号 cnt clk stand Y值 xff0c 即在实际闸门信号下
  • HAL库 STM32 串口通信

    一 实验条件 将STM32的PA9复用为串口1的TX xff0c PA10复用为串口1的RX STM32芯片的输出TX和接收RX与CH340的接收RX和发送TX相连 xff08 收发交叉且PCB上默认没有相连 xff0c 所以需要用P3跳线
  • 全局变量和局部变量

    一 C语言由四种地方可以定义变量 在函数外部定义的是全局变量 xff08 这里的函数包括main函数 xff09 在头文件中定义的是全局变量 在函数或语句块内部定义的是局部变量 函数的参数是该函数的局部变量 全局变量 xff0c 在定义位置
  • 单片机中断

    蓝桥杯单片机之中断 1 中断含义及过程 中断是指CPU在处理A事情时 xff0c 发现B请求CPU立刻去处理 xff08 中断发生 xff09 xff0c 于是CPU去处理B xff08 中断服务 xff09 xff0c 处理完B后又再次回
  • AprilTag的使用、相关问题及解决方法

    使用棋盘格标定相机 安装标定功能包 span class token function sudo span span class token function apt get span span class token function i
  • 对接海康综合安防管理平台经验总结

    前言 xff1a 因业务需要对接海康威视的综合安防管理平台获得下属所管理的摄像头 xff0c 根据摄像头code获得监控视频流信息 1 详情可以浏览海康开放平台 xff0c 在官网上有对应的接入指南以及开放的API接口 前提是本地已部署了海