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, ...