- 博客(56)
- 收藏
- 关注
原创 ros-noetic安装教程
ros的最后一个长期支持版本已经悄悄上线了,那么接下来我们就看一下如何在ubuntu20.04下安装.在安装之前,我们应该在软件和更新中更换国内的软件源比如清华源然后我们添加ros软件源:sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'当然你也可以选择国内的源,比如也是清华的(在这里添加中科大
2020-06-03 23:42:08 10350 14
原创 树莓派3B+安装Ubuntu20.04
ros2已经出到F版本了,本来想下载一个尝鲜一下,怒肝了两天终于把Ubuntu20.04装到树莓派里面了。但是,忽然发现F版本的还未发行,只是在网站上更新了安装方法,安装包和公钥都没公布(f?小声嘀咕)。那么我们就先来分享一下如何在树莓派上安装Ubuntu20.04 server。硬件:树莓派3b+ 2017 / 32G闪迪内存卡 / 读卡器 / 电脑???软件:win10 / balenaEtcher / 树莓派Ubuntu20.04 server镜像首先进入Ubuntu官网,进入下载页面,选择R
2020-05-10 22:57:56 10528 3
原创 ros自定义消息队列
ros中默认消息队列只有一个,也就是说,即使你的话题在另外一个线程注册订阅,也会在主线程通过ros::spin / ros::spinOnce来获取到该话题的消息,并进入回调。如果说,我们主线程需要固定频率来进行计算,而有一个服务/话题需要消耗很长时间,由于只有一个消息队列该服务会有阻塞到主线程的运算的这里就引入了自定义消息队列,我们可以将比较耗时间的服务,或者需要分离的两类计算分别放在不同的队列中比较常见的方式 ros::NodeHandle nh; nh.setCallbackQueue
2022-05-07 16:34:07 1386
原创 c++ 多线程
文章目录多线程std::threaddetachjoinableoperator =静态函数线程同步成员函数locktry_lockunlock代码std::lock_guardstd::recursive_mutexstd::timed_mutex读写锁条件变量生产消费者模型原子变量死锁永远不要同时持有两把锁保证双方上锁顺序一致用std::lock同时对多个上锁自旋锁线程池多线程多线程主要是线程的函数,创建、传参互斥锁条件变量生产消费者模型源自变量死锁*线程异步操作std::threadc++
2022-05-02 22:30:53 1264
原创 c++11特性(3)
文章目录闭包什么是闭包闭包的实现仿函数:重载operator()std::bind绑定器lambda表达式闭包什么是闭包闭包有很多定义,一种说法是,带有上下文的函数。说白了就是有状态的函数。更直接一点,不就是个类吗?换了个名字而已一个函数,带上了状态就变成闭包了。那么什么叫做带上状态呢?意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并且在调用闭包的时候,可以访问这些变量函数是代码,状态是一组变量,将代码和一组变量捆绑(bind)就形成了闭包。闭包的状态捆绑,必须发生在运行
2022-05-02 22:22:18 572
原创 c++11特性(2):智能指针及其实现
文章目录智能指针unique_ptrshared_ptrweak_ptr智能指针unique_ptrunique_ptr持有对对象的独有权,同一时刻只能有一个unique_ptr指向对象(通过禁止拷贝语义,只有移动语义来实现)生命周期:从创建开始,直到离开作用域离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)unique_ptr实际是类模板,只不过是禁用了拷贝构造函数、赋值运算符=重写了移动拷贝构造、->符号、*符号独占指针的手工实现/*手
2022-05-02 22:19:55 893
原创 c++11特性(1)
文章目录c++11新特性类型推导auto 类型推倒decltype,获取auto声明变量的类型追踪返回类型易用性的改进类内部成员初始化初始化列表防止类型收窄基于范围的for循环静态断言noexcept修饰符nullptr强枚举类型常量表达式用户自定义面量原生字符串字面值类的改进继承构造委托构造继承控制类默认函数的控制模板的改进右尖括号>改进模板的别名函数模板的默认模板参数可变参数模板右值引用左值右值引用移动语义转移构造函数转移赋值函数标准库函数std::move完美转发c++11新特性类型推导
2022-05-02 22:18:18 626
原创 锚点导航探索
工业amr在运动时,不可能让其进行自由导航特别是多机时,而是通过调度等进行停障,此时要将我们所用的栅格图转化为拓扑图,类似于磁条在敲代码过程中,困扰很久的问题,std::vector不可直接取地址,因为当vector扩容时,会新申请一段连续内存将现有的数据拷贝过去,释放掉原来的内存,这就导致了开始取得地址没有了。当vector扩容时,全部地址都会发生改变...
2022-03-16 17:15:37 576 3
原创 movebase存在的问题
movebase重大bug解析:当机器人在PLANNING状态时,只会开启plan线程,而不会发布速度及其他操作(在executeCycle函数中switch中只会进入PLANNING),而在plan线程中,当运行满足(makplan规划不出路径->当前处于PLANNING状态->未超出设定的全局规划失败次数)三个条件时程序竟然什么也不做,一直规划,直到超出设定的全局规划失败次数才会进入recovery,然后就导致这过程中没有人发布速度,一直按上一次控制状态CONTROLLING发布的速度行驶
2022-03-15 16:25:17 1197 3
原创 move_base参数 footprint 阅读
参数movebase costmap中关于机器人关于机器人模型的描述中包含两个参数,robot_radius或者footprint,robot_radius没得说,当机器人是圆形时机器人的半径,而机器人是多边形时才用footprint参数。首先,我们拿一个简单的矩形机器人来做示例,假如机器人长1.0米宽0.5米,首先我们参数设置为:footprint: [[0.5, 0.25], [0.5, -0.25], [-0.5, -0.25], [-0.5, 0.25]] 首先在costmap_2d功能
2022-01-19 17:18:58 2184
原创 软件设计原则-迪米特原则c++
迪米特法则又叫最少知识原则。只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的
2021-09-24 22:42:34 327
原创 UML 图
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。2.1 类图概述类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。2.2 类图的作用
2021-09-24 22:07:10 292
原创 ros虚拟墙
编写一个基于costmap2d的虚拟墙插件我们可以根据costmap2d中的三个插件来编写一个我们自己的虚拟墙插件,主要使用setcost方法来实现。git下载源码编译后打开功能包中的demo文件夹我们根据其中的global_costmap_params.yaml和local_costmap_params.yaml在plugins添加 -{name: virtual_wall, type:"virtual_wall::VirtuallWall"}即可重新打开导航,然后使用rviz中的"Publ
2021-06-20 15:16:47 2923 17
原创 ubuntu无法启动:kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0 – error
前两天ubuntu一直报boot卷满了,也没管他,然后忽然就进不去了,报错:kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0 – error去网上查了一下还真是boot卷饱满的问题,主要是因为boot卷太小了,linux内核一直在更新,但是旧的内核文件还在boot里面占据这空间,更新几次之后就会被占满,这时我们要把不用的内核删除即可首先进入到恢复模式中,打开终端使用命令 dpkg --get-selec
2021-03-30 11:13:27 3468 2
原创 global_planner解析(5)
前面介绍了我们的搜索算法,下面来介绍我们的主要的插件实现函数 planner_core.cppplanner_core.h#ifndef _PLANNERCORE_H#define _PLANNERCORE_H#define POT_HIGH 10e10#include <ros/ros.h>#include <costmap_2d/costmap_2d.h>#include <geometry_msgs/PoseStamped.h>#include &
2021-03-18 09:53:23 1292
原创 global_planner解析(4)
前面简单介绍了路径搜索的基类Expander,里面主要的就是calculatePotentials路径搜索的方法接口,还有路径搜索的扩展方式-普通扩展方式类PotentialCalculator,下面我们来讲一下地杰斯特拉算法该算法主要在dijkstra.h及dijkstra.cpp中我们首先来看一下头文件dijkstra.h//迪杰斯特拉算法#ifndef _DIJKSTRA_H#define _DIJKSTRA_H//优先 大小#define PRIORITYBUFSIZE 10000
2021-03-16 11:18:59 1388 2
原创 global_planner解析(3)
这章我们对路径搜索的基类Expander进行讲解:该部分代码在expander.h文件中,#ifndef EXPANDER_H#define EXPANDER_H#include <nav_planner/planner_core.h>#include <nav_planner/potenrial.h>namespace nav_planner{//扩展器class Expander{public: //构造函数 Expander(Potenti
2021-03-15 16:53:08 874
原创 qt pushbutton笔记
多个按钮连接到一个槽函数//查询时哪个按键被按下QPushButton* pBtn= qobject_cast<QPushButton*>(sender());if(pBtn==ui.open_drive){ cout << "open drive" << endl;}else if(pBtn==ui.open_slam){ cout << "open slam" << endl;}else if (pBtn==u.
2021-02-25 17:57:50 186
原创 global_planner解析(2)
第二章我们则对功能包的文件及类进行解析:首先我们看一下功能包里面有什么类分别作用(由于本人刚刚入门uml,故图片可能有所偏差)里面最主要的就是插件算法类GlobalPlanner父类nav_core::BaseGlobalPlanner,而路径搜索分别是DijkstraExpansion(地杰斯特拉算法)、AStarExpansion(astar算法),路径回溯PotentialCalculator、QuadraticCalculator(使用梯度下降)然后我们看一下里面有哪些文件:.├── b
2021-02-25 11:27:56 1080
原创 global_planner解析(1)
global_planner是ros的一个全局导航插件功能包,实现了astar和Dijkstra寻路算法。我们大部分同学会使用而网上也很少对其的完全解析,今天我们就来解析一下global_planner功能包。第一章将从其参数讲起:以下参数在启动时进行配置-old_navfn_behavior:bool ture使用原来功能包navfn的规划方式use_quadratic:bool true使用二次近似函数,false使用更简单的计算方式节省硬件资源(否的话会扩展周边4个点,是扩展周边八个)u
2021-02-25 09:58:38 2129 2
原创 c++ std::string操作笔记
find()在一个字符串中查找一个指定的单个字符或字符数组。如果找到,就返回首次匹配的开始位置;如果没有查找到匹配的内容,就返回string::npos。find_first_of()在一个目标串中进行查找,返回值是第一个与指定字符组中任何字符匹配的字符位置。如果没有查找到匹配的内容,则返回npos。find_last_of()在一个目标串中进行查找,返回最后一个与指定字符组中任何字符匹配的字符位置。如果没有查找到匹配的内容,则返回npos。find_first_not_of()在一个
2021-01-29 11:27:02 439 1
原创 c++常见错误
libssh2 编译出错error: cannot convert ‘char*’ to ‘LIBSSH2_POLLFD* {aka _LIBSSH2_POLLFD*}’ in assignment fds = (char*)malloc(sizeof(LIBSSH2_POLLFD));出现error的原因是C++设计得比C更加安全,它不能自动地将void *转换为其它指针类型。而出现warning的原因则是程序试图将字符串字面值(在C++中字符串字面值为const char []类
2021-01-28 15:56:11 886
原创 c++笔记
类public:公有类型,类外可以访问公有成员private:私有类型,只能被本类的成员函数访问,来自外部的任何访问都是非法的protected:保护性成员
2020-12-30 14:02:21 103
原创 qt c++笔记
qt文字换行 \nQLabel:文字对齐:有一个参数alignment,下拉会有水平方向和垂直方向的设置设置文字 例 ui->value_x->setText(“hello world”);
2020-12-11 10:25:14 125
原创 fox-jetson nano ros安装配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.listdeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-securi.
2020-11-23 11:07:27 284
原创 github使用笔记
什么是githubgithub是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。Github 由Chris Wanstrath, PJ Hyett 与Tom Preston-Werner三位开发者在2008年4月创办。迄今拥有59名全职员工,主要提供基于git的版本托管服务。下来需要检查SSH因为GitHub会用到SSH,因此需要在shell里检查是否可以连接到GitHub:ssh -T git@github.com配置Git.
2020-11-23 10:13:45 302
原创 ubuntu nano编辑器
nano是一个小巧自由,并且友好的编辑器,在大部分linux上都有nano命令。相对vi,刚开始nano真的是很坑。打开后直接编辑,命令如下:sudo nano /etc/hosts会出现如下显示:^G 求助 ^O 写入 ^W 搜索 ^K 剪切文字 ^J 对齐 ^C 游标位置 M-U 撤销^X 离开 ^R 读档 ^\ 替换 ^U 还原剪切 ^T 拼写检查 ^_ 跳行 M-E 重做上面是我文本编辑器中的操作提示,其中有两个键需要注意一下’^’和’M-‘。‘^’对应的就是ctrl键。‘M-‘
2020-09-02 10:55:03 2546 2
原创 opencv Python代码笔记
读取文件返回matcv2.imread(filepath)画框cv2.rectangle(image,(x1, y1), (x2, y2), (0, 255, 0), 2)# image: 图片名称# (x1, y1), (x2, y2): 坐标 (x_min, y_min), (x_max, y_max)# (0, 255, 0): 框的颜色# 2:线的粗细加idcv2.putText(image, str, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 2
2020-09-01 17:13:52 143
原创 Python str和int相互转换
string–>int1、10进制string转化为int int(‘12’)2、16进制string转化为int int(‘12’, 16)int–>string1、int转化为10进制string str(18)2、int转化为16进制string hex(18)
2020-09-01 16:54:49 854
原创 堆栈算法笔记
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。堆(数据结构):堆可以被看成是一棵树,如:堆排序。进出顺序随意栈(数据结构):一种先进后出的数据结构。std::make_heap将[start, end)范围进行堆排序,默认使用less, 即最大元素放在第一个。make_heap()是生成一个堆,大顶堆或小顶堆make_heap(_RAIter,_RAIter) 默认生成大顶堆make_heap(_RAIter,_RAIter,_Compare)
2020-08-13 15:03:32 262
原创 ros2-Foxy安装教程
ros2已经出到F版了,该如何安装呢,这里选择的是二进制安装方式.首先,确保您的语言环境支持UTF-8。sudo locale-gen en_US en_US.UTF-8sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8export LANG=en_US.UTF-8添加公钥:sudo apt update && sudo apt install curl gnupg2 lsb-releasecurl -s https:
2020-08-09 18:19:26 3537 6
原创 ros摄像头参数标定
由于摄像头内部或者外部的一些原因,生成的图像往往会发生畸变,为了避免数据源造成的误差,需要对摄像头的参数进行标定。ROS官方提供了用于单目双目摄像头标定的功能包camera_calibration。camera_ calibration功能包首先在插有待标定摄像头的电脑(本章命令均在插有待标定摄像头电脑里运行)使用以下命令安装摄像头标定功能包sudo apt-get install ros-kinetic-camera-calibration标定需要使用到棋盘格图案的标定靶,可以在光盘或者网上
2020-07-10 11:20:40 1538 1
原创 roslaunch解析
1.node是要启动的ROS节点,它包括以下几个参数:Pkg=”mypackage”:节点的功能包Type=”nodetype”:节点的类型Name=”nodename”:节点的名字Args=”arg1 arg2 arg3”:(可选)传递给节点的参数Respawn=”true”: (可选)如果节点停止,自动终止节点Ns=”foo”: (可选)在”foo”命名空间启动节点Output=...
2020-07-02 14:50:24 254
原创 ros2时间管理-Rate和Timer
ROS2编程的时间处理包括如ros1的rate睡眠,当然在ros2中你会经常用到Timer计时器系统,类似于单片机的定时器中断一类的软件计时器。Rate:这个我们并不陌生,不管是在前面章节还是在ros1中都大量使用,可以让我们在程序中进行睡眠。但是ros2函数API有一点改变:int main(int argc, char** argv){ rclcpp::init(argc, argv)...
2020-04-12 16:53:15 8549 1
原创 ros2 tf坐标变换
坐标变换是机器人学中一个非常重要的概念,机器人本体及工作环境往往存在大量的元素,在机器人设计与机器人应用中涉及到不同组件的位置和姿态,这里引入坐标系及坐标变换概念。坐标变换是机器人系统中非常基础的功能,ros2中由tf2功能包提供。tf2是一个随时间跟踪多个坐标系的功能包,树形结构故不支持并联机器人。使用tf2功能包总的来说就只有两步:1、监听TF变换2、广播TF变换通常我们可以使用tf...
2020-04-01 19:55:36 2494 2
原创 git clone出现fatal: unable to access 'https://github.com/eProsima/Micro-XRCE-DDS-Agent.git/': Could no
git clone时出现了这个错误(代理上网情况下):ln@ln-pctogo:~$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git正克隆到 'Micro-XRCE-DDS-Agent'...fatal: unable to access 'https://github.com/eProsima/Micro-XRC...
2020-03-31 13:57:38 1210
原创 ros2动作编程-client
我们在上一节学习了怎么编写一个action的服务端,那这一节就编写可以调用服务器的客户端。我们进入tutorials_action功能包的src文件夹下创建fibonacci_action_client.cpp文件,代码如下:#进入cmake文件添加编译规则:add_executable(fibonacci_action_client src/fibonacci_action_client...
2020-03-30 22:29:52 660
原创 ros2动作编程-server
我们这一节开始学习ros2的动作编程,(预留动作编程原理)将创建运行一个动作服务器节点和动作客户端节点实现斐波那契数列的运算。首先我们进入我们的消息功能包添加一个action文件夹幷在里面新建一个Fibonacci.action文件,内容如下:#goalint32 order---#resultint32[] sequence---#feedbackint32[] partial...
2020-03-30 00:44:26 944
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人