记录一些软件的使用技巧方法
2. Git
什么是git
git中数据中数据的状态
- git使用前的配置
git clone --global user.name "name" git clone --global user.email email@email.com # 带--global参数的命令配置的是全局变量,可用于以后所有项目; # 对特定项目使用不同用户名与邮件地址时,在所在项目目录下重新运行不带--global的命令来覆盖 # 配置文件及优先级:~/.gitconfig > /etc/gitconfig git config --list --show-origin #查看所有配置及所在文件 git config --list #查看所有配置
- 初始化已有项目为仓库
cd project/
git init # 初始化
git add *.c #指定追踪所有.c文件
git add LICENSE
git commit -m ''
命令:
git add file # 跟踪或暂存文件
git status # 查看文件状态
git status -s/--short # 以简洁方式查看文件状态
git diff # 查看未暂存的文件更新的部分(比较当前文件与暂存区快照间差异)
git diff --staged/--cached # 查看已暂存未提交文件的更改(比较已暂存文件与最后一次提交文件间的差异)
git commit # 提交更新,会自动打开默认编辑器填写提交消息
git commit -m "提交消息" # 在命令中填写提交消息
git commit -a # 跳过暂存步骤,将所有已跟踪的文件自动暂存后一并提交
git commit --amend #补充提交
git reset HEAD 文件 # 取消对文件的暂存
git checkout -- 文件 # 取消对文件的修改
git rm 文件 # 从跟踪清单中删除文件,并从工作目录中也删除
git rm --cached 文件 # 从暂存区及仓库中删除文件,但保留工作目录中的文件
git mv file_src file_to # 移动文件或改名
git log # 查看提交历史
git log -p/--patch -2 # 显示最近两次提交所引入的差异
git log --pretty=oneline # 将每一次提交的sha校验和、提交信息显示在一行内
###################################################
git clone 仓库地址 # 克隆仓库,自动将其添加为远程仓库,并默认具有简称origin
git remote (-v) # 显示已配置的远程仓库服务器的简称,-v显示其对应的URL
git remote add shortname url # 添加远程仓库url,并指定简称shortname
git fetch url/shortname # 从远程仓库拉取工作目录中没有的数据,只下载不合并,不改变工作目录文件
git pull
git push <remote> <branch> # 推送到服务器,<remote>可以是url或简称
git remote show <remote> # 显示远程仓库信息
git remote rename name_src name_to # 修改远程仓库的简称
git remote remove/rm name # 删除一个远程仓库
git tag (-l/--list) # 列出已有标签
git tag -a v1.4 -m "a message for tag" # -a创建一个标签,-m为该标签附加信息
git tag v1.4-lw # 后缀-lw为轻量标签,不需指定-a -s -m 等选项
git tag -a v1.2 9fceb02 # 在后期为之前的提交补充tag,命令末尾为指定提交的校验和或部分校验和,
# 校验和可使用git log --pretty=oneline得到
git show v1.4 # 显示指定标签的提交信息
git push <remote> <tag> # 将标签推送到服务器上(git push 默认不同步tag)
git push <remote> --tags # 将所有不在远程仓库中的tag同步过去
git tag -d <tag> # 删除本地仓库的tag
git push <remote> --delete <tag> # 删除远程仓库中的标签
######################################################
git branch branch_name # 创建分支,但不自动切换
git log --oneline --decorate # --decorate显示各个分支当前所指的对象
git checkout branch_name # 切换分支
git branch -b branch_name_1 # 创建并切换到分支1
git checkout master # 切换到master分支
git merge branch_name_1 # 将branch_name_1合并到master,
# 若branch_name_1为master的推进,则该合并会将master向后推进
git branch -d branch_name_1 # branch_name_1内容已经合并到master,-d 将其删除
使用.gitignore
文件忽略文件
简单应用
- 终端输入
git --version
确认已安装git - 设置身份标识
$ git config --global user.email "邮箱" $ git config --global user.name "用户名" # 如果仅在本仓库设置身份标识,则省略 --global 参数。
- 创建工程目录
$ git init project_name $ cd project_name
- 创建文件 file1.txt
- 添加该文件进行版本控制
$ git add file1.txt # add只是暂时将文件标记,用于接下来的提交
- 提交
$ git commit -m "My first commit" # -m 用于添加一条提交信息,用于描述文件活动记录
2.1 git基础
2.1.1 git帮助
```
$ git <命令> --help #获取<命令>的手册
$ git <命令> -h #获取<命令>的简明手册
```
2.1.2 获取 Git 仓库
- 在已存在目录中初始化仓库
$ cd /home/user/my_project $ git init $ git add *.c $ git add LICENSE $ git commit -m 'initial project version'
- 从其它服务器 克隆 一个已存在的 Git 仓库
$ git clone https://github.com/libgit2/libgit2 mylibgit
2.1.3 记录每次更新到仓库
-
对真实项目 Git 仓库的维持:
- 从这个仓库中检出了所有文件的 工作副本
- 对这些文件做些修改
- 当完成了一个阶段的目标,想要将记录下它时,就将它提交到到仓库
-
工作目录下的文件状态:
工作目录下的文件分为两种状态:已跟踪 或 未跟踪
已跟踪的文件是指那些被纳入了版本控制的文件,存在于上次快照的记录中,它们的状态又可分为:未修改、已修改或已放入暂存区;未跟踪文件,不存在于上次快照的记录中。
-
跟踪暂存文件
$ git add <file> #跟踪新文件、暂存已修改的文件
-
查看文件状态
$ git status #查看哪些文件处于什么状态
$ git status -s #状态简览 M README #已修改,未暂存 MM Rakefile #已修改,暂存后又作了修改 A lib/git.rb #新添加到暂存区 M lib/simplegit.rb #已修改,已暂存 ?? LICENSE.txt #新添加的未跟踪文件 ------------------------------ # 输出标记有两栏,左栏为已暂存,右侧为未暂存,??为未跟踪
-
提交更新
$ git commit #提交更新,自动启动你选择的文本编辑器来输入提交说明 $ git commit -m "提交说明" $ git commit -a "提交说明" #跳过 git add 步骤,把所有已经跟踪过的文件暂存起来一并提交
-
移除文件
- 在本地删除,且在暂存区(或git仓库)删除
$ rm PROJECTS.md $ git rm PROJECTS.md
- 保留本地文件,删除在暂存区(或git仓库)中的文件
$ git rm --cached README #使用 --cached 选项,只删除暂存区缓存 $ git rm log/\*.log #glob模式,删除log/ 目录下扩展名为 .log 的所有文件
- glob 模式## 1.5 远程控制软件
teamviwer速度较慢,推荐用向日葵
#官网下载向日葵deb包,安装
$sudo apt install ...deb
#解决win10远程控制ubuntu失败,显示「连接已断开」的问题
$sudo apt-get update
$sudo apt-get upgrade
$sudo apt install lightdm
#选择lightdm
#重启电脑
指 shell 所使用的简化了的正则表达式。
星号(*)匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(?)只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字);
使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
-
移动(重命名)文件
$ git mv file_from file_to # 相当于运行如下三条命令 $ mv README.md README $ git rm README.md $ git add README
-
忽略文件
创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。文件内容举例:# 忽略所有的 .a 文件 *.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件 !lib.a # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO /TODO # 忽略任何目录下名为 build 的文件夹 build/ # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件 doc/**/*.pdf
2.2 远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。远程仓库可以在你的本地主机上。
fork 在自己的远程仓库创建别人仓库的副本
clone 在自己的本地创建远程仓库的副本
push 将自己本地的更新上传到远程代码并合并
pull 从远程获取代码并合并本地的版本。
pull request 将自己远端修改的内容申请同步到原来的那个别人的远端仓库
fetch 将远端更新的内容更新到本地
3. Docker
Docker 菜鸟教程
(官方)Ubuntu安装Docker
(官方)Docker Get Started
(官方)Docker doc
docker-从入门到实践
3.1 基础
#拉取一个image
#使用image启动一个container
cd image_path
bash docker/scripts/dev_start.sh
#进入一个container
bash docker/scripts/dev_into.sh
#在container外获取containerID
docker ps
#在container内获取container ID
cat /proc/self/cgroup | head -1
#或
cat /proc/self/cpuset
#关闭一个container
docker stop container_name/container_ID
#Docker容器向宿主机传送文件
docker cp container_id:<docker容器内的路径> <本地保存文件的路径>
#宿主机向Docker容器传送文件
docker cp 本地文件的路径 container_id:<docker容器内的路径>
3.1 手把手操作(使用vscode)
-
获取应用程序
Download the App contents,注意只需要app文件夹
下载->提取->使用vscode打开 -
构建应用的容器镜像
Dockerfile :一个基于文本的指令脚本,用于创建容器映像
在文件 package.json 所在的文件夹中创建一个名为 Dockerfile 的文件,内容如下:# syntax=docker/dockerfile:1 FROM node:12-alpine RUN apk add --no-cache python g++ make WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] ----------------------------------------- # FROM node:12-alpine:从"node:12-alpine" image开始构建,但当前机器上并没有,因此会下载一系列"node:12-alpine" image的layer image # WORKDIR:设置工作目录 # COPY:复制源路径的所有元数据到工作目录,注意此处的两个点之间有个空格 # apk:软件包管理工具; ## add:安装PACKAGES并自动解决依赖关系; ## --no-cache:不使用本地缓存安装包数据库,直接从远程获取安装包信息安装 # 使用yarn安装信赖项 # CMD:设置默认参数
在Dockerfile所在的文件夹下打开终端,执行
$ docker build -t getting-started . # 该指令使用Dockerfile构建一个新的container image. # -t 将image命名为getting-started # 最后的点为dockerfile所在目录
-
启动一个app容器
$ docker run -dp 3000:3000 getting-started # 启动getting-started # -d: 后台运行容器,并返回容器ID; # -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
几秒钟后,打开 Web 浏览器访问http://localhost:3000。将会看到应用程序。
3.2 Docker使用中的一些问题
-
docker权限问题
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'. ----------------------------------------------- 解决方法: # 创建组 $ sudo groupadd docker # 列出组用户 $ groups # 将登陆用户加入到docker用户组中 $ sudo gpasswd -a $USER docker 或 $ sudo usermod -aG docker $USER # 更新用户组 $ newgrp docker # 列出组用户(验证) $ groups 对于vscode问题 current user does not have permission to run 'docker'.try adding the user to the 'docker' group # 需要重启ubuntu --------------------------------------------------
参考
How to Fix Docker Permission Denied Error on Ubuntu
解决Ubuntu18.04启动Docker“Got permission denied while …
把用户添加进Docker用户组 -
docker内走代理
在docker中有些操作需要在github上下载一些东西,但老是失败,可以走代理解决。
如apollo build时,rules_swift下载失败影响编译。
参考快速设置 Docker 的三种网络代理配置# 创建目录 mkdir ~/.docker # 创建配置文件 touch ~/.docker/config.json # 编辑配置文件 vim ~/.docker/config.json
{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:7890", "httpsProxy": "http://127.0.0.1:7890", "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8" } } }
sudo systemctl restart docker
4. linux
- 导出命令的man手册
利用 col -b 命令去除掉所有 控制符 $ man [command] | col -b > /root/[command].man
- 系统启动性能分析
启动未完成时,会返回#按照每个单元花费的启动时间从多到少的顺序,列出所有当前正处于活动(active)状态的单元: systemd-analyze blame #显示系统bootup各阶段用时: systemd-analyze time
使用以下命令可查看仍在运行的服务:Bootup is not yet finished. Please try again later.
systemctl list-jobs
- fstrim.service:回收未使用块
5. ROS
ROS Tutorials
解决ROS系统 rosdep update超时问题的新方法
- 更改包名、节点名
答:共5处要改:CmakeLists.txt、package.xml、node对应的cpp文件中节点初始化语句、文件夹名及其他一些.sh
/.rviz
文件(若有的话)。
6. 代码可视化——doxygen+graphviz
参考:生成C++调用流程图
Ubuntu中使用doxygen+graphviz
理解一个功能包集的正确方法——如何使用Doxygen + Graphviz理解ros的navigation功能包集
很详细,推荐:Doxygen + Graphviz windows下图解安装与配置
Doxygen + graphviz + Windows Help Workshop生成函数调用图和chm文件
其他:在windows平台上,VS Studio有叫code graph
的插件,github链接
安装:
sudo apt install doxygen doxygen-gui
sudo apt install graphviz graphviz-doc
使用:
- 启动:
$ doxywizard
- 指定doxygen运行工作目录
- Wizard->Project:指定工程名、工程源码路径、生成文件目录;勾选Scan recursively
- Wizard->Mode指定源码输出的模式:勾选All Entities;选择编程语言C++
- Wizard->Output选择输出文件的格式:q勾选prepare for compressed HTML(.chm).
- Wizard->Diagrams:选择Graphviz为生成图表的软件包
勾选Call graphs、Called by graphs - Expert->Build:勾选前6个
- Expert->Dot:
勾选CLASS_DIAGRAMS、UML_LOOK
DOT_IMAGE_FORMAT选gif
DOT_PATH为/usr/bin/dot - Run->Run Doxygen
- show HTML output打开网页:${doxygen}/output/html/index.html
7.CoreDump的使用
参考:
Linux Core Dump
Linux上Core Dump文件的形成和分析
core(5) — Linux 手册页
打开coredump并修改文件生成路径
Shell脚本———— /dev/null 2>&1详解
linux中core dump开启使用教程【转】
8. PyCharm
- PyCharm 加载已有的虚拟环境
File
->Settings
->Project
->Project Interpreter
-> ⚙️->add
Virtualenv Environment
->Existing environment
->...
- 选择已有的虚拟环境下
bin
中的python可执行文件
Make availabale to all projects
9. GPU训练
参考
GPU之nvidia-smi命令详解
深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
Pytorch GPU内存占用很高,但是利用率很低
深度学习训练已经停止了,可GPU内存还在占用着,怎么办?
解决GPU显存未释放问题
训练时GPU显存太小问题、batchsize 的大小跟GPU的显存的关系
训练神经网络时如何确定batch size?
神经网络中Batch Size的理解
深度学习中Epoch、Batch以及Batch size的设定
10. 标定工具
10.1 OpenCV C++ Stereo Camera Calibration
可标定单双目相机,依赖安装:opencv、sudo apt-get install libpopt-dev
标定文件详述
10.2 kalibr
- 下载后:
- 将
kalibr/Schweizer-Messer/sm_python/python/sm/PlotCollection.py
中NavigationToolbar2Wx
改为NavigationToolbar2WxAgg
- 修改
kalibr/python/kalibr_camera_calibration/MulticamGraph.py at line 83
下isGraphConnected(self)
函数为:def isGraphConnected(self): if self.numCams == 1: # Since igaph 0.8, adhesion correctly returns 0 for the non-connected one cam case. # which evaluates to false later on. So we skip the check and return true in the one camera case. return True else: #check if all vertices are connected return self.G.adhesion()
-
sudo apt install python-igraph
- 将
安装很简单,catkin_make
即可
多相机标定
-
信息采集
- 下载标定板;
- 启动相机ros节点;
- 使用topic_tools包中的throttle工具降低相机流的频率到 4 Hz 左右;
rosrun topic_tools throttle messages /imsee/image/left 4.0 /left rosrun topic_tools throttle messages /imsee/image/left 4.0 /right
- 开始录rosbag;
rosbag record /imsee/image/camera_info /left /right -o imsee_calib.bag
- 固定摄像机系统,在摄像机前移动(左右、上下、前后、扭转 <——> x, y, size, skew)标定板,得到标定图像;
-
标定
rosrun kalibr kalibr_calibrate_cameras \ --target "april_6x6.yaml" \ --bag "static.bag" \ --models pinhole-equi pinhole-equi omni-radtan omni-radtan \ --topics /cam0/image_raw /cam1/image_raw /cam2/image_raw /cam3/image_raw \ --approx-sync 0.1
–bag filename.bag
包含数据的ROS包
–topics TOPIC_0 … TOPIC_N
相机话题列表,与–models 的顺序对应
–models MODEL_0 … MODEL_N
相机/失真模型列表,与–topics 的顺序对应(请参阅支持的模型)
支持的相机投影模型:
pinhole camera model (pinhole)——>
(intrinsics vector: [fu fv pu pv])
omnidirectional camera model (omni)——>
(intrinsics vector: [xi fu fv pu pv])
double sphere camera model (ds)——>
(intrinsics vector: [xi alpha fu fv pu pv])
extended unified camera model (eucm)——>
(intrinsics vector: [alpha beta fu fv pu pv])
内参向量中的参数:
fu, fv: focal-length
pu, pv: principal point
xi: mirror parameter (only omni)
xi, alpha: double sphere model parameters (only ds)
alpha, beta: extended unified model parameters (only eucm)
支持的畸变模型:
radial-tangential (radtan)——>
(distortion_coeffs: [k1 k2 r1 r2])
equidistant (equi)——>
(distortion_coeffs: [k1 k2 k3 k4])
fov (fov)——>
(distortion_coeffs: [w])
none (none)——>
(distortion_coeffs: [])
–target target.yaml
校准用标定板配置(参见此处)
棋盘格配置:
target_type: ‘checkerboard’ #gridtype
targetCols: 6 #number of internal chessboard corners
targetRows: 7 #number of internal chessboard corners
rowSpacingMeters: 0.06 #size of one chessboard square [m]
colSpacingMeters: 0.06 #size of one chessboard square [m] -
执行标定时出现的问题
参考
kalibr 标定双目相机
package ‘igraph’ is deprecated #466
Cameras are not connected through mutual observations #364
相机标定
matplotlib
教程
中文教程
基础知识:
The matplotlibrc file
配置文件matplotlibrc详解
查看配置文件路径
import matplotlib
matplotlib.matplotlib_fname()
matplotlib.get_cachedir() #缓存目录
matplotlib.get_configdir() #配置目录
matplotlib.get_data_path() #数据路径
问题与解决
-
报错复现:>> GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported. >> Failed to load module "canberra-gtk-module"
解决办法:更改backendimport cv2 import matplotlib.pyplot as plt cv2.namedWindow("test")
GTKAgg GTKCairo GTK3Agg GTK3Cairo MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
11. linux下一些小工具
- 剪贴板工具CopyQ
不太好用
首选项->快捷键->显示托盘菜单->Alt+v
,并设置自启动
以后使用时,使用Ctrl+C多次复制文本,使用Alt+V打开跟踪历史 - 重命名工具pyrenamer
- 远程控制软件
teamviwer速度较慢,推荐用向日葵#官网下载向日葵deb包,安装 $sudo apt install ...deb #解决win10远程控制ubuntu失败,显示「连接已断开」的问题 $sudo apt-get update $sudo apt-get upgrade $sudo apt install lightdm #选择lightdm #重启电脑
12. win tools
-
Bitcomets
https://lanzoux.com/b01ihw9wf【密码:1234】 https://www.cometbbs.com/ # tracker: https://gitee.com/harvey520/www.yaozuopan.top/raw/master/blacklist.txt https://trackerslist.com/all.txt
-
期刊、文献
address - paperdigest 文献检索、综述 openknowledgemaps 文献检索、map分类索引 connectedpapers 以图浏览相关文献 中文分词+文章重写工具 文章重写者 paraphraser 文章重写 nounplus 在线语法检查
13. python
Cpython
-
基础
.pxd文件
.pxd 文件是由 Cython 编程语言 “编写” 而成的 Python 扩展模块头文件。
.pxd 文件类似于 C 语言的 .h 头文件,.pxd 文件中有 Cython 模块要包含的 Cython 声明 (或代码段)。
.pxd 文件可共享外部 C 语言声明,也能包含 C 编译器内联函数。.pxd 文件还可为 .pyx 文件模块提供 Cython 接口,以便其它 Cython 模块可使用比 Python 更高效的协议与之进行通信。
可用 cimport 关键字将 .pxd 文件导入 .pyx 模块文件中。.pyx文件
.pyx 文件是由 Cython 编程语言 “编写” 而成的 Python 扩展模块源代码文件。
.pyx 文件类似于 C 语言的 .c 源代码文件,.pyx 文件中有 Cython 模块的源代码。
不像 Python 语言可直接解释使用的 .py 文件,.pyx 文件必须先被编译成 .c 文件,再编译成 .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用。.pyd文件
.pyd 文件是非 Python,由其它编程语言 “编写-编译” 生成的 Python 扩展模块。
Python 要导入 .pyd 文件,实际上是在 .pyd 文件中封装了一个 module。在 python 中使用时,把它当成 module 来用就可以了,即:“import 路径名.modulename” 即可,路径名为 .pyd 文件所在的路径。
Python的.py与Cython的.pxd.pyx.pyd 文件格式之间的主要区别 -
from distutils.core import setup from Cython.Build import cythonize setup( name = 'dtw', ext_modules=cythonize('./dtw.pyx') )
from distutils.core import setup from Cython.Build import cythonize import numpy as np setup( name = 'dtw', ext_modules=cythonize('./dtw.pyx'), include_dirs=[np.get_include()] )
#注意此处python版本要和工程所用一致 python3 setup.py build_ext --inplace
import pyximport pyximport.install() import dtw