学习笔记(C++、ROS)
文章平均质量分 72
在学习C++、ROS的过程中,整理出的学习经验教训,
以飨后人。
内容仅供参考,注意甄别。
weixin_56337147
这个作者很懒,什么都没留下…
展开
-
docker_ROS的usb_cam使用与标定
但是,在进入容器之前,先连接相机,再进入容器,防止进入容器后刷新不出相机。或者可以使用手机平板等屏幕展示这张棋盘照片,测量棋盘小格尺寸,并保证标定过程中,图片不被缩放。正常接入相机,功能包才正常运行,此时会出现包括/camera/image话题等一系列话题。正常接入相机,功能包才正常运行,此时会出现包括/camera/image话题等一系列话题。正常启动后,弹出标定窗口,间断地调整相机位置,直到右侧"calibrate"按钮亮起,在每一步中,保持棋盘静止,直到图像在校准窗口中高亮显示。原创 2023-12-30 18:32:49 · 1438 阅读 · 1 评论 -
mp4视频转rosbag文件(图片压缩、画面旋转、时间戳调整)
将stamp加上实际时间与1970/1/1的时间差,并将调整时间戳后的compressed_image写进bag。图像的坐标系compressed_image.header.frame_id,文中是"camera"图像的话题名,文中是“/camera/image_raw/compressed”将相机录制的mp4格式文件,转为ROS系统能使用的bag格式文件。视频帧率prop_fps,文中固定为24,根据需要调整程序。如果相机的画面不是正视的,会影响后续使用,需要旋转调整。安装有ROS和python2。原创 2023-12-26 11:23:18 · 1373 阅读 · 1 评论 -
evo_ape tum指令使用及各参数使用效果
学习evo_ape tum指令的使用。原创 2023-12-12 14:29:07 · 1493 阅读 · 1 评论 -
evo_res指令使用及各参数使用效果
学习evo_res指令的使用。原创 2023-12-12 11:14:16 · 1464 阅读 · 1 评论 -
点云pcd文件转为八叉树bt文件的代码及编译流程
pcd2bt.cpp文件中,根据需要修改output_file、分辨率等。xxx.pcd修改为所需转换的pcd文件实际绝对路径。在build文件夹下,打开终端。输出结果保存到output_file。在这个文件夹中,打开终端。cmake ..通过,终端最后显示。make通过,终端最后显示。点云文件转为八叉树文件。原创 2023-12-11 15:55:39 · 681 阅读 · 0 评论 -
C++配置ini文件让修改程序中的参数而不用每次都重新编译程序
ini文件写成如下形式[section1][section2]...程序中读取:");.name2");.name1");使用命令行参数或环境变量也是在不重新编译代码的情况下动态调整程序参数的常见方式。原创 2023-05-24 15:34:08 · 594 阅读 · 1 评论 -
vector<Isometry3d> 和vector<Isometry3d, Eigen::aligned_allocator<Isometry3d>>有什么区别
vector 和vector有什么区这两个类型的区别在于它们使用的分配器不同。vector 使用默认的分配器,即std::allocator。这个分配器不保证对齐,因此可能会导致内存对齐问题,特别是在使用SSE指令集等需要对齐内存的情况下。vector 使用Eigen库提供的对齐分配器,可以确保内存对齐。原创 2023-04-22 09:30:44 · 447 阅读 · 1 评论 -
linux终端读取txt文件有几行几列
请注意,如果文件中的行具有不同的列数,则此命令可能无法正确计算列数。这将输出文件中的最大列数。这将输出文件中的行数。原创 2023-04-21 09:09:59 · 1302 阅读 · 1 评论 -
读取文件夹中以数字顺序命名的文本文件,文件名宽度固定
以kitti数据集的oxts文件夹为例,data文件夹下有一系列数据文件,每个文件名为0000000000.txt到0000000123.txt,文件名均为10位数字+txt形式,这段代码是使用C++标准库中的sprintf函数将整数i格式化成三位数字的字符串,并将其存储到名为buf的字符数组中。然后,使用C++中的字符串拼接操作符将buf中的字符串与其他字符串拼接起来,最终形成一个文件路径字符串,即path变量的值。这个文件路径字符串的格式是:"/data/" + 10位数字字符串 + ".txt"。原创 2023-05-06 15:02:35 · 129 阅读 · 1 评论 -
时间戳文件处理,从“2011-10-03 14:57:27.146615260”读取时分秒,并计算和第一个时分秒的差值
时间戳文件,里面有每行类似“2011-10-03 14:57:27.146615260”,怎么读取时分妙,并计算和第一个时分秒的差值你可以使用C++中的时间库来解析时间戳,并计算时间差。在这个示例代码中,我们首先打开一个名为“timestamps.txt”的文件,然后读取第一行时间戳并将其转换为`std::tm`结构体。然后,我们使用`std::mktime`函数将其转换为`std::time_t`类型,以便后续计算时间差。原创 2023-04-20 16:50:48 · 350 阅读 · 1 评论 -
学习笔记:C++报错整理
目录C++,程序分文件编写用g++编译链接用cmake编译链接关于C++的报错报错:deque类缺头文件报错:Isometry3d 类缺头文件报错:重复声明了变量报错:未定义的引用error: ‘Mat’ does not name a type static Mat homogeneousInverse(const Mat& T)是什么error: ‘class std::vector’ has no member named ‘getMatVector’; did you mean ‘get_alloc原创 2023-08-29 12:36:54 · 2282 阅读 · 1 评论 -
学习笔记:C++外部配置文件存储参数,而不重新编译代码
在C++中通常可以使用配置文件来存储程序中的变量和参数,使得这些参数可以在不重新编译代码的情况下进行修改。一种常见的做法是使用外部的配置文件(如INI文件)来存储这些参数,程序在启动时读取配置文件并将参数加载到内存中,以供后续使用。需要注意的是,使用配置文件的方式需要对代码进行一定的改动,而且配置文件也需要手动维护。需要注意的是,使用命令行参数或环境变量的方式需要手动设置,并不方便管理。使用命令行参数或环境变量也是在不重新编译代码的情况下动态调整程序参数的常见方式。原创 2023-08-29 12:21:27 · 348 阅读 · 1 评论 -
学习笔记:ROS使用经验(ROS报错)
要解决这个问题,你可以查看日志文件"/root/.ros/log/31b0ae1c-3295-11ee-bda9-02429b5737dc/pose_graph-5.log",其中可能包含有关进程退出的更多详细信息。这个报错表示在你的ROS工作空间中有两个具有相同包名"pose_graph"的包,分别是"vins-mono/my_reg"和"vins-mono/pose_graph"。请注意,为了避免将来的命名冲突问题,确保你的包名在整个ROS工作空间是唯一的。如果有多个结果,说明存在重复的包名。原创 2023-08-29 09:31:39 · 566 阅读 · 1 评论 -
学习笔记:ROS使用经验(rviz)
在RViz中的配置文件(例如)使用YAML格式来定义不同的可视化参数和设置。Class: 指定显示或组件的类别,如等。Enabled: 指定显示是否启用,可以设置为true或false。Name: 显示或组件的名称,用于在RViz界面中标识显示。Displays: 包含一个或多个显示的列表,每个显示都有对应的参数和配置。这可以是一个嵌套的列表,其中包含多个显示。Parameters: 特定显示所需的其他参数,可以包含参数名称和值的键值对。Topic: 指定显示应订阅的ROS主题。Color。原创 2023-08-29 09:23:32 · 1504 阅读 · 0 评论 -
学习笔记:用ROS接收rosbag发布的topic
这样,你的ROS节点就可以使用C++接收并处理rosbag播放的话题消息了。注意,你需要根据实际情况更改代码中的参数,以匹配你的rosbag文件和要接收的话题消息类型。这样,你的ROS节点就可以使用C++接收并处理rosbag文件中发布的话题消息了。请根据实际情况修改代码中的参数,以匹配你的rosbag文件和要接收的话题消息类型。要接收rosbag播放的话题消息,你可以在另一边编写一个ROS节点来订阅相应的话题。创建一个ROS功能包(或使用现有的功能包)来处理接收rosbag播放的话题消息。原创 2023-08-29 09:13:21 · 828 阅读 · 0 评论 -
学习笔记:ROS使用经验(读取再发布pcl点云)
读取<sensor_msgs::PointCloud2>格式的laserCloudMsg,将其坐标系设置为"/camera_init"再发布出去。原创 2023-08-29 09:09:47 · 888 阅读 · 0 评论 -
学习笔记:ROS使用经验( 查看rostopic的信息)
通过以上命令,你可以查看到ROS话题的相关信息,包括话题列表、消息类型、发布者/订阅者信息以及消息内容。末尾追加 >fiel_name.txt ,保存至本地文件,注意不要录制太多,否则查看时文件过大打开缓慢。替换为你要查看的话题名称,该命令将显示有关该话题的详细信息,包括消息类型和发布者/订阅者的数量。如果 topic内容太多,终端无法完全显示,则可以保存至本地文件中,再查看。替换为你要查看的话题名称,该命令将显示该话题消息的字段和数据类型。这将列出当前运行的所有活动话题。这将实时显示指定话题的消息内容。原创 2023-08-29 09:29:07 · 6382 阅读 · 1 评论 -
C++编程报错总结2023/6/17
这里假设您已经定义了 `Transform` 对象 `extr`、`start_pose` 和 `end_pose`,并且已经创建了 `org_pc` 和 `comp_pc` 对象并加载了点云数据。根据您提供的信息,变换 `start_pose` 是由一个四元数和一个平移向量构成的,其中四元数的系数为 `tk_q_w, tk_q_x, tk_q_y, tk_q_z`,平移向量的系数为 `tk_p_x, tk_p_y, tk_p_z`。`->` 操作符通常用于指向类对象的指针上,以访问该类的成员。原创 2023-06-17 22:09:03 · 487 阅读 · 0 评论 -
C++经验(全局变量与变量存储类型)
在C或C++中,`auto`、`register`、`static` 和 `extern` 是用于指定变量的存储类别(storage class)的关键字。在一个文件中定义全局变量,而在其他文件中使用时,需要在使用的文件中进行声明。原创 2023-08-29 08:41:37 · 221 阅读 · 1 评论 -
C++的两个cpp处理一个变量
因此,在多线程程序中,必须使用互斥锁等同步机制来保护共享资源的访问另外,如果需要对多个全局变量进行访问控制,可以使用std::lock函数来一次性锁定多个互斥锁,并确保在不发生死锁的情况下获得锁。但是,由于std::lock函数可能会阻塞线程,因此应该尽量避免在关键路径上使用std::lock函数,以确保程序的性能。因此,在设计多线程程序时,必须仔细考虑同步机制的选择和使用方式,以便在保证程序正确性的同时,充分利用多核处理器的性能优势。全局变量的访问,必须使用std::lock_guard。原创 2023-04-08 09:34:35 · 1262 阅读 · 1 评论 -
C++如何调用头文件里的static类型函数
类型函数是一个私有函数,那么它只能在类的内部被调用,而不能在其他源文件中被调用。如果需要在其他源文件中调用这个函数,可以将它改为公共函数。类型函数,需要在源文件中包含这个头文件,并在同一源文件中定义一个函数,然后在这个函数中调用头文件中的。类型函数是一个类的私有函数或静态函数,只能在类的内部或者同一源文件中被调用。要调用一个头文件中的。类型函数,因此我们可以直接通过类名。例如,假设我们有一个头文件。头文件,然后定义了一个。来调用它,而不需要创建。在这个例子中,我们在。原创 2023-04-20 08:43:57 · 944 阅读 · 1 评论 -
eigen库输出计算结果存在nan
这里,我们使用了Eigen库中的array()函数来将矩阵转换为一个数组,然后使用isnan()函数来判断数组中的每个元素是否为NaN。在Eigen库中,如果矩阵中的元素出现NaN,可能是因为矩阵计算中出现了非法操作,例如对无效的矩阵进行运算。如果你的程序中出现了NaN,可以尝试检查程序中的计算过程,找出可能导致NaN的操作。另外,如果你的程序中需要处理NaN,可以使用Eigen库中的isnan()函数来判断一个数是否为NaN。2. 取根号时参数为负数:在计算过程中,如果取负数的平方根,就会导致NaN。原创 2023-04-22 10:01:25 · 1391 阅读 · 3 评论