欢迎访问我的博客首页。
话题与广播
1. 话题
从 cartographer_ros/node_constants.h 中可以看到 cartographer 订阅 4 类共 7 种话题:
// 1.1 Range Data。
constexpr char kLaserScanTopic[] = "scan"; // 激光雷达。
constexpr char kMultiEchoLaserScanTopic[] = "echoes"; // 多回波激光雷达。
constexpr char kPointCloud2Topic[] = "points2"; // 点云。
// 1.2 IMU Data。
constexpr char kImuTopic[] = "imu";
// 1.3 Odometry Pose。
constexpr char kOdometryTopic[] = "odom";
// 1.4 Fixed Frame Pose。
constexpr char kNavSatFixTopic[] = "fix";
constexpr char kLandmarkTopic[] = "landmark";
其中前 6 种话题使用的消息类型是 ROS 官方定义的 common_msgs 中的 sensor_msgs 和 nav_msgs,第 7 种路标话题使用的消息类型是自定义的。
1.1 Landmark
这是 cartographer 使用的唯一一个自定义消息类型,定义在 cartographer_ros/cartographer_ros_msgs/msg 中的 LandmarkList.msg 和 LandmarkEntry.msg。这两个文件内容如下
# LandmarkList.msg
std_msgs/Header header
cartographer_ros_msgs/LandmarkEntry[] landmarks
# LandmarkEntry.msg
string id
geometry_msgs/Pose tracking_from_landmark_transform
float64 translation_weight
float64 rotation_weight
使用 rqt_bag landmarks_demo_uncalibrated.bag 查看该消息。在左侧 landmark 上右键选择 View -> Raw,可以看到消息内容:
2. 广播
运行 cartographer 时,打开一个终端并输入 rosrun tf view_frames 会在终端目录生成两个文件 frames.pdf 和 frames.gv。pdf 文件内容如下:
从图 2 可以看出,有 2 个节点通过广播共发送 5 种变换:节点 robot_state_publisher 发布 3 种变换,节点 cartographer_node 发布 2 种变换。
节点 robot_state_publisher 被 backpack_2d.launch 启动,这是一个系统节点。它根据 urdf 文件,广播机器人各关节的两个连杆坐标系间的相对位姿。
<param name="robot_description" textfile="$(find cartographer_ros)/urdf/backpack_2d.urdf" />
<!--系统包 robot_state_publisher 的节点 robot_state_publisher-->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
节点 cartographer_node 通过函数 Node::PublishLocalTrajectoryData 发布地图、里程计、机器人本体间的相对位姿。