- 博客(26)
- 收藏
- 关注
原创 嵌入式Linux学习笔记
需要注意的是ubuntu文件可以直接托到windows,但是windows文件不能直接托到ubuntu,但是可以采用复制粘贴方式进行。解决方式:先试试能不能上网,比如打开浏览器是否正常上网,多半是因为网络断了导致。(1) 在主机上安装VMware Bridge Protocl并启用。(2) 在编辑虚拟机中将联网方式选中这个,并勾选复制主机物理地址。安装完成后要是还不能相互复制文件,则重启ubuntu系统。主要是是使用桥接模式联网出现的问题导致无法上网。(1.1) 使用官方推荐的方式安装。
2023-11-03 23:46:31
173
原创 ros学习之rviz中添加物体
前因:最近因为经常要使用到rviz,例如经常要在rviz中显示机器人的slam情况,虽然在rviz实现的效果还不错,但是对于机器人的本体是如何可以在rviz中显示却浑然不知,因此才有了这篇。总之:RViz 是一个强大的工具,对于机器人开发人员和研究人员来说,它是可视化和调试机器人系统的重要工具之一。它允许用户直观地了解机器人的感知和控制,有助于加速机器人应用程序的开发和测试。1.3 机器人模型:用户可以加载机器人的三维模型,以便在 RViz 中查看机器人的姿态、关节状态和运动轨迹。
2023-09-05 22:10:12
1964
原创 ros navigation源码学习(1)nav_core
从这里可以明显看出nav_core依赖于costmap_2d、geometry_msgs、std_msgs和std_msgs功能包,每个功能包的作用是做什么的,大家可以了解一下,这里最重要的costmap_2d这个包,也就是代价地图,有兴趣的可以读一下这篇论文。最重要的是makePlan函数,根据给定的起始点和目标点生成路径,并对其进行了重载,加入代价的计算。从上面的三个接口的头文件中可以看出,都是定义接口,都有成员函数会被move_base调用,因此,mose_base在导航中是一个非常重要的一个节点。
2023-09-04 17:55:54
486
原创 cpp学习之类的知识
在上面的例子中,如果尝试访问一个不存在的键,例如 myMap[“David”],则会自动在 std::map 中创建一个键为 “David” 的键值对,并将值初始化为 int 类型的默认值 0。首先创建了std::vector 然后vector存储的数据类型为 std::set set中存储的类型为::cartographer::mapping::TrajectoryBuilderInterface::SensorId。std::map 中的元素是按照键的顺序自动排序的,通常是按照键的升序排列。
2023-07-22 10:58:10
172
原创 cartographer源码学习之数据的分发:通用数据类型与频率计算
而Data 这个父类就比较简单了,只是做了一个接口,其中只有一个成员变量sensor_id_也就是传感器话题的名字。接下来我们一起看看,首先是Dispatchable这个类。接下来我们再重点看Dispatchable这个子类。可以看到它是继承了Data这个类。RateTimer逻辑分析。
2023-07-20 11:25:35
216
原创 cartographer源码学习之数据的分发:传感器的走向
在前面的篇章中我们知道trajectory_builder_指向的是CollatedTrajectoryBuilder这个类,因此也就是 trajectory_builder_->AddSensorData这个等价于CollatedTrajectoryBuilder::AddSensorData。其中又调用了 queue_.Add中的OrderedMultiQueue的Add函数。通过前面的篇章,可以知道sensor_collator_指向的是Collator类。其中都会调用AddData这个函数。
2023-07-19 21:31:47
171
原创 cartographer源码分析之数据分发:开始轨迹的处理
其中又调用了 map_builder_->AddTrajectoryBuilder中,map_builder类中的AddTrajectoryBuilder函数。StartTrajectoryWithDefaultTopics函数在node类中的实现。map_builder_bridge类的成员函数:AddTrajectory的实现。调用了map_builder_bridge类的成员函数:AddTrajectory。在添加一条轨迹时我们先从node_main.cc文件开始看起。
2023-07-19 15:42:01
174
原创 cartographer源码分析之数据的分发:MapBuilder的声明与构造
使用了工厂函数,这里的MapBuilder是MapBuilderInterface基类的一个子类。使用初始化的方法构造,在构造过程中初始化了map_builder_bridge这个类。MapBuilderBridge的初始化,过程中又构造了map_builder这个类。在构造map_builder时,触发了构造thread_pool线程池这个类。继续读node_main.cc的代码,可以发现构造了node类。构造了map_builder这个类。接下来看node类的构造;
2023-07-19 14:40:12
184
原创 cartographer源码学习之雷达数据的处理
据此,我们可以根据ranges的数据类型从而判断是哪一种传感器。从上面的函数可以看出,雷达和超声波雷达均调用了LaserScanToPointCloudWithIntensities这个函数,因此可以点进去看看它的实现。从上面可以知道这三个函数都调用了ToPointCloudWithIntensities(*msg);这个函数,因此可以猜测该函数可能是模板函数或者是函数重载。首先我们看雷达和超声波雷达是怎么处理的。看一下雷达和超声波雷达的回调函数。首先先附上雷达数据的回调函数。可以看到这是一个函数重载。
2023-07-19 13:18:13
377
原创 cartographer 源码之三维刚体转换
向量的性质:向量的具体取值,一个是和向量本身有关,一个是和坐标系的选取有关,此外向量的大小不会与方向不会随着坐标的旋转而发生变化。在这里我们把a写成了一个反对乘阵的形式,这样做的好处是将两个向量相乘的形式转成了一个矩阵与向量相乘的方式,也就是实现了线性运算。可以知道向量的外积的结果也是一个向量,其方向垂直这两个向量,大小为|A|*|B|*SIN<A,B>.咱们先从向量说起,向量可以想象成是一个坐标系的原点指向某处的箭头。还有一个意义是可以利用向量的外积描述从向量a指向向量b的旋转。
2023-06-20 10:58:22
93
原创 cartographer源码学习之node类第二篇
一个指向 Node 类的成员函数的指针,它接受三个参数:int 类型的 trajectory_id、std::string 类型的 topic,以及 typename MessageType::ConstPtr 类型的消息指针,指向的函数的返回值为空。其他的参数就比较简单了。这个也是C++11的一种特性,表示使用该方法进行键和值的构造,然后第一个forward_as_tuple表示键,将变量 trajectory_id 转发为一个 std::tuple 的操作,也就是类似元组的操作。
2023-06-16 19:31:40
132
原创 cartographer源码学习之node类
简而言之,ComputeRepeatedTopicNames 函数根据给定的话题名称和数量生成一系列重复的话题名称,并将这些话题名称存储在字符串向量中返回。返回类型:std::vector<std::set<::cartographer::mapping::TrajectoryBuilderInterface::SensorId>>点进去我们发现,这个类特别庞大,这仅仅是类的声明,还没有跳转到类的实现。函数的功能是根据每个数据包的选项,计算并返回一个包含多个数据包的默认传感器ID的集合。
2023-06-15 12:13:10
288
原创 cartographer源码学习之配置文件的读取
上一篇讲到,loadOptions这个函数实现了将NodeOptions和TrajectoryOptions参数的读取,但是我们没有继续再跳一层函数分析,cartographer是怎么实现文件的读取的,这一篇就引导大家去分析。这个生成目录的指令是在src/cartographer/cartographer/common/config.h.cmake文件中配置的。这个目录是在我们编译后生成的,因此每次修改完文件之后,最好要重新编译一下。这就是我们一直想要找的配置文件,以及还有源文件的目录。
2023-06-13 20:53:17
337
原创 cartographer源码学习之node_main.cpp文件
根据上面代码的注释,我们可以总结,该函数的功能是首先定义一个智能指针(是一个ConfigurationFileResolver类),指向配置文件的目录,然后使用这个类的方法获取配置文件的内容,接着是创建了一个字典,此时通过move已经将智能指针的所有权转到字典中,最后再返回配置参数的信息。我们发现这两个结构体的变量与lua的配置文件中的参数极为相似,因此我们不妨跳转到lua文件看看,果不其然,配置文件的参数就是这两个结构体的变量,也就是说,我们可以通过lua文件重新给这些参数赋值。首先是函数的声明类型。
2023-06-13 17:49:41
172
原创 cartographer源码学习之gflag gflog
例如,DEFINE_bool(collect_metrics, false, “Activates the collection of runtime metrics. If activated, the metrics can be accessed via a ROS service.”)定义了一个名为collect_metrics的布尔型标志,其默认值为false,并提供了描述该标志用途的字符串。这些标志可以在程序的不同部分使用,例如在主函数中进行初始化,或者在其他函数中根据标志的值执行相应的逻辑。
2023-06-13 09:40:16
278
原创 cartographer源码学习之functions.cmake
在宏的定义中,首先将变量 TARGET_COMPILE_FLAGS 设置为 ${TARGET_COMPILE_FLAGS} ${GOOG_CXX_FLAGS},将 GOOG_CXX_FLAGS 添加到已有的编译标志中。如果 ${FILES_LIST_PATH} 文件不存在,则执行 execute_process 命令,运行 ${DETECT_CHANGES_CMD},即重新生成文件列表并存储到 ${FILES_LIST_PATH} 文件中。这种情况下,编译选项可能没有被明确设置,需要用户自行配置。
2023-06-07 21:51:10
432
原创 cartographer源码学习笔记之CMakeLists.txt文件解读
{CATKIN_PACKAGE_LIB_DESTINATION} 和 ${CATKIN_GLOBAL_BIN_DESTINATION} 是变量,分别表示 catkin 包的库目录和全局二进制目录。set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${TARGET_COMPILE_FLAGS}):将 ${TARGET_COMPILE_FLAGS} 变量的内容作为 ${PROJECT_NAME} 目标库的编译选项。
2023-06-07 17:14:13
846
2
原创 使用自定义的husky_robot在gazebo仿真环境中进行cartographer建图
Husky机器人是一款由加拿大公司Clearpath Robotics研发生产的移动型机器人,它采用四轮驱动、自主导航技术和激光雷达传感器实现精准定位和环境感知。Husky机器人可用于各种应用场景,例如工业车间、仓库物流、商业服务等领域。它具有高承载能力和运动稳定性,可以搭载各种搬运装置、传感器、计算机等设备,并支持ROS、Python等编程语言进行开发和控制,非常灵活和易于定制。
2023-05-31 19:28:03
1680
3
原创 cartographer安装与编译(成功运行数据集)
雷达数据首先经过一个体素滤波器,再经过自适应体素滤波与由里程计和IMU融合构成位姿估计器生成local slam ,在local slam中 的扫描匹配使用 google 自家的seres库进行非线性求解,然后是构成子图,子图的构建过程通过运动滤波器。Cartographer结合了激光雷达和惯性测量单元(IMU)的数据,并利用了多传感器数据的时间同步性,以高效地生成准确的地图。
2023-05-30 20:42:49
6675
19
原创 cpp学习之类的内存分配
如果没有提供任何构造函数,cpp将创建默认构造函数,在创建类对象时,总是会调用构造函数。在创建对象时显式地对他进行初始化时,或者创建对象数组时,则必须显式的定义默认构造函数。1.类自动定义的隐式成员函数,c++自动提供下面的这些成员函数。新建一个对象并将其初始化为同类现有对象,都将调用复制构造函数。(1)默认构造函数,如果没有定义构造函数。(2)复制构造函数,如果没有定义。(4)默认析构函数,如果没有定义。(3)赋值操作符,如果没有定义。(5)地址操作符,如果没有定义。复制构造函数的原型通常这样。
2023-03-06 14:44:52
94
原创 cpp学习笔记之使用类
根据前面类的知识,我们知道访问类的私有部分数据只能通过公有函数,现在提供了另外一种能访问私有数据的方式,友元函数接下来要介绍的内容。
2023-03-02 13:56:39
160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅