Hello World
Hello world! 欢迎来到Malloy的个人站,疫情期间宅坏了,一直想搭建自己的个人站,囫囵吞枣学习的服务器的架构和一些前端的知识,于是就自以为是的搭建起来了哈哈哈,今天终于得以实践加成功的部署了我的个人站,看到Hello world的时候心情激动极了,感觉这一周的折腾没有白费 ,Awesome ヽ(^_−)ノ . 个人站初期,很多东西需要完善,等解决了公网的问题后会把所有完善到新种草的超精致的全志H5超低功耗mini服务器Nanopi NEO2这个金属坨坨上,以后有空的时候会在这里记录分享我的作品和创作过程(^-^),也会慢慢把之前的东西整理上来,希望我不要成为’‘拖稿王’’! 折腾起来吧骚年!祝我玩的开心~
总结基础知识点面(一) 单片机篇
1. 预处理器 (Preprocessor) 1.1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 在这想看到几件事情: #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。 1.2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A)<= (B) ? (A) : (B)) 这个测试是为下面的目的而设的: 标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准C的一 ...
C++ array模板类使用
C++中的数组类型是继承了C语言的特性,在使用数组的时候要注意数组越界操作问题。为了更安全的对数组进行操作,C++提出了数组模板类array。 1. array模板类的定义 1.1 array模板类的声明 1template <class T,size_t N> class array; 数组类是固定大小的序列容器,它们包含以严格线性序列排序的特定数量的元素。数组类具有固定大小,并且不通过分配器管理其元素的分配,它们是封装固定大小元素数组的聚合类型。 1.2 容器属性 序列容器中的元素按严格的线性顺序排序。各个元素按其顺序访问它们的位置。 元素存储在连续的存储器位置,允许对元素进行恒定时间随机访问。可以偏移元素的指针以访问其他元素。 容器使用隐式构造函数和析构函数静态分配所需的空间。它的大小是编译时常量。没有内存或时间开销。 1.3 array模板类的说明 array模板类中T为包含元素的类型(std::array::value_type),N为元素个数。 1.4 array模板类头文件 使用array模板类之前需要包含#include <array> ...
C++ 代码换行的问题
编写代码时遇到代码超长的情况,为了代码的易读性,美观及方便调试,需要涉及到代码的换行问题。 1. #define宏 12#define MAX(a,b) \ ((a) < (b) ? (b) : (a)) 等价于 1#define MAX(a,b) ((a) <(b) ? (b) : (a)) 2. 关键字的换行 关键字换行支持:+ - * / % = , | & ^ ~ || && == !=以及括号等,均能作为换行符号。 1234567if (!_IsValidIndex(nIndex) || m_nChkStyle == RC_CHKBOX_NONE || (bBefore && bAfter) || (!bBefore && !bAfter)){ return FALSE;} 3. 字符串的换行 换行的字符串行尾添加双引号,下一行开头也加上双引号。 123char buf[128]; strcpy(buf, "12 ...
C++ 对数组进行复制
1. C++ 风格的复制操作 1.1 使用STL中的copy算法 1234int a[] = {1,2,3,4,5};int b[5];std::copy(std::begin(a),std::end(a),std::begin(b));for(auto e:b) cout<<e<<" "; // 输出 1,2,3,4,5 上述程序中,copy算法将数组a区间中的数复制到以begin(b)开始的区间中去. 1.2 使用array容器(C++11) 12345std::array<int,5> arr = {1,2,3,4,5};std::array<int,5> copy;copy = arr; // 将arr中的元素复制到copy中arr[0] = 100;for(auto e:copy) cout<<e<<" "; //输出 1,2,3,4,5 2. C风格的复制操作 2.1 使用memcpy( ...
C++ vector的用法
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector没有find()函数, 且返回的是迭代器, 不是数值, vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 1#include<vector>; 1. vector 的初始化:可以有五种方式,举例说明如下: 123456 (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。(2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1(3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值(4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素(5)int b[7]={1,2,3,4,5,9,8}; vector<int> a(b ...
ROS学习过程的疑问
1. ros每一个订阅器都需要一个回调函数吗? 在使用ros::spin()的情况下,一般来说在初始化时已经设置好所有消息的回调,并且不需要其他背景程序运行。这样以来,每次消息到达时会执行用户的回调函数进行操作,相当于程序是消息事件驱动的;而在使用ros::spinOnce()的情况下,一般来说仅仅使用回调不足以完成任务,还需要其他辅助程序的执行:比如定时任务、数据处理、用户界面等。 关于消息接收回调机制在ROS上略有说明 (callbacks and spinning)。总体来说其原理是这样的:除了用户的主程序以外,ROS的socket连接控制进程会在后台接收订阅的消息,所有接收到的消息并不是立即处理,而是等到spin()或者spinOnce()执行时才集中处理。所以为了保证消息可以正常接收,需要尤其注意spinOnce()函数的使用 (对于spin()来说则不涉及太多的人为因素)。 I. 对于速度较快的消息,需要注意合理控制消息队列及spinOnce()的时间。例如,如果消息到达的频率是100Hz,而spinOnce()的执行频率是10Hz,那么就要至少保证消息队列中预留的大小大 ...
ROS常用指令整理
1. 系统环境变量 1.1. 打印ros环境变量 $ echo $ROS_PACKAGE_PATH 1.2. 确认环境变量已经设置正确 export | grep ROS 1.3. 环境变量设置文件 sudo gedit ./.bashrc 包含: source /opt/ros/indigo/setup.bash source ~/catkin_ws/devel/setup.bash 2. 多机通讯环境设置 2.1. 主机端: 使用编辑器打开/etc/hosts文件(操作/etc/hosts文件需要管理员权限) sudo vim /etc/hosts 在文件中增加下面这一行(192.168.31.202为移动机器人的IP地址), 192.168.31.202 master_ip 打开.bashrc文件 vim .bashrc 在文件末尾增加下面三行,修改完成后保存退出(如果之前有设置过相关环境变量,则删除原先设置的): export ROS_IP=hostname -I | awk '{print $1}' export ROS_H ...
ROS通信框架
1. Node 在ROS的世界里,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。 从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中;从功能角度来说,通常一个node负责者机器人的某一个单独的功能。由于机器人的功能模块非常复杂,我们往往不会把所有功能都集中到一个node上,而会采用分布式的方式,把鸡蛋放到不同的篮子里。例如有一个node来控制底盘轮子的运动,有一个node驱动摄像头获取图像,有一个node驱动激光雷达,有一个node根据传感器信息进行路径规划……这样做可以降低程序发生崩溃的可能性,试想一下如果把所有功能都写到一个程序中,模块间的通信、异常处理将会很麻烦。 2. Master 由于机器人的元器件很多,功能庞大,因此实际运行时往往会运行众多的node,负责感知世界、控制运动、决策和计算等功能。那么如何合理的进行调配、管理这些node?这就要利用ROS提供给我们的节点管理器master, mast ...
ROS-windows安装ROS环境
1. Windows操作系统 Windows的ROS需要64位Windows 10桌面或Windows 10 IoT Enterprise。 请确保已在系统路径中安装了Powershell。 2. 预留安装空间 在继续操作之前,请清理并备份c:\ opt下的所有现有数据。 c:\ opt是必需的安装位置。当前未启用重定位。 请确保C:\驱动器上有10 GB的可用空间用于安装和开发。 3. 安装Visual Studio 2019 为Windows生成ROS项目需要Visual Studio和Windows的Microsoft SDK。 下载Visual Studio 2019 包括“使用C ++进行桌面开发”工作负载。 如果要构建WinML,请包括“通用Windows平台开发”工作负载。 如果已经安装了Visual Studio 2019,则可以修改安装 4. 安装Windows软件包管理器 Chocolatey是Windows的程序包管理器。它用于简化安装构建和运行ROS项目所需的工具和库的过程。以下说明将Chocolatey安装位置重定向到c:\ opt, ...