自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 java动态代理详解

本篇文章参考以下几篇博客: https://www.cnblogs.com/gonjan-blog/p/6685611.html https://www.jianshu.com/p/4e14dd223897 https://www.cnblogs.com/benwu/articles/8283549.html 参考上述博客,本文对java的动态代理机制从底层分析,并融入自己的理解。首先,实现动态代理需要使用java.lang.reflect包下提供的Proxy类和InvocationHandler接

2021-08-06 16:20:37 2296

原创 turtlebot强化学习导航(无需安装gym)

之前写过一篇博客:详解ubuntu 16.04安装gym-gazebo,这篇博客详细介绍了如何在ubuntu 16.04环境下安装gym-gazebo,从而对turtlebot进行强化学习导航。由于其中ros中python是2.7版本的,而安装gym-gazebo需要安装gym包,它是python3版本的,两个python版本不一致,所以安装起来比较复杂,具体参加我的那篇博客。 最近,我发现了一个软件包,其可以避免安装gym,从而可以不用python3,这样就可以全程使用python2.7来进行强化学习了

2021-03-05 01:02:22 2151 4

原创 socket随笔

前言 socket(套接字),socket的英文翻译为插座。在通信过程中,套接字必须是成对(指客户端和服务器端都要创建套接字)出现的,就想插头与插座的关系一样。 在Linux环境下,socket用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。

2020-09-21 19:20:08 633

原创 多路IO转接

select多路IO转接 多路IO转接,又称IO多路复用。多路复用,意思就是本来一条链路上一次只能传输一个数据流,如果要实现两个源之间多条数据流同时传输,那就得需要多条链路了,但是复用技术可以通过将一条链路划分频率,或者划分传输的时间,使得一条链路上可以同时传输多条数据流。 多路IO转接的字面意思:原本使用socket套接字编程时,是服务器(应用程序)一直在阻塞等待客户端的连接,这样服务器端(应用程序)的压力太大。于是服务器请来了助手,即select、poll、epoll等,这几个函数借助内核来替服务器

2020-09-21 19:09:46 796

原创 使用vscode创建C++工程

1.推荐文件目录 即一个C++工程文件中包含.vscode文件夹、build文件夹、include文件夹、src文件夹以及一个CMakeLists.txt文件。 2. .vscode文件夹 .vscode文件夹一般应该包含三个配置文件:c_cpp_properties.json、tasks.json、launch.json c_cpp_properties.json是用于配置编译器环境的,这里最重要的就是includePath,其指明了C/C++标准库、用户头文件所在位...

2020-09-21 18:54:42 42048 9

原创 详解ubuntu 16.04安装gym-gazebo

前言 首先说明,本人使用官方给的教程在ubuntu 16.04上安装gym-gazebo装了好多天都失败了,为此重装系统估计有十次,网上的安装教程跟着走也是不行,最终好不容易装成功了一次,不禁感叹gym-gazebo真特么难装。所以,为了对得起这几天的辛苦与努力,也为了后来人能够不走我的老路,因此,本篇文章决定仔细讲解gym-gazebo的安装教程。 本次能够成功安装gym-gazebo,还得...

2020-03-26 00:11:21 5382 44

原创 帖子收藏

ROS相关 1.ROS中使用A星算法进行路径规划 https://blog.youkuaiyun.com/a819096127/article/details/89552223 2.ROS中move_base的全局路径规划渐进学习 https://blog.youkuaiyun.com/youngybird/article/details/82744999 3.rosparam和ROS参数服务 https:/...

2020-03-22 15:30:30 322

原创 muduo库是如何实现跨线程函数调用的

muduo库的跨线程函数主要是通过EventLoop类的成员函数runInLoop函数实现的,还是以具体的例子来一步一步的说明吧! #include <muduo/net/EventLoop.h> #include <muduo/net/EventLoopThread.h> #include <stdio.h> using namespace...

2020-03-05 01:48:09 1193 3

原创 muduo库Channel类剖析:从回调函数注册到函数执行流程全剖析

Channel通道类,它是muduo库负责注册读写事件的类,并保存了fd读写事件发生时调用的回调函数,那么它到底是如何实现对应事件发生时系统执行指定的回调函数的呢?下面我们来研究一下: Channel的数据成员: 我们看到Channel类的数据成员中有一个描述符成员fd_,每个描述符会与一个Channel绑定。同时我们看到其由4个回调函数指针成员。 事件关...

2020-03-05 00:11:33 916

原创 基于muduo库编写的服务器运行时文件描述符的创建顺序分析

这里仅以单IO线程为例,会了单IO线程的,其实多IO线程的也很好分析。 首先来看TcpServer类的数据成员: TcpServer类的构造函数: 研究TcpServer的数据成员与构造函数可以清晰的看到各个文件描述符的创建顺序。这有助于我们对整个服务器运行的流程有着一个较为清晰的了解。首先我们以TcpServer工作在单线程为例。众所周知,0、1、2分别对应s...

2020-03-04 23:57:34 302

原创 以sudoku服务器分析基于muduo的multiReactor+业务线程池模型运行流程

前言 在以sudoku服务器分析muduo的的multiReactor+业务线程池模型运行流程之前,我们首先要知道什么是multiReactor+业务线程池模型(这种模型又称为one loop per thread +线程池模型),请看下面这幅图。 所谓one loop per thread,就是每个loop循环对应一个IO线程,每个IO线程中有一个EventLoop对象,负责处理IO事件...

2020-03-04 23:22:39 910 1

原创 以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per t...

2020-03-02 15:05:43 956 1

原创 ubuntu相关

1.ubuntu 16.04使用run方式安装nvidia显卡驱动 我们在使用一些神经网络框架的时候通常需要GPU版本,而GPU版本需要我们拥有显卡,而要想使用显卡我们必须要首先安装显卡驱动。首先到下述网址搜索对应版本驱动。 https://www.nvidia.cn/Download/index.aspx?lang=cn 根据自己的显卡型号搜索对应版本的驱动,如下图所示,我的电脑显卡为G...

2020-01-04 23:06:07 341

原创 STL源码剖析笔记

目录 第二章:空间配置器 预备知识 std::allocator与std::alloc 详解std::alloc 空间配置 空间释放 构造与析构基本工具:construct()和destroy() 内存基本处理工具:uninitialized_copy()、uninitialized_fill()、uninitialized_fill_n() 小结 第三章 迭代器概念与trai...

2019-12-02 23:26:29 1647

原创 Social GAN源代码阅读报告

目录 数据处理部分:trajectories.py及数据加载部分:loader.py 网络模型部分:models.py 数据处理部分:trajectories.py及数据加载部分:loader.py Social GAN源码是基于pytorch框架来写的,trajectories.py是文件的数据处理部分。首先,我们需要知道pytorch的数据加载到模型的操作顺序。 创建一个...

2019-12-01 23:04:32 5286 41

原创 剑指offer刷题笔记

目录 1.二维数组中的查找 2.替换空格 3.从头到尾打印链表 4.重建二叉树 5.用两个栈实现队列 6.斐波那契数列 7.旋转数组的最小数字 8.矩阵中的路径 9.机器人的运动范围 10.剪绳子 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二...

2019-11-30 22:48:42 278

原创 日常学习总结

目录 2019.03.01 2019.11.13 2019.11.25 2019.11.27 2019.11.30 2019.12.01 2019.12.06 2019.12.09 2019.12.15 2019.03.01 1.set容器中insert和emplace的区别: insert : 拷贝对象到set emplace: 到set里面构造对象 2.map和pa...

2019-11-30 22:48:35 809

原创 leetcode刷题笔记

目录 1.两数之和 2.盛最多水的容器 3.三数之和 4.最接近的三数之和 5.四数之和 6.删除排序数组中的重复项 7.移除元素 8.下一个排列 9.搜索旋转排序数组 10.在排序树组中查找元素的第一个和最后一个位置 11.搜索插入位置 12.组合总和 13.组合总和II 14.旋转图像 15.缺失的第一个正数(经典) 16.接雨水 17.跳跃游戏 18.跳跃...

2019-11-30 21:56:37 625

原创 ubuntu使用过程中遇到的一些错误及解决办法

1.在编译程序的时候遇到下面的错误: CMake Error at /home/moro/work_ws/devel/share/pcl_ros/cmake/pcl_rosConfig.cmake:106 (message): Project 'pcl_ros' specifies '/usr/include/ni' as an include dir, which is no found. ...

2019-11-23 17:48:22 2757 5

原创 牛客网刷题笔记

1.题目如下,求输出结果 void fut(int**s,int p[2][3]) { **s=p[1][1]; } void main( ) { int a[2][3]={1,3,5,7,9,11},*p; p=(int*)malloc(sizeof(int)); fut(&p,a); cout<< *p; } (1)知识点:一级...

2019-02-28 20:16:07 418

原创 C++ Primer 学习(第六章)

1.函数的实参类型必须与对应的形参类型相匹配或者实参的类型能够隐式地转换成形参的类型。例如定义函数: int fact(int val) { int ret=1; while(val&gt;1) ret*=val--; return ret; } 那么调用fact(3.14)也是合法的,因为double类型的可以转换成int,等价调用fact(3)。 2.函数形参列表...

2018-10-12 10:29:20 271

原创 C++ Primer 学习(第五章)

1.如果switch语句的表达式和所有的case都没有匹配上,将直接跳转到switch结构之后的第一条语句。 2.case标签必须是整型常量表达式。例如: char ch=getVal(); int ival=42; switch(ch) { case 3.14: //错误:case标签不是一个整数 case ival: //错误:case标签不是一个常量 } 另外,任何两个case标...

2018-09-21 10:57:32 313

原创 C++ Primer 学习(第四章)

1.左值和右值 C++中可以这样简单的理解左值和右值:能够取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。一个重要的原则是在需要右值的地方可以用左值来代替,但是不能把右值当成左值(也就是位置)使用。当一个左值被当成右值使用时,实际使用的是它的内容(值)。 2.C+...

2018-09-20 21:19:39 178

原创 C++ Primer 学习(第三章)

1.命名空间的using声明 使用using namespace::name的形式,就可以直接访问命名空间中的名字,而不需要在加(形如命名空间::)前缀。例如,在程序中声明: using std::cin; 其中,std即namespace,命名空间;name即cin,成员名。声明了这句话之后,以后不需要再写std::cin,只需要cin即可。 另外,头文件当中不应包含using的声明,...

2018-09-10 11:53:24 360 1

原创 C++ Primer 学习(第二章)

1.如果表达式里既有带符号类型又有无符号类型,当带符号类型的数为负值时会出现异常的结果,这是因为带符号数会自动地转化为无符号数。例如以下程序: unsigned u=10; int u2=42; std::cou&lt;&lt;u-u2&lt;&lt;std::endl; 输出结果为4294967264。 另外,对于两个无符号数,如果从无符号数中减去一个值时,不论这个值是否为无符号数,我们...

2018-09-10 11:52:30 315

原创 ROS教程学习及Linux学习

1.Linux中如何使用vim编辑器? 使用vim filename进行编辑,例如要对package.xml文件进行编辑,那么在终端cd到指定的文件目录下,vim package.xml即可。刚开始其为命令模式,无法对文件进行编辑,需要输入i进入到编辑模式,当编辑好后,需要按esc键退出编辑模式,进入命令模式。然后输入:进入末行模式,按wq保存退出,按q!不保存退出。 2.ROS基础教程(创建R...

2018-09-10 11:50:36 4458

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除