预备知识学习笔记

C#

基础语法

  1. 一个 C# 程序主要包括以下部分:
  • 命名空间声明(Namespace declaration)
  • 一个 class
  • Class 方法
  • Class 属性
  • 一个 Main 方法
  • 语句(Statements)& 表达式(Expressions)
  • 注释
  1. 新建C#项目:

    dotnet new console [-o <Project_Name>]

    cd <Project_Name>

    dotnet run

  2. demo

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
         /* 我的第一个 C# 程序*/
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}
  1. 数据类型:
  • 数值类型

    • double

      double.NaN:Not a number

      double.isNaN(var):判断double类型的var是否是NaN

  • 引用类型

    object(是所有数据类型基类)、dynamic、String

    String类型:@"\xxx" (逐字字符串,将转义字符等特殊字符都当成普通字符)

    • 指针类型

      type* identifier

      用法与C中指针相同

  • 可空类型

    int? i = 3;

    相当于:Nullable<int> i = new Nullable<int>(3);

    变量i可赋值为空(null)

    对于可空类型有合并运算符 ??

    var3 = var1 ?? var2;

    如果var1为null则将var2赋值给var3

  1. 字符串

    字符串的格式化

    $"xxx{var:N2}":将var保留两位小数

  2. I/O操作

    Console.WriteLine()

    Console.ReadLine()

  3. 类型转换

type1 var1 = (type2) var2

Convert.ToType(var):显示数据类型转换

double.TryParse(string, out double):尝试解析string中的内容成double,成功则返回true,否则false

  1. 日志写入

    public Calculator() { //构造函数
        StreamWriter logFile = File.CreateText("calculator.log");
        Trace.Listeners.Add(new TextWriterTraceListener(logFile));
        Trace.AutoFlush = true;
        Trace.WriteLine("Starting Calculator Log");
        Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString()));
       }
    
  2. 快捷键

    编译并运行项目:F5

    设置断点:F9

  3. Windows Form(可视化窗口)

    工具箱:ctrl + alt + X

    • 对话框组件:

      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
      
      }
      
    • 图片组件

      //show picture
      pictureBox1.Load(openFileDialog1.FileName);
      //Clear the picture.
      pictureBox1.Image = null;
      

Visual Studio的使用

<!--拷贝文件到Debug目录中-->
<ItemGroup>
	<None Update="assets\bird.png">
		<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
	</None>
	<None Update="assets\car.png">
		<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
	</None>
	<None Update="assets\yolov8m.onnx">
		<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
	</None>
</ItemGroup>

<!--拷贝指定目录下的所有文件-->
<ItemGroup>
	<None Update="assets/*/*" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Unity

选中物体时坐标点显示方式:

img

资源商店

Window——Asset Store

搜索资源——添加/购买资源——在Unity中download——import

创建地形

Terrain——Paint Terrain

  • Raise or Lower Terrain : 绘制山峰和峡谷

    直接点击滑动,绘制山峰(凸起)

    按住shift点击滑动,绘制峡谷(凹陷)

  • Paint Hole : 挖洞

  • Set Height : 设置固定高度后绘制山峰(Flatten Tile->统一全部高度)

  • Smooth Height : 平滑山峰

组件(C#脚本)

设置脚本编辑器:首选项——外部工具——外部脚本编辑器

  • 使用官方提供的组件
  • 创建新组件

img

窗口——常规——控制台:ctrl + shift + C

FixedUpdate():固定时间执行(默认0.02s)

修改步进时间:编辑——项目设置——时间

函数执行顺序:Awake-->Start

向量(Vector)

  • Vector2
  • Vector3 : 三元数组(坐标、旋转、缩放)
  • Quaternion : 四元数

调试(Debug)

只在调试时有显示,正常运行没有显示

  • Debug.Log() : info
  • Debug.LogWarning : warning
  • Debug.LogError : error
  • Debug.DrawLine()
  • Debug.DrawRay() : 绘制射线

游戏物体(GameObject)

[this.]gameObject (GameObject类): 当前类中的 gameObject属性

img

GameObject的属性值

GameObject go = new GameObject();

go.name:获取游戏物体的名称

go.tag

go.layer

go.activeInHierarchy:当前的激活状态(父物体不激活时子物体也不激活)

go.activeSelf:自身的激活状态

go.transform:获取游戏物体的transform组件(含position、rotation、scale)

获取组件:<WidgetType> <name> = GetComponent<WidgetType>()

使用到了C#的泛型和 GetComponent<>()方法

添加组件(指定类型的默认组件):<obj>.AddComponent<WidgetType>()

获取游戏物体:GameObject go = GameObject.Find(<name>)

通过游戏物体的名称查找指定物体

GameObject go = GameObject.FindWithTag(<tag>)

go.SetActive(<bool>):设置物体的激活状态

Destroy(go):摧毁(删除)物体

游戏时间(Time)

Time.time:游戏开始运行到当前的时间

Time.timeScale:时间缩放(加减速)

Time.fixedDeltaTime:固定时间间隔

文件路径(Path)

Application.dataPath:Assets路径

Application.persistDataPath:持久化文件路径

Application.streamingAssetsPath:访问StreamingAssets路径(需要自行创建)

Application.temporaryCachePath:临时文件保存路径

Application.runInBackground:是否允许后台运行

游戏场景(Scene)

  • 文件——生成设置——Build 中的场景

using UnityEngine.SceneManagement;:导入相关包

SceneManager.LoadScene(<scene_name>):跳转到指定场景

Scene scene = SceneManager.GetActiveScene():获取当前场景

GameObject[] gos = scene.GetRootGameObjects():获取当前场景中所有游戏物体

异步操作(Async)

//携程异步
AsyncOperation operation;  //声明异步操作
IEnumerator async_function() { //定义异步函数
    operation = SceneManager.LoadSceneAsync(1); //调用异步方法(返回值是AsyncOperation对象)
    yield return operation; //异步返回值
}

StartCoroutine(async_function());  //携程异步执行异步函数

operation.progress   //异步函数执行的进程(0~0.9)

键鼠输入(Key/Mouse)

需要在 Update函数中写

Input.GetMouseButtonDown(index):鼠标按下

index=0 鼠标左键

index=1 右键

index=2 中键

Input.GetMouseButton(index):鼠标持续按下

Input.GetMouseButtonUp(index):鼠标抬起

Input.GetKey(KeyCode.<key>):键盘 <key>持续按下

Input.GetKeyDown(KeyCode.<key>):键盘 <key>被按下时

虚拟轴(Axis)

float horizontal = Input.GetAxis("Horizontal"):获取轴向值

img

虚拟按键(Button)

Input.GetButton("Space"):获取虚拟按键

触摸输入(Touch)

Input.touchCount:触摸点个数

Touch[] touches = Input.touches:获取所有的触摸点

Touch touch = Input.touches[0]:获取第一个点

img

灯光(Light)

实时/烘焙灯光

实时灯光是系统实时渲染,比较消耗性能

烘焙灯光则是提前渲染好,后面不会再修改

修改平面和物体属性为——Contribute GI

窗口——渲染——光照

音效(Audio)

Audio Listener组件:一般在Main Camera中

Audio Source组件:可以添加到任意物体中

Audio Clip:音频文件对象

视频(Video)

using UnityEngine.Video;

VideoClip:视频文件对象

角色控制(Character Controler)

添加 Character Controler组件

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 vector = new Vector3(horizontal, 0, vertical);  //角色运动方向
//Debug.DrawRay(transform.position, vector, Color.red); 
player.SimpleMove(vector);  //满足重力
player.Move(vector);  //不满足重力

碰撞检测

RigidBody:刚体组件

  • 碰撞

    private void OnCollisionEnter(Collision collision) {
    
    }
    private void OnCollisionStay(Collision collision) {
    
    }
    private void OnCollisionExit(Collision collision) {
    
    }
    
  • 触发

    private void OnTriggerEnter(Collision collision) {
    
    }
    private void OnTriggerStay(Collision collision) {
    
    }
    private void OnTriggerExit(Collision collision) {
    
    }
    

ctrl + shift + F:对齐视图

关节、铰链(joint)

Hinge Joint:铰链

平面材质

新建——新建物理材质

Mesh Collider——材质

射线检测

Ray ray = new Ray(<start_point>, <dest_point>)

新建一个点,传入起点和终点(Vector3

Ray ray = Camera.main.ScreenPointToRay(<dest_point>)

从摄像机向<dest_point>发射一条射线

img

Physics.Raycast(ray, out hit):碰撞信息检测(检测单个物体)

RaycastHit[] hits = Physics.RaycastAll(ray):检测多个物体

动画(Animator)

添加 Animator 组件

新建 动画器控制器

创建动画:窗口——动画——动画——创建

角色控制(Character)

导航(Navigator)

选择游戏物体——将物体的属性从 静态的修改为 static navigator

菜单栏——窗口——AI——导航——Bake(烘焙)

using UnityEngine.AI;

private NavMeshAgent agent;
agent = GetComponent<NavMeshAgent>();
//获取鼠标点击的位置,并让导航代理移动到该位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit) {
    Vector3 point = hit.point;
    agent.SetDestination(point);
}

UI

生成设置

文件——生成设置——Platform

实战

  1. 对于例子系统需要设置 Play On Awake 来保持播放状态

  2. Text Mesh Pro组件的使用

    首先需要使用命名空间:using TMPro;

    TMP_Text:Text组件

    TMP_Button:Button组件

    ...

  3. 使用UI组件

    使用命名空间:using UnityEngine.UI;

  4. 使用场景Scene组件

    使用命名空间:using

  5. 场景层级

    选择 Sorting Layer,可以新建,越小越先渲染

    同一个层级下的可以通过设置 Order in Layer 来区分,越小越先渲染

  6. SendMessage

MRTK

  1. 想要对象在使用跟踪手时可抓取,需要添加组件 Object Manipulator

    系统会自动添加组件 Constraint Mananger

  2. 为了性能考虑,需要修改游戏物体的材质为:MRTK_Standard_White

  3. 安装 gltFast :add by name field com.unity.cloud.gltfast

    old version : com.atteneder.gltfast

  4. 添加箭头指示功能:给跟踪物体添加组件 DirectionalIndicator

ARDK

  1. 在Build Settings中将设备切换成 Android
  2. Edit > Project Settings > Player > Other Settings
  3. Add package from git URL:
    https://github.com/github-for-rayneo/OpenXR-Unity-ARDK.git
  4. 将场景中的Main Camera,Directional Light删除

DIP

Simple(采样)

img

dpi : dot per inch

Quantization

img

最后一张图就是二值图

img

环境配置:

  • Tensorflow 1.9 (tensorboard)

  • Keras

  • Caffe

    并行计算,配置模型

  • Pytorch

  • Opencv 3.4 (opencv-contrib-python)

img

图像处理的方法:

  • RGB-->GRAY : (灰度图)

img

  • 直方图均衡

  • 自适应直方图均衡(AHE)

    对图像局部区域执行直方图均衡算法,然后对各部分边缘进行特殊处理(镜像边缘像素)

  • CLAHE

    对比度受限的直方图均衡(改进AHE)

    将像素直方图进行一定的修正:
    img

滤波(卷积)算法:

  • 均值滤波

  • 平滑中值滤波

    将卷积核中的所有值进行排序,取中间值

  • 平滑高斯滤波

    img

    img

  • 梯度滤波

  • Sobel算子

    • Prewitt算子
  • Laplace算子(二阶导)

    img

    img

    img

Laplacian卷积核的和为0

加速卷积(使用FFT):

img

  • 高斯金字塔

    用于图像缩放处理

    缩小:先对图像进行高斯平滑处理,然后再进行降采样

  • 拉普拉斯金字塔

  • 傅里叶变换

    • 相位滤波
    • 频谱滤波

    先将图片进行傅里叶变换,对频谱进行滤波后再进行傅里叶逆变换

  • 短时傅里叶变换

  • 小波变换

img

图像特征

颜色特征

  • RGB色彩空间
  • HSV色彩空间
  • Lab色彩空间

几何特征

  • 边缘

  • 关键点

    • Harris角点

      https://zhuanlan.zhihu.com/p/449970674

      img

    • FAST角点

      img

      以像素值为圆心的圆上有连续12个像素点的强度都高于圆心点threshold时则判定为角点

    • 斑点

      高斯+二阶导零点

    • 高斯金字塔

      先对图像进行降采样,然后进行高斯滤波

    • SIFT(局部特征)

      尺度空间:

      DOG(高斯差分函数):

      img

      对同一张图片使用不同\({\sigma}\)的高斯模糊处理,然后相减,得到边缘

      LOG(高斯拉普拉斯算子):

      高斯滤波+二阶梯度算子

      二阶梯度算子:

      img

      核函数:

      img

      效果上DOG能够近似LOG算子,具有更小的计算复杂度

      HOG算法(方向梯度直方图):

      Gamma标准化:

      为了减少光照的影响,对像素的灰度值进行标准化

      \[\{[\frac{(i + 0.5)}{256}]^{\frac{1}{\gamma}}\}*256 - 0.5 \]

    • Haar-like小波特征

      用于人脸检测(人脸检测还有dlib包)

      特征模板(15个):

      img

      使用积分图来减小计算复杂度

      img

      AdaBoost

      Haar级联分类器

    • SURF

      对SIFT的计算进行改进,速度提升3倍

    • BRIEF

      二进制编码描述子。先利用特征点检测算法获取图中特征点的位置然后使用BRIEF算法建立特征描述符

    • ORB

    • LBP

    • Gabor

      三维高斯函数和三角函数的叠加

特征检测

图像分割

  • 基于阈值的分割方法

    • 大津法

      最大类间方差

      将图像划分成多个灰度级(类),求类间方差最大时划分的灰度级的个数

  • 基于边缘的分割方法

  • 基于区域的分割方法

    • 区域生长

      设置一个生长阈值,开始先选择一个生长点,然后根据周边像素点与该生长点之间的像素差值(如果小于生长阈值时)向外生长,并对新的区域像素值求平均值,对所有新的像素继续重复向外生长

    • 分水岭

  • 基于图论的分割方法(Graph Cuts)

    • GMM(高斯混合模型)

    • K-means(聚类)

      超参数:K

      将所有的数据点划分成K个类别。

    • GrabCut

  • DPM模型

  • SVM

  • 插值算法(interpolation)

图像检索

通过特征提取算法获取图像中的特征,再对图像特征求相似度

  • 相似检索
    • 颜色、纹理、形状
    • 局部特征点
    • 词袋(bag of visual words)

Opencv

kp, descriptor = cv2.xfeatures2d.SIFT_create().detectAndCompute(img1, None)  # 特征检测+特征描述

三维人体姿态估计

  • 关键点检测

  • 主流的方案

    • up-bottom:先检测有人的区域,然后对区域检测关键点
    • bottom-up:先检测图中所有关键点,然后使用聚类算法连线(确定人)
  • 包含技术和算法

    img

Tensorflow

Tensorflow2.0以后的版本移除了原来的 tf.Session(),换成了 tf.compat.v1.Session(),并且需要在前面写上 tf.compat.v1.disable_eager_execution()来保证 sess.run()能够执行

Flask

基本框架

使用Python开发的Web应用框架

# Demo
from flask import Flask
app = Flask(__name__)

@app.route('/')  # 绑定url
def hello_world():
   return 'Hello World'

if __name__ == '__main__':
   app.run(debug=True)

绑定url

@app.route(<url>):使用函数装饰器

app.add_url_rule(<parent_url>, <child_url>, <function_name>):绑定新的url

规则变量

@app.route('/hello/<variable_name>')  # 在url中传递变量
def function(variable_name):
    # do sth
  
@app.route('/hello/<int:int_var>')  # 在url中传递变量(并申明变量的类型:int、float、path)
def function(int_var):
    # do sth

重定向

redirect(url_for(<function_name>, args)):重定向跳转到函数<function_name>对应的页面

模板

Jinja2模板渲染引擎

<!--Demo-->
<h1>{{ username }}的个人主页</h1>
{% if bio %}
    <p>{{ bio }}</p>  {# 这里的缩进只是为了可读性,不是必须的 #}
{% else %}
    <p>自我介绍为空。</p>
{% endif %}  {# 大部分 Jinja 语句都需要声明关闭 #}
  • {{ ... }} 用来标记变量。
  • {% ... %} 用来标记语句,比如 if 语句,for 语句等。
  • {# ... #} 用来写注释。
  • {{ var | filter }} 变量过滤器(相当于将左边的变量传入右边的函数中)

render_template(<html_file>, **kwargs):跳转到<html_file>文件页面

@app.route('/')
def index():  # 设置初始页面为form.html(默认flask从templates文件夹中查找模板文件)
    return render_template(
        'form.html',
        my_str=my_str
    )

在html模板文件中可以使用 {{var_name}}调用传入的参数

SLAM

基础知识

相机

  • 单目相机

  • 双目相机

    通过两个摄像头拍摄图像的微小差异判断物体远近

    近处物体变化大,远处物体变化小

  • 深度相机

    能够测得图像中每个像素点的深度

    结构光ToF

    主动测量,功耗大

    量程小,易受外界环境影响

A* search algorithm

ROS

安装rosdepc

sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update

创建catkin工作空间

mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
source devel/setup.bash

创建package

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

rqt_graph

rosrun rqt_graph rqt_graph:可视化查看各节点之间的情况

vscode环境配置

task.json

{
// 有关 tasks.json 格式的文档,请参见
    // https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make:debug", //代表提示的描述性信息
            "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
            "command": "catkin_make",//这个是我们需要运行的命令
            "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
            "group": {"kind":"build","isDefault":true},
            "presentation": {
                "reveal": "always"//可选always或者silence,代表是否输出信息
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

CMakeList.txt配置

C++配置

add_executable(节点名称
  src/C++源文件名.cpp
)
target_link_libraries(节点名称
  ${catkin_LIBRARIES}
)

Python配置

catkin_install_python(PROGRAMS 
  scripts/自定义文件名.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

Launch文件

  1. 创建 launch文件夹

  2. 在文件夹中创建 launch文件

  3. 文件内容

    <launch>
        <node pkg="helloworld" type="demo_hello" name="hello" output="screen" />
        <node pkg="turtlesim" type="turtlesim_node" name="t1"/>
        <node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
    </launch>
    
    
    • node ---> 包含的某个节点
    • pkg -----> 功能包
    • type ----> 被运行的节点文件
    • name --> 为节点命名
    • output-> 设置日志的输出目标

文件系统

img

ros工具包

下载地址:https://index.ros.org/

下载命令:sudo apt install ros-noetic-<ros_package_name>

删除命令:sudo apt purge ros-noetic-<ros_package_name>

ros命令

rospack

ros + pack(age):与包相关的命令

rospack depends1 <package_name>  # 查看包中的一级依赖
rospack depends1 <package_name>  # 递归查看包中的所有依赖

rosnode

ros + node:与节点相关的命令

rosnode list  # 查看所有正在运行的节点
rosnode info <node_name>  # 查看节点的信息

rostopic

ros + topic:与话题相关的命令

Eigen

sudo apt install libeigen3-dev

链接库函数:sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

库函数位置:/usr/include/eigen3

#include <Eigen/Core>

Eigen::Matrix<float, row, col> matrix_row_col;  //声明矩阵
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;  //声明动态大小的矩阵
Eigen::MatrixXd matrix_x;  //也是动态大小矩阵
Eigen::Vector3d v_3d;  //库中预定义的类型(相当于Eigen::Matrix<float, 3, 1>)
matrix.block<m, n>()  //获取矩阵左上角mxn的子矩阵
MatrixXd::Random(m, n)  //随机(值为0~1)生成一个mxn的矩阵

CMake

CMakeLists.txt语法

# 单行注释
set(VARIABLE_NAME value)  # 定义变量,可以通过${VARIABLE_NAME}调用
# 设置项目为debug模式:set(CMAKE_BUILD_TYPE "Release")
# 添加c++ 11标准支持:set(CMAKE_CXX_FLAGS "-std=c++11 -O2")

project(PROJECT_NAME)  # 定义项目名(之后可以通过${PROJECT_NAME}调用)
message("sth to print")
find_package(OpenCV REQUIRED) # 寻找OpenCV库
add_library(<lib> <lib_file>) # 添加静态库
add_library(<lib> SHARED <lib_file>) # 添加共享库
# 静态库在每次调用时都会生成一个副本,而共享库则只会生成一个副本,更节省空间
include_directories(<header_files_directory>)  # 添加库文件路径(针对于系统库文件)
# ex: include_directories("/usr/include/eigen3")
target_link_libraries(<exe> <lib>)  # 将库链接到可执行文件中
# ex: target_link_libraries(undistortImage ${OpenCV_LIBS})

$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表

CMake使用方法

# 使用cmake编译C项目
mkdir build && cd build
cmake ..
make

# 编译并安装到电脑
sudo make install -j4  # 使用4条线程 

Opencv

#include <opencv2/core/core.hpp>

cv::Mat img1;
img1 = cv::imread("test.jpg");
cv::imshow("image", img1);
cv::imwrite("output.jpg", img1);

cv::Mat img2(img1); //copy constructor
cv::Mat img3(img1, cv::Rect(10, 10, 100, 100)); //slice of index
//Rect(x, y, width, height)
cv::Mat img4 = img1(Range::all(), Range(1, 100));
cv::Mat img5 = img1.clone();
cv::Mat img6;
img1.copyTo(img6); //same as clone()

cv::Mat::eye(height, width, <data_type>);
cv::Mat::ones(height, width, <data_type>);
cv::Mat::zeros(height, width, <data_type>);

//遍历图片Mat中的像素
uchar *rowPtr, 
for (int r=0; r<img1.rows; r++) {  //行遍历
    rowPtr = img1.ptr<uchar>(r);  //行指针
    for (int c=0; c<img1.cols; c++) {  //列遍历
        //for (int ch=0; ch<img1.channels(); ch++) {  //通道遍历
        //  
        //}
        rowPtr[c]  //对应像素
    }
}

C++语法

宏定义

#define xxx xxx

宏定义与 const修饰符的区别

宏定义只会把后面定义的常量原封不动的进行替换,而不会进行类型的判断

const修饰词

常量定义,且定义后的常量的值不能发生修改

  • 常量的指针 const int *i = 10int const *i = 10

    指针i的指向可以修改,但是不能通过指针来修改其指向的值

  • 常指针 int *const i = 10

    指针i是一个常指针,不能修改其指向,但是可以通过指针来修改其指向的值

stringstream

#include <sstream>  //头文件

stringstream sstream;
int i;
string s = "465";

sstream << s;  //输入重定向
sstream >> i;  //输出重定向(自动类型转换)
cout << "sstream.str is " << sstream.str() << endl;s  //获取sstream中的string
sstream.str("");  //清空sstream中保存的string

sstream.clear();  //当进行多次不同类型转换时需要调用clear()函数
sstream << true;
sstream >> i;
cout << i << endl;

设计模式

单例模式

工厂模式

区块链

参考资料

img

工具

img

基础知识

Go语法

基础语法

  • 字符串

    字符串拼接:

    "str1" + "str2"

    字符串格式化:

    fmt.Printf(str, <fmt>) -> void:输出格式化字符串到标准输出

    string fmt.Sprintf() -> string:格式化字符串并输出新串

  • 数据类型

    数值类型:uint8, uint16, uint32, ...

    布尔类型:false, true

    指针类型:uintptr

    ...

  • 变量声明

    1. 声明变量类型:

      var i int:数值类型

      var list_i []int:数组类型

    2. 编译器根据值自动推断

      var i = 10

      var str = "xxx"

    3. 变量初始化

      var intVal int  //声明一个int类型变量
      intVal = 10  	//给变量赋值
      
      intVal := 10 	//与上两行作用相同
      //注意:`:=`不用用于已经声明的变量,而且这种声明方式只能用于函数体中
      
    4. 全局变量声明

      var (
      	v_name1 v_type1
          v_name2 v_type2
      )//声明v_name1,v_name2两个变量为全局变量
      

科创计划

基于Hololens2的视障人群环境感知应用开发

Hololens2是由微软公司研发的增强现实(AR)眼镜,具备强大的计算能力和深度感知技术。本应用采用先进的物体检测算法,通过Hololens2的传感器实时捕捉环境中的物体信息,并运用光学字符识别(OCR)算法解读文字,为用户提供环境中的文字信息。同时,引入SLAM定位技术,实现用户在空间中的精准定位和导航。通过综合利用这些先进技术,该应用旨在改善视障人士的生活质量,使其更便捷地适应和参与社会生活。本研究为AR技术在辅助功能领域的应用提供了创新思路,对于推动可穿戴设备在辅助生活方面的发展具有积极意义。

选题:

项目名称 项目内容简介
轻量级目标检测与位置估计技术研究 移动端目标检测具有广泛的应用,但有限的计算资源限制了AI网络规模和精度。设计和优化轻量级深度学习目标检测网络,应用到移动终端实现目标实时检测;基于深度图像,估计目标在空间中的位置,
基于SLAM的空间定位方法研究 同时定位与建图(Simultaneous Localization and Mapping,SLAM)技术一直是机器人自主移动领域的研究重点,尤其在室内场景,缺乏GPS等全局定位信息。本项目基于已知室内高精度3D地图,基于RGB-D 、IMU等信息,估计当前的位置和姿态,定位出当前所在空间的具体位置。
基于AR眼镜的感知应用开发 AR眼镜作为一新的交互终端,在工业制造、能源、交通等领域有着应用的需求,能极大的提升工作效率。视觉感知作为AR眼镜的基础,至关重要。本项目基于Holoens2 AR眼镜,开发智能感知AR应用,支持生活场景中常见物体的感知,语音播报目标种类及状态。

软件算法部分

目标检测

常用目标检测算法:

  • R-CNN(区域卷积神经网络)
  • YOLO

方位估计

  • 视觉SLAM

    定位周围物体

  • 人体关键点检测

    识别指定手势(人机交互)

计算处理模块

  • 交互设计
  • 操作系统
  • 云计算/AI计算芯片

结构设计部分

  • AR成像原理
  • 三维建模设计眼镜外观

Hololens2 软件开发

环境搭建

  1. New Project——3D Core
  2. img

项目描述

设计一款基于AR眼镜的与外界进行无障碍交互的软件(或整机)

传感器

  • RGB摄像头
  • ToF传感器
  • 麦克风、扬声器
  • 、、、

功能

  • 物体识别

    能识别并显示物体种类(和语音播报)

  • 障碍物检测

    通过眼镜上的传感器进行三维场景建模,获取周围障碍物的距离(并进行语言播报)

  • 手势识别

    能识别手语并转换为文本(并进行语言播报)

优点

  • 无障碍

    语音交互

  • 离线化

    仅使用本地终端算力,能适应各种场景(电梯、地下室等封闭场所)

posted @ 2025-10-21 10:30  MaximeSHE  阅读(12)  评论(0)    收藏  举报