ROS学习一周后
使用Rviz用PCD文件来验证外参
- 发布外参TF
- 发布第一个PCD文件
- 发布第二个PCD文件
- 打开Rviz查看
详细内容如下:
1.发布外参
使用 static_transform_publisher。 格式: x y z yaw pitch roll parent_frame child_frame (单位:米 和 弧度)
Bash
1 | # 假设 cam1 是主坐标系,cam2 是从坐标系 |
注意:如果你的外参是四元数,把命令参数换成
x y z qx qy qz qw即可。
2.发布第一个 PCD
使用 pcl_ros 的 pcd_to_pointcloud 工具。 格式: _frame_id:=<坐标系名称> <pcd文件路径> <发布频率>
Bash
1 | # 将 cam1.pcd 发布到 /cloud1 话题,绑定坐标系 camera_link_1 |
- 核心执行部分
rosrun pcl_ros pcd_to_pointcloud- 含义:运行
pcl_ros功能包下的pcd_to_pointcloud可执行节点。 - 底层逻辑:这个 C++ 节点内部执行了
pcl::io::loadPCDFile读取文件,然后在一个while(ros::ok())循环中不断 publish 消息。
- 含义:运行
- 位置参数 (Positional Arguments)
这是传给 main(argc, argv) 函数的前两个参数,顺序固定,不能写反:
cam1.pcd(参数1: 文件路径)- 含义:你要加载的 PCD 文件路径。
- 注意:这里支持相对路径(相对于你当前终端的
pwd)或绝对路径(如/home/user/data/cam1.pcd)。如果报 “No such file”,通常就是路径没对。
1(参数2: 发布间隔 Interval)- 含义:发布的时间间隔,单位是秒。
- 底层逻辑:节点内部会调用
ros::Duration(1.0).sleep()。 - 数值影响:
- 设为
1= 1秒发一次 (1Hz)。 - 设为
0.1= 0.1秒发一次 (10Hz)。 - 设为
0= 尽可能快地发(不推荐,会跑满单核 CPU)。 - 在 RViz 调试时的建议:设为
1或0.5足够了,静态数据不需要高频发,浪费资源。
- 设为
- 私有参数 (Private Parameters)
_frame_id:=camera_link_1- 语法细节:注意前面的 下划线
_。在 ROS 命令行中,_param:=value是给节点内部的私有参数(Private NodeHandle~)赋值的标准写法。 - 作用:它修改了输出消息
sensor_msgs::PointCloud2中header.frame_id的值。 - 为什么必须加这个?
- 默认情况下,这个节点可能会把 frame_id 设为
/base_link或者空的。 - TF 树(TF Tree)是靠 frame_id 连接的。如果你不指定这个名字,RViz 收到点云后,发现它的 frame_id 是空的或者不存在于 TF 树中,就会报错
Fixed Frame [map] does not exist或点云显示不出来(白色/透明)。 - 这行代码赋予了点云“空间身份”,告诉 ROS:“这一坨点云数据,是属于
camera_link_1这个坐标系的。”
- 默认情况下,这个节点可能会把 frame_id 设为
- 语法细节:注意前面的 下划线
- 话题重映射 (Topic Remapping)
cloud_pcd:=/cloud1- 语法细节:没有下划线,直接使用
旧名:=新名。 - 作用:将节点原本默认发布的话题名
cloud_pcd改名为/cloud1。
- 语法细节:没有下划线,直接使用
3. 发布第二个 PCD
1 | # 将 cam2.pcd 发布到 /cloud2 话题,绑定坐标系 camera_link_2 |
4. 打开 RViz 查看
1 | rviz |
RViz 设置步骤:
- Global Options -> Fixed Frame: 设置为
camera_link_1。 - Add -> PointCloud2: Topic 选择
/cloud1(建议设为红色)。 - Add -> PointCloud2: Topic 选择
/cloud2(建议设为绿色)。 - Add -> TF: 检查两个坐标系的关系。
具体c++代码
- 假设的 TXT 文件格式
假设你的 calib1.txt 和 calib2.txt 内容是标准的 4x4 变换矩阵(行优先,空格或换行分隔),例如:
Plaintext
1 | 0.99 0.01 0.00 0.15 |
(代码会自动解析这16个数,提取旋转和平移)
- 更新后的 C++ 代码 (
multi_pcd_viz.cpp)
1 | #include <ros/ros.h> |
- 使用说明
步骤一:配置 CMakeLists.txt
确保包含了 roscpp, pcl_ros, tf2, tf2_geometry_msgs 等。
CMake
1 | add_executable(multi_pcd_viz src/multi_pcd_viz.cpp) |
步骤二:准备文件
确保你有 4 个文件,并且路径在代码里改对了(或者稍后我教你用 roslaunch 传参):
cam1.pcd,cam2.pcdT1.txt,T2.txt(格式必须是 16 个数字)
步骤三:RViz 设置 (关键)
编译运行后,打开 RViz:
- Fixed Frame: 设置为
base_link(因为这是根节点)。 - Add TF: 你会看到一个三叉结构(Base 指向 Cam1 和 Cam2)。
- Add PointCloud2 (x2):
- Topic:
/cloud_cam1(颜色设红) - Topic:
/cloud_cam2(颜色设绿)
- Topic: