Simon Shi的小站

人工智能,机器学习, 强化学习,大模型,自动驾驶

0%

Ubuntu启动时间转时间戳

1
2
3
4
5
6
7
8
9
10
root@ubuntu:/home/user# cat ../../tools_data.sh
#!/bin/bash
if [ $# -ne 1 ];then
echo "input an dmesg time"
exit 1
fi

unix_time=`echo "$(date +%s) - $(cat /proc/uptime | cut -f 1 -d' ') + ${1}" | bc`
echo ${unix_time}
date -d "@${unix_time}" '+%Y-%m-%d %H:%M:%S'

dmesg

1
2
3
# dmesg
dmesg
dmesg -T

常用日志目录代表的意思

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
=> /var/log/messages:常规日志消息
=> /var/log/boot:系统启动日志
=> /var/log/debug:调试日志消息
=> /var/log/auth.log:用户登录和身份验证日志
=> /var/log/daemon.log:运行squid,ntpd等其他日志消息到这个文件
=> /var/log/dmesg:Linux内核环缓存日志
=> /var/log/dpkg.log:所有二进制包日志都包括程序包安装和其他信息
=> /var/log/faillog:用户登录日志文件失败
=> /var/log/kern.log:内核日志文件
=> /var/log/lpr.log:打印机日志文件
=> /var/log/mail.*:所有邮件服务器消息日志文件
=> /var/log/mysql.*:MySQL服务器日志文件
=> /var/log/user.log:所有用户级日志
=> /var/log/xorg.0.log:X.org日志文件
=> /var/log/apache2/*:Apache Web服务器日志文件目录
=> /var/log/lighttpd/*:Lighttpd Web服务器日志文件目录
=> /var/log/fsck/*:fsck命令日志
=> /var/log/apport.log:应用程序崩溃报告/日志文件=> /var/log/syslog:系统日志=> /var/log/ufw:ufw防火墙日志=> /var/log/gufw:gufw防火墙日志

[TOC]

开源算法库

OpenSpiel 框架 DeepMind
SpriteWorld & Bsuite 框架 DeepMind
Acme 分布式强化学习算法框架 DeepMind
PPO facebook-OpenAI
gym 框架工具包 facebook-OpenAI
Baselines 框架,Demo facebook-OpenAI

游戏平台

RLCard

Atari

RL 算法

Value-Base Policy Gradient AC
TD3
DQN Y
AC
A2C Y
A3C Y
REINFORCE Y
DDPG Y Y
TRPG Y
PPO on-policy Y
SAC off-policy
IMPALA Y

带着问题去学习

  • Advance函数是什么?为什么这样设计?

  • PPO算法的改进点有几个?

分布式强化学习

  1. 分布式强化学习(Distributed Reinforcement Learning):分布式算法,如IMPALA(Importance Weighted Actor-Learner Architecture)和R2D2(Recurrent Replay Distributed DQN),是近年来的重要发展。这些算法允许大规模分布式训练和数据并行化,从而提高了学习效率和可扩展性。

DQN

  • 两个神经网络,一个延迟更新权重,一个实时训练中进行参数更新。

我们从公式中也能看出,DQN不能用于连续控制问题原因,是因为maxQ(s’,a’)函数只能处理离散型的。那怎么办?

我们知道DQN用magic函数,也就是神经网络解决了Qlearning不能解决的连续状态空间问题。那我们同样的DDPG就是用magic解决DQN不能解决的连续控制型问题就好了。

也就是说,用一个magic函数,直接替代maxQ(s’,a’)的功能。也就是说,我们期待我们输入状态s,magic函数返回我们动作action的取值,这个取值能够让q值最大。这个就是DDPG中的Actor的功能。

[理论篇]怎样直观理解Qlearning算法?zhihu

# DQN(Double/ Duel/ D3DQN)bilibili

深度强化学习——DQN算法原理-CSDN博客

深度 Q 网络(deep Q network,DQN)原理&实现 - 缙云山车神 - 博客园

Noisy DQN

1
2
3
4
fc1 = relu(fc(X))
fc2 = relu(fc(fc1))
fc3 = relu(fc(fc2))
y = noisyLinear(fc3)

Double DQN

Q学习是基于贪心策略的,这会导致最大化偏差问题,和双Q学习思想一致。下面是双Q学习的伪代码,可以借鉴一下。

Dueling DQN

对偶网络(duel network)

D3QN

D3QN(Dueling Double Deep Q Network)

/todo

深度强化学习-D3QN算法原理与代码-CSDN博客

Rainbow

  • Double Q-learning
  • Prioritized replay
  • Dueling networks
  • Multi-step learning
  • Distributional RL
  • Noisy Nets

集合了在此之前的六大卓有成效的DQN变体,将其训练技巧有机的组合到一起

Policy Gradient

有两个缺陷:方差大,离线学习

# 强化学习从零到RLHF(五)Actor-Critic,A2C,A3C zhihu

# 强化学习基础 Ⅷ: Vanilla Policy Gradient 策略梯度原理与实战 zhihu

# 如何理解策略梯度(Policy Gradient)算法?(附代码及代码解释)zhihu

Reinforce(MC-PG)

AC

(解决高方差问题)

策略梯度的Gt(轨迹t时刻的实际后续累计回报,变成了t时刻采取动作a的期望后续累计回报)=等效于Qt(a,s) ; Q指动作值函数;

需要维护两套可训练参数 $\theta$ 、$w$ :

  • actor,$\theta$ 控制策略

  • Critic, w评估动作,输出Q value 用于策略梯度的计算。

# 理解Actor-Critic的关键是什么?(附代码及代码分析) 知乎

A2C (引入优势函数 Advantage Actor-Critic)

我们也可以使用优势函数作为Critic来进一步稳定学习,实际上A2C才是Actor-Critic 架构更多被使用的做法。

这个想法是,优势函数计算一个操作与某个状态下可能的其他操作相比的相对优势:与状态的平均值相比,在某个状态执行该操作如何更好。它从状态-动作对中减去状态的期望值。

换句话说,此函数计算我们在该状态下执行此操作时获得的额外奖励,与在该状态获得的期望奖励相比。

额外的奖励是超出该状态的预期值。

我们的actor损失函数为 

  • 如果  A(s,a)> 0:我们的梯度被推向那个方向。
  • 如果  A(s,a)< 0:我们的梯度被推向相反的方向。

A3C zhihu

A3C全称为Asynchronous advantage actor-critic。
前文讲到,神经网络训练时,需要的数据是独立同分布的,为了打破数据之间的相关性,DQN等方法都采用了经验回放的技巧。然而经验回放需要大量的内存,打破数据的相关性,经验回放并非是唯一的方法。另外一种是异步的方法,所谓异步的方法是指数据并非同时产生,A3C的方法便是其中表现非常优异的异步强化学习算法。
A3C模型如下图所示,每个Worker直接从Global Network中拿参数,自己与环境互动输出行为。利用每个Worker的梯度,对Global Network的参数进行更新。每一个Worker都是一个A2C。

SAC (soft Actor-Critic)

 SAC即Soft Actor-Critic(柔性致动/评价),它是一种基于off-policy和最大熵的深度强化学习算法,其由伯克利和谷歌大脑的研究人员提出。

SAC算法是强化学习中的一种off-policy算法,全称为Soft Actor-Critic,它属于最大熵强化学习范畴。

SAC算法的网络结构类似于TD3算法,都有一个Actor网络和两个Critic网络,但SAC算法的目标网络只有两个Critic网络,没有Actor网络。

SAC算法解决的问题是离散动作空间和连续动作空间的强化学习问题,它学习一个随机性策略,在不少标准环境中取得了领先的成绩,是一个非常高效的算法。

在SAC算法中,每次用Critic网络时会挑选一个值小的网络,从而缓解值过高估计的问题,进而提高算法的稳定性和收敛速度。

DDPG

deep deterministic policy gradient,深度确定性策略梯度算法。

  • PPO输出的是一个策略,也就是一个概率分布,而DDPG输出的直接是一个动作。

【Zhihu】一文带你理清DDPG算法(附代码及代码解释)

Deep Deterministic Policy Gradient (DDPG) | 莫烦Python

TF DDPG_update2.py

Pytorch实现DDPG算法_ddpg pytorch-CSDN博客

TD3

TD3算法主要解决了DDPG算法的高估问题。在DDPG算法的基础上,TD3算法提出了三个关键技术:

  1. 双重网络(Double network):采用两套Critic网络,计算目标值时取二者中的较小值,从而抑制网络过估计问题。
  2. 目标策略平滑正则化(Target policy smoothing regularization):计算目标值时,在下一个状态的动作上加入扰动,从而使得价值评估更准确。
  3. 延迟更新(Delayed update):Critic网络更新多次后,再更新Actor网络,从而保证Actor网络的训练更加稳定。

TD3算法在许多连续控制任务上都取得了不错的表现。

【附代码】大白话讲TD3算法 zhihu

TD3算法(Twin Delayed Deep Deterministic policy gradient)-CSDN博客

TRPO 置信域策略优化算法

强化学习 TRPO, PPO,DPPO

PPO(Proximal Policy Optimization)

        TRPO优化效率上一个改进,其通过修改TRPO算法,使其可以使用SGD算法来做置信域更新,并且用clipping的方法方法来限制策略的过大更新,保证优化在置信域中进行。

PPO 算法利用新策略和旧策略的比例,从而限制了新策略的更新幅度。

PPO-Max

https://blog.csdn.net/jinzhuojun/article/details/80417179

PPO算法是一种用于强化学习的策略优化算法,全称为Proximal Policy Optimization。

PPO算法基于策略梯度方法,通过约束优化的方式来保证每次迭代的更新幅度不会过大,从而提高算法的稳定性和收敛速度。

PPO算法通过两个不同的目标函数来更新策略函数,分别是Clipped Surrogate Objective和Trust Region Policy Optimization。其中,PPO-Penalty类似于TRPO算法,将KL散度作为目标函数的一个惩罚项,并自动调整惩罚系数,使其适应数据的规模;而PPO-Clip则没有KL散度项,也没有约束条件,使用一种特殊的裁剪技术,在目标函数中消除了新策略远离旧策略的动机。

PPO算法还使用了Generalized Advantage Estimation(GAE)的技术来估计策略函数的价值函数,从而提高了算法的性能和收敛速度。

PPO算法的应用范围非常广泛,可以用于各种强化学习任务,如机器人控制、游戏玩法、自然语言处理等方面。在OpenAl的研究中,PPO算法被用于训练人工智能玩Atari游戏,以及AlphaGo Zero等强化学习任务中,取得了优秀的表现。

总的来说,PPO算法是一种稳定、高效的强化学习算法,具有广泛的应用价值。

PPO算法实现gym连续动作空间任务Pendulum(pytorch)

Python强化练习之PyTorch opp算法实现月球登陆器(得分观察)

影响PPO算法性能的10个关键技巧(附PPO算法简洁Pytorch实现

PPO算法的37个Implementation细节

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码[【运行过】

Coding PPO from Scratch with PyTorch (Part 1/4)[专业详细]

深度增强学习PPO(Proximal Policy Optimization)算法源码走读_ppo算法-CSDN博客

强化学习(9):TRPO、PPO以及DPPO算法-CSDN博客

强化学习笔记(1)- PPO的前世今生

DPPO(多进程PPO)

Rainbow

组成Rainbow的这六大变体如下:

  • Double Q-learning
  • Prioritized replay
  • Dueling networks
  • Multi-step learning
  • Distributional RL
  • Noisy Nets

Apex

​ soft actor-critic

zhihu-清华博士【强化学习算法 11】SAC

反向强化学习(IRL)

模仿学习

在经典的强化学习中,智能体通过与环境交互和最大化reward期望来学习策略。

在模仿学习中没有显式的reward,因而只能从专家示例中学习。

GAIL

# 模仿学习GAIL框架与pytorch实现

**GAIL的核心思想:**策略生成器G和判别器D的一代代博弈

策略生成器:策略网络,以state为输入,以action为输出

判别器:二分类网络,将策略网络生成的 (s, a) pair对为负样本,专家的(s,a)为正样本

learn 判别器D:

给定G,在与环境交互中通过G生成完整或不完整的episode(但过程中G要保持不变)作为负样本,专家样本作为正样本来训练D

learn 生成器G:

给定D,通过常规的强化学习算法(如PPO)来学习策略网络,其中reward通过D得出,即该样本与专家样本的相似程度

G和D的训练过程交替进行,这个对抗的过程使得G生成的策略在与环境的交互中得到的reward越来越大,D“打假”的能力也越来越强。

AIRL

Learning Robust Rewards with Adversarial Inverse Reinforcement learning

RL Apply

info
DouZero
DanZero Distribute Q-learning
MuZero

DeepMind

AlphaZero

启发式搜索(MCTS)+强化学习+自博弈的方法,

MuZero # model based专题三–MuZero系列

Muzero的贡献在AlphaZero强大的搜索和策略迭代算法的基础上加入了模型学习的过程,使其能够在不了解状态转移规则的情况下,达到了当时的SOTA效果。

Muzero的模型有三部分

  • representation:表征编码,使用历史观测序列编码为隐空间的

  • dynamics:动态模型,这个就是MBRL经典的Dynamic Model

  • prediction:值模型。输入输出策略和价值函数

# MuZero及核心伪码分析

EfficientZero detail

接下来是NIPS2021的EfficientZero,这篇文章强调的是sample-efficiency,使用limited data,在仅有两小时实时游戏经验的情况下,在Atari 100K基准上实现了190.4%的平均人类性能和116%的中位数人类性能,并且在DMC Control 100K基准超过了state SAC(oracle),性能接近2亿帧的DQN,而消耗的数据少500倍。

EfficientZero基于MuZero,做了如下三点改进:

(1)使用自监督的方式来学习temporally consistent environment model

(2)端到端的学习value prefix,预测时间段内奖励值之和,降低预测reward不准导致的误差

(3)改变Multi-step reward的算法,使用一个自适应的展开长度来纠正off-policy target

SpriteWorld & Bsuite (DeepMind)

https://blog.csdn.net/weixin_31351409/article/details/101189820

https://github.com/deepmind/spriteworld

https://github.com/deepmind/bsuite

Acme

https://www.sohu.com/a/400058213_473283

https://github.com/deepmind/acme

https://arxiv.org/pdf/2006.00979v1.pdf

https://www.deepmind.com/research?tag=Reinforcement+learning

OpenSpiel

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

极小化极大(Alpha-beta剪枝)搜索、蒙特卡洛树搜索、序列形式线性规划、虚拟遗憾最小化(CFR)、Exploitability
外部抽样蒙特卡洛CFR、结果抽样蒙特卡洛CFR、Q-learning、价值迭代、优势动作评论算法(Advantage Actor Critic,A2C)、Deep Q-networks (DQN)
短期价值调整(EVA)、Deep CFR、Exploitability 下降(ED) 、(扩展形式)虚拟博弈(XFP)、神经虚拟自博弈(NFSP)、Neural Replicator Dynamics(NeuRD)
遗憾策略梯度(RPG, RMPG)、策略空间回应oracle(PSRO)、基于Q的所有行动策略梯度(QPG)、回归CFR (RCFR)、PSROrN、α-Rank、复制/演化动力学。

OpenAI

https://blog.csdn.net/kittyzc/article/details/83006403

Baselines

https://github.com/openai/baselines

  • A2C
  • ACER
  • ACKTR
  • DDPG
  • DQN
  • GAIL
  • HER
  • PPO1
  • PPO2
  • TRPO

Spinning Up

spinning up是一个深度强化学习的很好的资源

https://spinningup.openai.com/en/latest/

根据官方文档,spinning up实现的算法包括:

Vanilla Policy Gradient (VPG)
Trust Region Policy Optimization (TRPO)
Proximal Policy Optimization (PPO)
Deep Deterministic Policy Gradient (DDPG)
Twin Delayed DDPG (TD3)
Soft Actor-Critic (SAC)

学习路线

⭐⭐⭐增强学习-第二版-中文

上海交大ACM班俞勇团队推出强化学习入门宝典!附作者对话

**张伟楠:**我在上海交通大学给致远学院ACM班和电院AI试点班的同学讲授强化学习,由于学生的专业和本课程内容很贴合,因此学生对强化学习的原理部分关注较多。在夏令营中获得学生的反馈更多来自如何在各种各样的领域用好强化学习技术,当然也有不少本专业的学生对强化学习本身的研究十分了解。对于来我们APEX实验室的强化学习初学者,我建议的学习路线是:

\1. 先学习UCL David Silver的强化学习课程:https://www.davidsilver.uk/teaching/

这是强化学习的基础知识,不太包含深度强化学习的部分,但对后续深入理解深度强化学习十分重要。

\2. 然后学习UC Berkeley的深度强化学习课程:http://rail.eecs.berkeley.edu/deeprlcourse/

\3. 最后可以可以挑着看OpenAI 的夏令营内容:https://sites.google.com/view/deep-rl-bootcamp/lectures

当然,如果希望学习中文的课程,我推荐的是:

\1. 我本人在上海交通大学的强化学习课程: https://www.boyuai.com/rl

\2. 周博磊老师的强化学习课程:https://www.bilibili.com/video/BV1LE411G7Xj

Ref

zhihu Actor-critic和A3C

# 置信域策略优化算法——TRPO

# 强化学习6-DDPG

深度强化学习系列(15): TRPO算法原理及Tensorflow实现-CSDN博客

Pytorch实现强化学习DQN玩迷宫游戏(莫凡强化学习DQN章节pytorch版本)_莫烦迷宫 强化学习 pytorch实现-CSDN博客

系统课程(相关)

(七月在线2019)无人驾驶系列知识入门到提高 QQ89425879

(七月在线)无人驾驶感知融合实战

(东南大学)智能汽车技术

(北理工) 无人驾驶车辆

专业知识

激光SLAM算法学习(一)——激光SLAM简介

Apollo轨迹规划技术分享

无人驾驶技术入门(十三)| 手把手教你写卡尔曼滤波器

感知工程师

从落地的角度来看,感知的一些功能会逐渐硬件化;

从技术演进的角度,感知的工作重点会突出三个方面:

  • 算法演进(新的网络设计、新的功能设计、AutoML算法设计);
  • 数据演进(数据闭环系统建设、数据挖掘算法设计、场景挖掘设计、场景检索设计、多模态算法设计,超大规模数据集建设);
  • 落地演进(推理优化、后融合算法设计、跟踪与预测算法设计,端上模块架构设计)

作者:张小牙
链接:https://www.zhihu.com/question/486962254/answer/2142322427

(七月在线)无人驾驶感知融合实战

无人驾驶感知融合实战-02.png

内容

image-20220402142444496

相关论文》

MIT提出BEVFusion:具有统一鸟瞰图表示的多任务多传感器融合 - CVer计算机视觉的文章 - 知乎 https://zhuanlan.zhihu.com/p/521402618

ADAS

# 一文带你看懂汽车ADAS功能

# 什么是 ADAS?关于 ADAS 你不可不知的三大要点

计算机图像学与混合现实

https://games-cn.org/gamescoursescollection/

Games 101 现代计算机图形学入门 闫令琪 加州大学芭芭拉分校

Games 102 几何建模与处理技术 刘利刚 中国科学技术大学

Games 103 基于物理的计算机动画入门 王华民 凌迪科技(Style3D)

Games 104 现代游戏引擎:从入门到实战 王希 不鸣科技

Games 201 高级物理引擎实战指南 胡渊鸣 麻省理工学院

Games 202 高质量实时渲染 闫令琪 加州大学芭芭拉分校

Games 203 三维重建和理解 黄其兴 德州大学奥斯丁分校

Games 204 计算成像 孙启林 香港中文大学(深圳)

Games 301 曲面参数化 刘利刚等 中国科学技术大学

Games 401 泛动引擎(PeriDyno)物理仿真编程与实践 何小伟&蔡勇 中科院

何小伟:中科院软件研究所副研究员;参与GPU/CPU混合架构的开源物理仿真引擎PhysIKA,同时面向实时智能与物理仿真构建开源系统PeriDyno

蔡勇:湖南大学副教授,高性能工程软件设计与研发

Games 101

本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。

  • 变换

  • 光栅化

  • 着色

  • 几何

  • 光线追踪

  • 动画与模拟

现代计算机图形学入门 闫令琪 加州大学芭芭拉分校

视频:bilibili

Games 101

本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。

  • 变换(二维与三维,模型,视图,投影)

  • 光栅化(三角形离散化,抗锯齿)

  • 着色(光照,着色模型,频率,图形管线,纹理映射,插值,高级纹理映射)

  • 几何(表示,曲线,曲面,网格处理,阴影图)

  • 光线追踪(原理,加速结构,蒙特卡洛积分,路径追踪)

  • 动画与模拟

MOOC

图形理论体系+可编程渲染管线+图形编程技能(C++,OpenGL,GLSL)(在图形编程尤其是着色器编程方面与Unity相通)

第一,管线视角的图形学,按照图形渲染管线的三个概念阶段,即应用程序阶段、几何阶段、光栅化阶段来组织课程内容,将整个课程内容划分为五篇:基础篇、应用程序、几何阶段、光栅化阶段、高级话题。

第二,构建完整的理论体系,将传统理论和图形新发展结合起来,既包括朴素的软光栅、经典的造型技术,也包括真实感图形学的光照、纹理、阴影等内容,在这些内容中不仅体现经典的算法,还包括一些新的算法如实时光线追踪、法线贴图、实时动态阴影等。

第三,搭建先进实用的编程框架,基于可编程管线进行图形编程,采用主流的图形标准OpenGL,并用采用其着色器语言OpenGL Shading Language(简称GLSL)进行着色器的编写(Shader的编写思想与Unity3D相通)。这个图形编程框架充分利用了日趋强大的GPU的计算能力,和目前工业界的实际做法完全相通。设置了从在一个窗口中绘制多边形到粒子系统、延迟渲染的多个进阶实验,逐步提高学生的图形编程能力。

实验将提供配套代码的下载链接。

https://github.com/wanlin405/Computer-Graphics

为了使对计算机图形学感兴趣的同学们拥有更好的学习体验,本次我们的计算机图形学课程将添加了光栅渲染器何PBR渲染器的演示。

视频:bilibili up: 啥都会一点的研究生

知乎:王博Kings

无人驾驶系列知识入门到提高

  • 总体概览
  • 软件环境

课程评价

  • 自动驾驶相关的代码只有ROS的一部分
  • 实战==掉包

[TOC]

1、总体概览

​ 跳转【】

2、软件环境

2.1 环境配置

2.2 ROS开发环境安装

  • Ubuntu16.04 X 安装

http://wiki.ros.org/cn/Installation/Ubuntu

1
2
3
4
5
6
7
8
9
10
11
1  sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

10 sudo apt update
11 sudo apt install ros-kinetic-desktop-full

20 source /opt/ros/kinetic/setup.bash

21 cat ~/.bashrc
23 sudo gedit ~/.bashrc
24 cat /opt/ros/kinetic/setup.zsh
25 history

2.3 IDE安装

Clion(收费)

​ snap install clion –classic

VSCode

2.4 工作目录创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir –p ~/catkin_ws/src/
cd catkin_ws
catkin_make
(现在出现了build devel两个文件)
devel文件夹下面有一个setup.bash
把setup.bash路径添加到bashrc里
vi ~/.bashrc
末尾加:source /home/xxx/catkin_ws/devel/setup.bash
source ~/.bashrc

----------------
这时可以测试了
cd -
roscd
就又回来devel目录下面了

2.5 HelloWorld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
----------------julay_say
# 创建 julay_say项目(依赖std_msgs, roscpp)
## 现在进入catkin_ws/src文件夹中
catkin_create_pkg julay_say std_msgs roscpp

## IDE coding
catkin_make
rosrun julay_say julay_say_node

----------------ros_core_node_topic
roscore # Ros master Start
rosnode info /
rosnode list
rostopic list
rostopic echo /kk_topic


----------------julay_listen
# 创建 julay_listen项目(依赖std_msgs, roscpp)
cd src/
catkin_create_pkg julay_listen std_msgs roscpp
## IDE coding
catkin_make
rosrun julay_listen julay_listen_node

IDE Procject Cmakelist.txt

1
find 

SourceCode

/home/simon/catkin_ws/src/julay_say/src/julay_say_node.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char ** argv )
{
ros::init(argc, argv, "kk_talker");
ros::NodeHandle n;
ros::Publisher kk_pub = n.advertise<std_msgs::String>("/kk_topic", 10); // cache 10
ros::Rate loop_rate(10);
int count = 0;

while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "Hello KK " << count;
count ++;
msg.data = ss.str();

kk_pub.publish(msg);
loop_rate.sleep();

}
}

/home/simon/catkin_ws/src/julay_listen/src/julay_listen_node.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "ros/ros.h"
#include "std_msgs/String.h"

void julayCallback(const std_msgs::String::ConstPtr& msg){
ROS_INFO("I heard %s" , msg->data.c_str());
}

int main(int argc, char ** argv)
{
ros::init(argc, argv, "july_listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("/kk_topic", 10, julayCallback);
ros::spin();
return 0;
}

2.6 custom MSG

julay_msgs

1
2
3
4
5
6
7
8
catkin_create_pkg julay_msgs std_msgs roscpp
# 创建 .msg文件
# 修改项目Cmakelist
# 修改package.xml
catkin_make
# 检查生成文件位置
ls catkin_ws/devel/include/julay_msgs
JulyMsg.h
msg/JulyMsg.msg

catkin_ws/src/julay_msgs/msg/JulyMsg.msg

1
2
string detail
int32 id
CmakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs message_generation
)

## Generate messages in the 'msg' folder
add_message_files(
DIRECTORY msg
FILES
JulyMsg.msg
)

## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
Package.xml
1
2
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

julay_say(Ros Param)

src/julay_say_node.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
#include "julay_msgs/JulyMsg.h"

int main(int argc, char ** argv )
{
ros::init(argc, argv, "kk_talker");
ros::NodeHandle n;
ros::Publisher kk_pub = n.advertise<std_msgs::String>("/kk_topic", 10); // cache 10
ros::Publisher kk_pub_new = n.advertise<julay_msgs::JulyMsg>("/kk_topic_new", 10);
ros::Rate loop_rate(10);
int count = 0;

while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "Hello KK " << count;
count ++;
msg.data = ss.str();
kk_pub.publish(msg);

std::string param_string;
n.param<std::string>("myparam", param_string, "hi julay");

julay_msgs::JulyMsg julyMsg;
julyMsg.id = count;
julyMsg.detail = param_string; //"hello julay new";
kk_pub_new.publish(julyMsg);

loop_rate.sleep();

}
}
CmakeList
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
julay_msgs
)
catkin_package(
CATKIN_DEPENDS roscpp std_msgs julay_msgs
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/julay_say_node.cpp)
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
Package.xml
1
2
<build_depend>julay_msgs</build_depend>
<exec_depend>julay_msgs</exec_depend>

RUN

1
2
3
4
roscore
rosrun julay_say julay_say_node
rostopic echo /kk_topic_new
rosparam set myparam "OK"

2.7 Decker

todo

3、感知基础

4、动态环境感知与2D检测

5、动态环境感知与3D检测

6、动态环境感知与跟踪

7、高精地图V2X HD MAP

8、无人车定位系统

9、预测系统

10、道路规划

11、控制理论

12、强化学习

系列大纲

王博Kings:无人驾驶系列知识入门到提高0-总体目录

王博Kings -无人驾驶系列知识入门到提高1–总体概述

王博Kings -无人驾驶系列知识入门到提高2–软件环境

王博Kings:无人驾驶系列知识入门到提高3–感知基础

王博Kings:无人驾驶系列知识入门到提高4–动态环境感知与2D检测

王博Kings:无人驾驶系列知识入门到提高5–动态环境感知与3D检测

王博Kings:无人驾驶系列知识入门到提高6-动态环境感知与跟踪

王博Kings:无人驾驶系列知识入门到提高7-高精度地图 V2X HD MAP

王博Kings:无人驾驶系列知识入门到提高8-无人车定位系统

王博Kings:无人驾驶系列知识入门到提高9-预测系统

[TOC]

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <thread>

void work1(int& sum) {
for (int i = 1; i < 5000; i++) {
sum += i;
}
}

void work2(int& sum) {
for (int i = 5000; i <= 10000; i++) {
sum += i;
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
int ans = 0;
std::thread t1(work1, std::ref(ans));
std::thread t2(work2, std::ref(ans));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

第一实现 mutex参数lock, unlock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <thread>
#include <mutex>

void work1(int& sum, std::mutex& mylock) {
for (int i = 1; i < 5000; i++) {
mylock.lock();
sum += i;
mylock.unlock();
}
}

void work2(int& sum, std::mutex& mylock) {
for (int i = 5000; i <= 10000; i++) {
mylock.lock();
sum += i;
mylock.unlock();
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
std::mutex mylock;
int ans = 0;
std::thread t1(work1, std::ref(ans), std::ref(mylock));
std::thread t2(work2, std::ref(ans), std::ref(mylock));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

第二种 lock_guard类模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <thread>
#include <mutex>

void work1(int& sum, std::mutex& mylock) {
for (int i = 1; i < 5000; i++) {
std::lock_guard<std::mutex> mylock_guard(mylock);
sum += i;
}
}

void work2(int& sum, std::mutex& mylock) {
for (int i = 5000; i <= 10000; i++) {
std::lock_guard<std::mutex> mylock_guard(mylock);
sum += i;
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
std::mutex mylock;
int ans = 0;
std::thread t1(work1, std::ref(ans), std::ref(mylock));
std::thread t2(work2, std::ref(ans), std::ref(mylock));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

https://cloud.tencent.com/developer/article/1583894

image-20220322180612011

王博Kings:Apollo无人驾驶课程笔记总览

王博Kings:Apollo无人驾驶课程笔记1-无人驾驶概览

王博Kings:Apollo无人驾驶课程笔记2-高精度地图

王博Kings:Apollo无人驾驶课程笔记3-定位

王博Kings:Apollo无人驾驶课程笔记4-感知

王博Kings:Apollo无人驾驶课程笔记5-预测

王博Kings:Apollo无人驾驶课程笔记6-规划

王博Kings:Apollo无人驾驶课程笔记7-控制

Tools-Work:

Tools编程

  • Shell / 文件传输:

    • Xshell,putty,
    • FileZilla, Winscp
  • 对比工具:

    • BeyondCompare,Winmerge
  • 编辑器

    • Pycharm
    • Visual Studio Code
    • Visual Studio 2017
    • Android Studio
  • 版本管理:

    • Tortoise,Git
    • gitlab,github,代码中国
  • 代码检查:

    • TsanCode:c++代码检查
  • AI+

    • codegeex

    • codeFuse(阿里)

Tools-生活

  • 地图:

    • 兰图绘
    • EO Browser(卫星照)
  • 装修:

    • 酷家乐(3D)
    • SketchUP(CAD) 专业的,不会用
    • 亿图图示(2D)
      • 1【邮件页面设置–单位–毫米】
      • 2 绘图比例修改【对象–视图–比例修改1:10】
    • mayCAD(铝型材)

博客工具

  • hexo(静态网页)

  • Typecho(中国团队开发的开源跨平台博客程序。它基于PHP5构建,并支持多种操作系统(Linux,Unix,BSD,Windows)、 服务器(Apache,Lighttpd,IIS,Nginx)和数据库(Mysql,PostgreSQL,SQLite)。)

  • Octopress(是一套使用 Ruby 语言开发的博客网站框架。)

  • Farbox

  • Wordpress

  • Ghost (基于 Node.js 语言和 MySql 数据库的个人博客系统)

博客主题:maupassant