- 博客(60)
- 资源 (2)
- 收藏
- 关注
原创 关于ROS常用的cmake语句
ROS提供了ROS功能包的查找功能,并提供了与变量。比如,以上cmake语句查找了my_package功能包,于是就会将my_package的头文件与库文件路径添加到与变量中。
2023-05-30 14:32:11
1203
原创 关于线性连续系统转换到离散系统的方法
关于连续系统转换到离散系统的方法虽然通常在分析设计控制器时,总是针对连续系统设计的。但是若要将其在实际工程中应用起来,则免不了需要将它转换为离散的形式。本文主要对连续系统转换到离散系统的几种方法进行了汇总,便于之后的翻阅。参考资料:状态空间方程的离散化 - 知乎 (zhihu.com)(55条消息) 如何将连续系统状态空间方程离散化_Let’sCode的博客-CSDN博客_连续状态空间方程离散化Optimal State Estimation Kalman, H Infinity, and No
2022-04-17 17:05:05
9086
2
原创 关于传递函数的频率响应和低通滤波器
关于传递函数的频率响应和低通滤波器参考资料:【动态系统的建模与分析】9_一阶系统的频率响应_低通滤波器_Matlab/Simulink分析_哔哩哔哩_bilibili以前关于这部分只是知道了而已,并没有用MATLAB认真试验过。这里借着DR_CAN老师的课程重新复习一下。下面讨论一个简单的一阶线性系统的传递函数:G(s)=as+a(1)G(s)=\frac{a}{s+a} \tag1G(s)=s+aa(1)分析式(1)的频率响应,将s=jωs=j\omegas=jω代入,可得G(jω)=a
2022-02-15 14:55:03
5398
原创 MATLink的使用
MATLink的使用MATLink — Communicate with MATLAB from MathematicaMATLink可以理解为一个运行在Mathematica下的功能包,其作用是实现MATLAB与Mathematica的互通。通过MATLink,可以实现两款软件的数据传输、在Mathematica中使用MATLAB函数等功能。MATLink的安装很简单,只需要将安装包下载后,将解压后的文件夹放在由以下指令打开的文件夹即可。SystemOpen@FileNameJoin[{$User
2021-12-02 21:26:57
1467
2
原创 Mathematica:向量、矩阵之间的区分
Mathematica:向量、矩阵之间的区分虽然教程上说,Mathematica在创建向量时没有必要指明是行向量还是列向量。但是若事先不明确向量的类别,如何进行矩阵之间的乘法运算呢?比如,行向量和列向量的乘法结果是一个标量,但是列向量与行向量的乘法结果却是一个矩阵。如果不区分一个向量是列向量还是行向量,那么两个向量之间的乘法结果最终到底应该是一个标量还是一个矩阵呢?基于以上思考,我在Mathematica中做了如下实验。首先,借助"数学助手",我分别创建1×31\times 31×3的行向量、3
2021-11-22 15:47:55
3911
原创 MATLAB关于符号变量的迭代运算
MATLAB关于符号变量的迭代运算参考资料:matlab批量创建符号变量并放数组里 - 简书 (jianshu.com)y = sym(zeros(1,4));for m = 1:4 y(m) = ['x' num2str(m)]; end 以上程序可以用于符号变量的迭代计算中。 比如需要获得如下符号表达式:{y1=x1sin(x1)y2=x1sin(x1)+x2sin(x2)⋮yn=∑k=1nxksin(xk);\begin{cases} y_1 &= x_1 \
2021-11-05 14:39:38
835
原创 VScode:关于如何在鼠标右键选项栏中添加open with code
VScode:关于如何在鼠标右键选项栏中添加open with code关于这个问题已经有很多博客提出了解决方法,重装VScode或者修改注册表。重装VScode的方法不再赘述,大部分博客主要介绍的是修改注册表的方法。我查找了很多这样的博客,主要可以分为两种:通过编写.reg文件的方式来修改注册表。(13条消息) VSCODE添加open with code功能,实现右键打开文件夹_AKIM一枚-CSDN博客_vscode右键打开文件夹直接在注册表编辑器以UI的形式进行修改。(13条消息)
2021-10-30 18:15:28
1374
原创 CoppeliaSim笔记(3):关于关节的三种模式
CoppeliaSim笔记(3):关于关节的三种模式参考资料:CoppeliaSim User Manual (coppeliarobotics.com)(含源码)通过关节力矩指令控制LBR/iiwa机械臂运动 - 知乎 (zhihu.com)在CoppeliaSim中,关节有三种不同的模式可以选择:Passive mode:在该模式下,用户可以直接通过设置关节角度(sim.setJointPositonor sim.setSphericalJointMatrix)来控制关节位置。在这个过程
2021-08-09 22:50:37
3158
5
原创 CoppeliaSim笔记(2):运动学功能(kinematics functionality)
注意:CoppeliaSim的运动学功能是比较新的功能,在CoppeliaSim V4.1.0才出现。 我还拿低版本去跑新出的逆运动学教程,心累。。。另外,在新版本中,tool模块里DH参数提取器已经没有了,看来bug还没有修好。CoppeliaSim的运动学功能包括以下两部分:逆向运动学模块(IK mode)前向运动学模块(FK mode)该运动学功能是基于Coppelia kinematics routines 实现的,这是一个基于C++的函数库,可以单独使用在其它应用中。关于该函数库的AP
2021-08-03 21:17:14
2592
4
原创 CoppeliaSim笔记(1):remote API的使用
先简单说明一下CoppeliaSim中控制机器人仿真的7种方式:1.编写child script优点:这是最便捷的控制方法,且与最后三种控制方式比较,不会出现通信延迟.缺点:无法选择编程语言(只有Lua),执行速度比较慢,无法访问Lua以外的外部函数库。2.编写plugin这种方式通常与第一种方式联合使用;优点:可以访问外部函数库,同样没有通信延迟;缺点:比编程更加复杂,且需要外部工具编译。3,4.编写外部客户端应用(remote API)如果需要从外部应用(或机器人,或另
2021-08-03 21:06:45
3913
1
原创 质量—弹簧—阻尼系统的建模分析
质量—弹簧—阻尼系统的建模分析本文介绍如何使用数轴建模法对质量—弹簧—阻尼系统进行建模分析。这里涉及的质量块、弹簧、阻尼均为理想器件。注:实际弹簧还拥有阻尼器的效果,即实际弹簧应该是一个弹簧—阻尼系统。在分析质量—弹簧—阻尼系统时,应该注意以下两点:弹簧力方向与位移变化量的方向相反,阻尼力方向与速度变化量的方向相反;分析哪个点时,就应该从哪边开始减,如下图所示。若分析A点时,则阻尼器2对于A点的受力情况应为b2(x˙o−x˙)b_2(\dot{x}_o-\dot{x})b2
2021-07-30 21:00:38
49067
14
原创 VScode配置C++和Python
VScode配置C++和Python常用快捷键如下:打开控制栏:ctrl+shift+P如何创建c_cpp_properties.json?打开控制栏,然后输入:“C/Cpp:Edit configutation”1.配置C/C++关于C/C++的配置,可以参考:vscode C++开发环境配置教程(教你如何用vscode写C++) - 浅花迷人 - 博客园 (cnblogs.com)。我们知道,与python这类解释性语言不同,C/C++编写的源程序是无法直接运行的,需要先使用编译器编译得
2021-07-18 11:06:44
808
1
原创 Linux使用的一些记录
Linux使用的一些记录Ctrl+H可以显示当前文件夹下的隐藏文件,在home主文件夹下存在一个比较重要的文件.bashrc;用gedit打开.bashrc文本,在末尾添加命令语句,可以使得在每次打开终端时都会自动执行这些命令,省去了每次都要输入的麻烦;如何切换两个版本的python(2.7和3.8)python --version:查看当前环境下的python版本;sudo update-alternatives --list python:查看系统python的可用环境列表,如下
2021-07-16 09:36:10
135
原创 Ubuntu 16.04 + ROS Kinetic + opencv-4.2.0
Ubuntu 16.04 + ROS Kinetic + opencv4.2.0因为工作需要,要在Ubuntu 16.04 + ROS Kinetic配置下使用高版本的opencv。但是ROS Kinetic自带的opencv版本只有3.3.1,因此需要自行安装高版本的opencv,然后配置一下。配置过程比较艰难,搞了半天,因此记录一下这个过程。该过程主要分为以下3个步骤:下载安装opencv-4.2.0以及opencv_contrib-4.2.0(后者根据需要选择是否安装,因此我需要使用open
2021-07-02 00:19:31
746
1
原创 ROS:关于功能包下CMakeLists.txt和package.xml的修改
ROS:关于功能包下CMakeLists.txt和package.xml的修改当我们往ROS包中添加cpp文件时,往往需要修改功能包下的这两个文件。下面讨论一些常见情况下的这两个文件的修改。Sit1:没有添加任何依赖当cpp文件没有添加任何外部依赖时,或者在创建功能包时就已经添加了相关依赖时,我们仅需要编译创建的cpp文件即可,不需要做其他的操作。CMakeLists.txt修改如下:# 设置string_publisher.cppadd_executable(string_publisher s
2021-06-24 14:11:55
3066
转载 word2019如何设置公式编号
word如何设置公式编号找了很多设置公式编号的方法,就属这个方法最为简单有效。但是这个方法只能对一个公式起作用,每当要设置新公式时,都要重复进行这个操作。
2021-06-23 16:32:20
1108
原创 深度强化学习笔记之PPO实现细节(2)
强化学习笔记之PPO的实现细节(2)本文主要参考于Coding PPO from Scratch with PyTorch系列,但本文并不会像该系列一样手把手讲解全部的实现细节,只是记录一下自己在实现过程中遇到的一些问题和思考。下图是采用Clipped Surrogate Objective的PPO伪代码,本文的代码实现主要根据它来实现。1.构建目标函数PPO算法的实现重点,就是为了得到上图中的两个目标函数。也就是说,我们只要可以构造出式(1)和式(2)作为损失函数,基本就实现了PPO。θk+1
2021-05-27 14:59:23
2699
3
原创 深度强化学习笔记之PPO算法理解(1)
深度强化学习笔记之PPO算法理解(1)笔记内容来源于李宏毅老师的深度强化学习的PPT。关于PPO(Proximal Policy Optimization),李老师分为了三个部分进行了介绍。Policy Gradient:该方法是PPO的前身,与基于价值的强化学习方法不同,策略梯度法是对策略进行更新;On-policy | Off-policyAdd constraint:对Policy Gradient进行一些限制,前者就变成了PPO。1.Policy Gradient与基于价值的强化
2021-05-27 14:51:56
8380
3
原创 关于Pytorch中tensor的自动梯度求导与反向传播的理解
关于Pytorch中tensor的自动梯度求导与反向传播的理解参考资料:详解Pytorch 自动微分里的(vector-Jacobian product);PyTorch 的 backward 为什么有一个 grad_variables 参数?;【one way的pytorch学习笔记】(四)autograd的流程机制原理;pytorch中backward()函数详解;PyTorch 的 Autograd;为了更好的计算梯度,torch提供了一个名为的tensor的数据结构,专门用于深度学
2021-05-24 22:36:44
3318
1
原创 机器学习笔记(5):Classification
机器学习笔记(5):Classification与其它的机器学习问题相同,分类问题的本质也是去寻找一个模型(function),它可以接收一个特征向量,然后输出一个类别。从表面上看,分类问题与回归问题十分类似,那么可不可以用处理回归问题的思想去处理分类问题呢?比如一个3分类问题,我把模型的输出标签分别设置为1、2、3。在训练时,如果输入的真实类别为1,那么我就训练使模型的输出往1靠拢,其它的也是如此。然后在测试时,判断模型的输出与哪一个类别值(1,2,3)接近,最接近的就是输入的类别。看上去似乎很合
2021-05-07 20:20:47
568
3
原创 DQN初探之学习Breakout-v0
DQN初探之学习"Breakout-v0"本文记录了我初次使用DQN训练agent完成Atari游戏之"Breakout-v0"的过程。整个过程仿照DeepMind在nature发表的论文"Human-level control through deep reinforcement learning"。1.gym环境之"Breakout-v0"1.1.环境的状态空间和动作空间首先确定"Breakout-v0"的动作空间和状态空间,其状态是游戏截图。env = gym.make('Breakout-
2021-05-05 17:07:03
5624
10
原创 关于由import引起的Process finished with exit code -1073741819 (0xC0000005)
关于由import引起的Process finished with exit code -1073741819 (0xC0000005)今天在使用神经网络做路径规划时,遇到了一个很奇葩的问题。我把训练好的模型参数导入模型后,运行路径规划程序,然后发现Pycharm迟迟跳不出规划图像,最后程序莫名的就停止了,然后出现了“Process finished with exit code -1073740791 (0xC0000409)”这句话。就很莫名奇妙,我把import torch去掉之后,程序又可以正常
2021-04-21 22:15:47
1057
2
原创 基于采样的路径规划算法总结
基于采样的路径规划算法总结路径规划算法大致可以分为两类,一类是基于搜索的规划,另一类就是本文将要涉及的基于采样的规划。一般而言,基于搜索的规划(如A*)通常是运行在栅格地图上的。当栅格的分辨率越高时,算法搜索的路径就会越优。还有一类算法是基于采样的,主要就是RRT和它的变种算法。这类算法的核心在于随机采样,从父节点开始,随机在地图上生成子节点,连接父子节点并进行碰撞检测,若无碰撞,就扩展该子节点。就这样,不断地随机扩展样本点,直到生成一条连接起点和终点的路径。如下图所示,RRT算法的扩展图与盘根错节的树
2021-04-18 12:57:55
5846
2
原创 RRT与碰撞检测
RRT与碰撞检测在基于采样的路径规划算法中,快速搜索随机树(RRT)可以说是一个最为经典的算法。围绕RRT的改进算法几乎每年都有,就如同基于搜索的规划算法中的A*。RRT的规划算法流程很简单,如下所示:首先RRT会初始化一个列表V,用于存放候选路径。在最开始,算法会把起点vstartv_{start}vstart加入到列表V中;然后RRT会在地图的free区域上随机生成一个节点vrandv_{rand}vrand,通过V表找到与新节点vrandv_{rand}vrand距离最近的节点vnea
2021-04-12 22:12:47
4278
10
原创 机器学习笔记(2):Guideline of ML
机器学习笔记(2):Guideline of ML上个笔记提到了机器学习的大致流程就是先选择一个合适模型,然后定义一个损失函数和选择一个优化算法,然后用训练数据进行训练。当训练结束后,我们就可以把这个优化好的模型应用于真实的数据中。事情似乎很简单,好像根本不需要人为的干预,我们只需要把数据交给计算机,然后就等机器训练好就完了。但是在实际训练模型的过程中,我们往往会遇到各种各样的问题,比如模型的损失值一直不下降、训练损失很小但测试损失却很大等等。这些问题都需要我们人为来进行识别然后去想办法解决。1.G
2021-04-11 20:11:11
523
原创 机器学习笔记(1):深度学习基本概念简介
机器学习笔记(1):深度学习基本概念简介在李宏毅老师最新的机器学习课程中,以一种极为精彩的方式从机器学习引入了深度学习,并且相当直观地解释了神经网络可以拟合任意曲线的原因,让我受益良多。于是,就有了这篇博客。注:下文的所有图片均来自李老师的PPT。机器学习模型训练的大致流程如下图所示,总共分为三个步骤:选择一个合适的带有未知参数的函数(或模型);定义一个损失函数,如MSE,若输出是概率,那么也可能是Cross-Entropy;选择一种优化器,通过训练数据来优化函数的参数。关于后两步的内容
2021-04-10 23:14:00
299
原创 基于搜索的路径规划算法总结
全局路径规划部分算法总结一般而言,全局路径规划都是假设全局地图是完全已知的,然后就可以根据已知的全局信息进行全局规划。当然,也存在假设全局地图是部分未知的或完全未知的规划算法,如D*算法,这部分在本文中暂且不涉及。本文涉及的全局规划算法包括:广度优先算法(Breadth-first Searching,bfs)深度优先算法(Depth-first Searching,dfs)Dijkstra算法最佳优先搜索算法(Best-first Searching,BFS)A*算法程序参考于:Path
2021-03-20 16:12:31
1676
2
原创 ROS:添加第三方库
ROS:添加第三方库参考资料:C++静态库和动态库;GCC参数详解;ROS添加第三方库;在ROS中调用外部链接库文件(.so)配置方法.编写C++程序时,为了方便,常常会使用一些已经编好的开源库。那么如何使用这些开源库就成了一个问题。之前我一直对这方面不太清楚,这次需要在ROS中使用第三方库,正好查查资料了解一下这方面的知识。1.C++库库是指已经写好的现有的,成熟的,可以复用的代码。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。一般会存在两种类型的库,它们的命名
2021-02-25 17:56:23
4686
原创 ROS:关于节点和节点句柄以及命名空间
ROS:关于节点和节点句柄以及命名空间参考资料:ROS官方文档首先,我们需要明确的是 节点 和 节点句柄 是不同的。一般而言,一个cpp文件只能启动一个ROS节点,但作为该节点的句柄却可以设置多个。The ros::NodeHandle class serves two purposes. First, it provides RAII-style startup and shutdown of the internal node inside a roscpp program. Second,
2021-02-22 19:12:36
8693
3
原创 ROS:回调函数处理与回调队列
ROS:回调函数处理与消息队列参考资料:roscpp官方文档在ROS节点的执行过程中,如果程序中存在订阅器和回调函数,就必然会面临两个问题:订阅器的队列长度选择多大?该使用spinOnce()还是spin()处理回调函数?1.话题回调机制我在查找相关资料时得知,ROS在处理回调函数时,并不是消息传来就立刻进行处理的,特别是在使用spinOnce()处理回调函数时。即便使用spin()处理时,若发布器的发布频率过快,同样会导致无法及时处理回调函数的问题。此时,就需要用到我们在定义订阅器时
2021-02-22 13:26:35
6711
2
原创 ROS之多个订阅数据同步
做传感器数据融合时,常常会需要用到多个数据,即需要同时订阅多个话题。那么,如何同步这些传感器数据的时间辍,并将它们放入一个回调函数中进行处理呢?参考文档:http://wiki.ros.org/message_filtersROS自带多传感器时间同步机制Time Synchronizer测试ros消息时间同步与回调有些消息类型会带有一个头部数据结构,如下所示。信息中带有时间辍数据,可以通过这个数据进行时间同步。std_msgs/Header header uint32 seq tim
2021-01-28 20:56:38
3775
8
转载 Python3与Python2的兼容写法
Python3与Python2的兼容写法兼容写法由于Python2和Python3之间有很大的修改,因此在使用上往往会出现很多问题。通过兼容写法,在转换python版本时可以避免一些问题。
2021-01-25 19:51:03
281
原创 ROS:关于xacro模型在gazebo的加载
ROS:关于xacro模型在gazebo的加载这个模型加载问题折磨了我好几天,今天总算是找到问题所在。我还一直以为是新版本的问题,结果却是自己的问题——不够仔细。因此记录下来,引以为戒。1.问题描述:惯性矩阵没有正确加载虽然遇到了很多问题,但都可以归结为一个问题:在调用宏定义时,必须加上xacro:,这是新版本的noetic与旧版本的区别。若没有加上这句前缀,则在rviz和gazebo中都会遇到显示不全的问题。这个区别虽然我早就知道了,但还是花费了好几天才成功在gazebo中加载出完整的模型(
2021-01-23 19:57:43
2180
8
原创 关于订阅器无法接收发送器发送的第一个数据
关于订阅器无法接收发送器发送的第一个数据发布器最好在程序一开始就设置好,否则可能会出现数据无法准确被接收的情况。如以下程序所示,我把发布器的定义放在了server的回调函数中,会出现第一次发布的数据无法被订阅器接收到的情况,但接下来发布的数据却可以被准确接收到。可能的原因是在第一次发布数据时,该发布器还没有完成与master的交互(时间太快),因此master无法建立发布器与订阅器之间的正确连接。class TurtleControlService{private: ros::NodeHan
2021-01-08 22:38:52
154
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人