ROS中geometry_msgs消息类型

本文详细介绍了ROS中常用的几何消息类型,包括点、多边形、位姿等,并解释了它们的应用场景,如点云处理、位姿估计等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Point   点

float64 x  ,float64 y,float64 z

Point32 float32 x,float32 y,float32 z  一般使用Point,大规模点云使用Point32

PointStamped :(1)std_msgs/Header header 包含坐标系和时间戳信息  

                           (2)geometry_msgs/Point point 点


Polygon 多边形  geometry_msgs/Point32[] points

PolygonStamped (1)std_msgs/Header header   

                                (2)geometry_msgs/Polygon polygon

Pose  位姿(1)geometry_msgs/Point position 位置 

                    (2)geometry_msgs/Quaternion orientation 姿态,即方向


Pose2D  2d平面的位姿float64 x,float64 y,float64 theta

PoseArray  位姿序列:(1)std_msgs/Header header

                                   (2)geometry_msgs/Pose[] poses

PoseStamped 位姿:(1)std_msgs/Header header  

                                 (2)geometry_msgs/Pose pose

PoseWithCovariance:(1)geometry_msgs/Pose pose   即(x, y, z,  X 旋转, Y旋转,  Z旋转)

                                     (2)float64[36] covariance协方差

PoseWithCovarianceStamped(1)std_msgs/Header header     

                                                   (2)geometry_msgs/PoseWithCovariance pose


Quaternion 四元数旋转float64 x,float64 y,float64 z,float64 w

QuaternionStamped

Transform  坐标系之间的变换:(1)geometry_msgs/Vector3 translation 平移向量                             (2)geometry_msgs/Quaternionrotation 旋转向量


TransformStamped

Twist 速度(1)geometry_msgs/Vector3 linear 线速度

                (2)geometry_msgs/Vector3 angular角速度

TwistStamped

TwistWithCovariance

TwistWithCovarianceStamped

Vector3  向量float64 x,float64 y,float64 z

Vector3Stamped

Wrench  力(1)geometry_msgs/Vector3 force 力

                  (2)geometry_msgs/Vector3 torque 扭矩  没用过,不太懂这个

WrenchStamped


rviz中的显示

点point Pose   PoseArray 

这是我的测试函数:#include <memory> #include <chrono> #include <vector> #include "rclcpp/rclcpp.hpp" #include "kx_topic/msg/system_state.hpp" #include "kx_topic/msg/planning_control.hpp" #include "kx_topic/msg/pose.hpp" #include "kx_topic/msg/localization_state.hpp" #include "kx_topic/msg/way_points.hpp" #include "kx_topic/msg/perception_state.hpp" #include "kx_topic/msg/rigid_velocity.hpp" #include "kx_topic/msg/driving_state.hpp" #include "kx_topic/msg/planning_state.hpp" #include <kx_common/transform/kxtransform.h> #include <kx_common/system/topic_attr_define.h> #include "geometry_msgs/msg/pose_array.hpp" #include "visualization_msgs/msg/marker_array.hpp" #include "tf2_ros/transform_broadcaster.h" #include <tf2_geometry_msgs/tf2_geometry_msgs.hpp> class TestPlanningNode : public rclcpp::Node { public: TestPlanningNode() : Node("test_planning_node") { // 初始化变量 current_pose_.x = 0.0; current_pose_.y = 0.0; current_pose_.yaw = 0.0; current_velocity_.vx = 0.5; // 初始速度0.5 m/s // 创建发布器 system_state_pub_ = create_publisher<kx_topic::msg::SystemState>( "system_state", 10); planning_control_pub_ = create_publisher<kx_topic::msg::PlanningControl>( "planning_control", 10); pose_fusion_pub_ = create_publisher<kx_topic::msg::Pose>( "pose_fusion", 10); localization_state_pub_ = create_publisher<kx_topic::msg::LocalizationState>( "localization_state", 10); perception_state_pub_ = create_publisher<kx_topic::msg::PerceptionState>( "perception_state", 10); chassis_velocity_pub_ = create_publisher<kx_topic::msg::RigidVelocity>( "chassis_velocity", 10); driving_state_pub_ = create_publisher<kx_topic::msg::DrivingState>( "driving_control", 10); // 创建订阅器(用于可视化) waypoints_sub_ = create_subscription<kx_topic::msg::WayPoints>( "waypoints", 10, std::bind(&TestPlanningNode::waypointsCallback, this, std::placeholders::_1)); planning_state_sub_ = create_subscription<kx_topic::msg::PlanningState>( "planning_state", 10, std::bind(&TestPlanningNode::planningStateCallback, this, std::placeholders::_1)); // RViz可视化发布器 - 确保使用正确的命名空间和ID path_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>( "path_viz", 10); waypoints_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>( "waypoints_viz", 10); obstacle_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>( "obstacle_viz", 10); car_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>( "car_viz", 10); // 创建50米长的测试路径(直线) createTestPath(); // 创建定时器发布测试数据 publish_timer_ = create_wall_timer( std::chrono::milliseconds(100), std::bind(&TestPlanningNode::publishTestData, this)); // 创建定时器更新车辆位置 update_timer_ = create_wall_timer( std::chrono::milliseconds(200), std::bind(&TestPlanningNode::updateVehiclePosition, this)); // 创建定时器用于可视化 viz_timer_ = create_wall_timer( std::chrono::milliseconds(500), std::bind(&TestPlanningNode::publishVisualization, this)); // 初始化可视化标记 initMarkers(); } private: void initMarkers() { // 初始化路径标记 path_marker_.header.frame_id = "map"; path_marker_.ns = "test_path"; path_marker_.id = 1; path_marker_.type = visualization_msgs::msg::Marker::LINE_STRIP; path_marker_.action = visualization_msgs::msg::Marker::ADD; path_marker_.scale.x = 0.1; path_marker_.color.r = 0.0; path_marker_.color.g = 1.0; path_marker_.color.b = 0.0; path_marker_.color.a = 1.0; // 初始化路径点标记 waypoints_marker_.header.frame_id = "map"; waypoints_marker_.ns = "planning_waypoints"; waypoints_marker_.id = 2; waypoints_marker_.type = visualization_msgs::msg::Marker::SPHERE_LIST; waypoints_marker_.action = visualization_msgs::msg::Marker::ADD; waypoints_marker_.scale.x = 0.3; waypoints_marker_.scale.y = 0.3; waypoints_marker_.scale.z = 0.3; waypoints_marker_.color.r = 1.0; waypoints_marker_.color.g = 0.0; waypoints_marker_.color.b = 0.0; waypoints_marker_.color.a = 1.0; // 初始化障碍物标记 obstacle_marker_.header.frame_id = "map"; obstacle_marker_.ns = "obstacle"; obstacle_marker_.id = 3; obstacle_marker_.type = visualization_msgs::msg::Marker::CUBE; obstacle_marker_.action = visualization_msgs::msg::Marker::ADD; obstacle_marker_.scale.x = 1.0; obstacle_marker_.scale.y = 1.0; obstacle_marker_.scale.z = 0.5; obstacle_marker_.color.r = 1.0; obstacle_marker_.color.g = 0.0; obstacle_marker_.color.b = 0.0; obstacle_marker_.color.a = 1.0; // 初始化车辆标记 car_marker_.header.frame_id = "map"; car_marker_.ns = "vehicle"; car_marker_.id = 4; car_marker_.type = visualization_msgs::msg::Marker::CUBE; // 使用立方体代替模型 car_marker_.action = visualization_msgs::msg::Marker::ADD; car_marker_.scale.x = 2.0; // 车长 car_marker_.scale.y = 1.0; // 车宽 car_marker_.scale.z = 0.5; // 车高 car_marker_.color.r = 0.0; car_marker_.color.g = 0.0; car_marker_.color.b = 1.0; car_marker_.color.a = 0.8; } void createTestPath() { // 创建一条50米长的直线路径 kx_topic::msg::PlanningBezier3Route route; // 起点 route.p0.x = 0.0; route.p0.y = 0.0; route.p1.x = 10.0; route.p1.y = 0.0; route.p2.x = 40.0; route.p2.y = 0.0; route.p3.x = 50.0; route.p3.y = 0.0; route.limit_speed = 1.0; // 限速1.0 m/s route.tracking_precision = kx_topic::msg::PlanningBezier3Route::TRACKING_PRECISION_NORMAL; route.stopping_precision = kx_topic::msg::PlanningBezier3Route::STOPPING_PRECISION_NORMAL; route.avoid_left_enable = true; route.avoid_right_enable = true; // 添加到控制消息 planning_control_msg_.control_type = kx_topic::msg::PlanningControl::CONTROL_TYPE_TRACK_BEZIER3; planning_control_msg_.track_bezier3_data.bezier3_route.push_back(route); planning_control_msg_.track_bezier3_data.bezier3_route_current_index = 0; // 设置障碍物在25米处 obstacle_position_.x = 25.0; obstacle_position_.y = 0.0; // 创建路径可视化点 for (double x = 0; x <= 50; x += 1.0) { geometry_msgs::msg::Point p; p.x = x; p.y = 0.0; p.z = 0.0; path_marker_.points.push_back(p); } } void publishTestData() { // 发布系统状态 auto system_state_msg = kx_topic::msg::SystemState(); system_state_msg.state = 1; // AUTO状态 system_state_pub_->publish(system_state_msg); // 发布规划控制 planning_control_pub_->publish(planning_control_msg_); // 发布定位状态 auto localization_state_msg = kx_topic::msg::LocalizationState(); localization_state_msg.map_id = 1; // 有效地图ID localization_state_pub_->publish(localization_state_msg); // 发布感知状态(包含障碍物) auto perception_state_msg = kx_topic::msg::PerceptionState(); // 添加障碍物 kx_topic::msg::Obstacle2d obstacle; obstacle.center_x = obstacle_position_.x; obstacle.center_y = obstacle_position_.y; obstacle.center_z = 0.0; obstacle.movable = false; // 创建障碍物多边形(正方形) geometry_msgs::msg::Point32 p; p.x = obstacle_position_.x - 0.5; p.y = obstacle_position_.y - 0.5; obstacle.polygon.points.push_back(p); p.x = obstacle_position_.x + 0.5; p.y = obstacle_position_.y - 0.5; obstacle.polygon.points.push_back(p); p.x = obstacle_position_.x + 0.5; p.y = obstacle_position_.y + 0.5; obstacle.polygon.points.push_back(p); p.x = obstacle_position_.x - 0.5; p.y = obstacle_position_.y + 0.5; obstacle.polygon.points.push_back(p); perception_state_msg.obstacles.push_back(obstacle); perception_state_pub_->publish(perception_state_msg); // 发布底盘速度 chassis_velocity_pub_->publish(current_velocity_); // 发布驾驶状态 auto driving_state_msg = kx_topic::msg::DrivingState(); driving_state_pub_->publish(driving_state_msg); } void updateVehiclePosition() { // 根据速度更新车辆位置 double dt = 0.2; // 200ms current_pose_.x += current_velocity_.vx * dt * cos(current_pose_.yaw); current_pose_.y += current_velocity_.vx * dt * sin(current_pose_.yaw); // 发布车辆位姿 auto pose_msg = kx_topic::msg::Pose(); pose_msg.x = current_pose_.x; pose_msg.y = current_pose_.y; pose_msg.z = 0.0; pose_msg.roll = 0.0; pose_msg.pitch = 0.0; pose_msg.yaw = current_pose_.yaw; pose_fusion_pub_->publish(pose_msg); } void waypointsCallback(const kx_topic::msg::WayPoints::SharedPtr msg) { // 存储最新的路径点用于可视化 latest_waypoints_ = *msg; } void planningStateCallback(const kx_topic::msg::PlanningState::SharedPtr msg) { // 打印规划状态信息 RCLCPP_INFO(get_logger(), "Planning State: control_type=%d, sub_state=%d", msg->current_control_type, msg->track_bezier3_data.sub_state); } void publishVisualization() { auto now = this->now(); // 更新并发布路径标记 path_marker_.header.stamp = now; path_viz_pub_->publish(path_marker_); // 更新并发布路径点标记 waypoints_marker_.header.stamp = now; waypoints_marker_.points.clear(); if (latest_waypoints_.waypoints.size() > 0) { for (const auto& wp : latest_waypoints_.waypoints) { geometry_msgs::msg::Point p; p.x = wp.x; p.y = wp.y; p.z = 0.0; waypoints_marker_.points.push_back(p); } } waypoints_viz_pub_->publish(waypoints_marker_); // 更新并发布障碍物标记 obstacle_marker_.header.stamp = now; obstacle_marker_.pose.position.x = obstacle_position_.x; obstacle_marker_.pose.position.y = obstacle_position_.y; obstacle_marker_.pose.position.z = 0.0; obstacle_viz_pub_->publish(obstacle_marker_); // 更新并发布车辆标记 car_marker_.header.stamp = now; car_marker_.pose.position.x = current_pose_.x; car_marker_.pose.position.y = current_pose_.y; car_marker_.pose.position.z = 0.0; // 设置车辆方向 tf2::Quaternion quat; quat.setRPY(0, 0, current_pose_.yaw); car_marker_.pose.orientation = tf2::toMsg(quat); car_viz_pub_->publish(car_marker_); } // 变量声明 struct Pose { double x; double y; double yaw; }; Pose current_pose_; kx_topic::msg::RigidVelocity current_velocity_; kx_topic::msg::PlanningControl planning_control_msg_; kx_topic::msg::WayPoints latest_waypoints_; geometry_msgs::msg::Point obstacle_position_; // 可视化标记 visualization_msgs::msg::Marker path_marker_; visualization_msgs::msg::Marker waypoints_marker_; visualization_msgs::msg::Marker obstacle_marker_; visualization_msgs::msg::Marker car_marker_; // 发布器 rclcpp::Publisher<kx_topic::msg::SystemState>::SharedPtr system_state_pub_; rclcpp::Publisher<kx_topic::msg::PlanningControl>::SharedPtr planning_control_pub_; rclcpp::Publisher<kx_topic::msg::Pose>::SharedPtr pose_fusion_pub_; rclcpp::Publisher<kx_topic::msg::LocalizationState>::SharedPtr localization_state_pub_; rclcpp::Publisher<kx_topic::msg::PerceptionState>::SharedPtr perception_state_pub_; rclcpp::Publisher<kx_topic::msg::RigidVelocity>::SharedPtr chassis_velocity_pub_; rclcpp::Publisher<kx_topic::msg::DrivingState>::SharedPtr driving_state_pub_; // 订阅器 rclcpp::Subscription<kx_topic::msg::WayPoints>::SharedPtr waypoints_sub_; rclcpp::Subscription<kx_topic::msg::PlanningState>::SharedPtr planning_state_sub_; // 可视化发布器 rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr path_viz_pub_; rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr waypoints_viz_pub_; rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr obstacle_viz_pub_; rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr car_viz_pub_; // 定时器 rclcpp::TimerBase::SharedPtr publish_timer_; rclcpp::TimerBase::SharedPtr update_timer_; rclcpp::TimerBase::SharedPtr viz_timer_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<TestPlanningNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }但是运行planning之后再运行这个测试节点会显示和planning终端里一样的内容即test_planning_node终端内容:[INFO] [1753150661.203834771] [kx_planning]: localization map_id=-1<0, now allow move [INFO] [1753150662.223568424] [kx_planning]: running. real interval: 19.913 ms, calc: 0.008 ms, mode=0(idle) [INFO] [1753150662.223612171] [kx_planning]: localization map_id=-1<0, now allow move [INFO] [1753150663.244129907] [kx_planning]: running. real interval: 21.011 ms, calc: 0.008 ms, mode=0(idle) 等,planning终端里的内容:[INFO] [1753150639.991114081] [kx_planning]: running. real interval: 19.843 ms, calc: 0.022 ms, mode=0(idle) [INFO] [1753150639.991145309] [kx_planning]: localization map_id=-1<0, now allow move [INFO] [1753150641.011186408] [kx_planning]: running. real interval: 20.794 ms, calc: 0.009 ms, mode=0(idle) [INFO] [1753150641.011215057] [kx_planning]: localization map_id=-1<0, now allow move [INFO] [1753150642.011464393] [kx_planning]: running. real interval: 19.955 ms, calc: 0.018 ms, mode=0(idle) [INFO] [1753150642.011516071] [kx_planning]: localization map_id=-1<0, now allow move 等。而且topic list内容如下/chassis_velocity /driving_control /error /feedback_waypoints /localization_state /parameter_events /perception_state /planning_control /planning_debug_all_points /planning_debug_current_point /planning_debug_current_pose /planning_debug_response_car_limit_polygon /planning_debug_response_car_polygon /planning_debug_response_car_pose /planning_debug_response_car_stop_polygon /planning_debug_response_obstacle_point /planning_state /pose_fusion /rosout /system_state /waypoints 没有我发布的path_viz等话题,请问怎么回事?
最新发布
07-23
<think>我们分析一下问题: 1. 用户提供了一个测试节点代码,用于模拟发布一些话题,并接收规划节点发布的路径点,同时进行可视化。 2. 用户运行规划节点(planning)和这个测试节点后,测试节点终端输出的日志与规划节点的日志相同,且用户发现没有发布出可视化的话题(如path_viz等)。 可能的原因: a) 日志重复输出问题:测试节点中订阅了规划节点发布的某个话题,并在回调函数中打印了日志,但用户提供的回调函数(planningStateCallback)中确实打印了日志。然而,用户提到两个终端输出相同内容,可能是由于两个节点都使用了相同的节点名?但测试节点名为"test_planning_node",规划节点名为"kx_planning",所以不应该出现节点名冲突。 但是,注意在测试节点中,我们创建了一个订阅: planning_state_sub_ = create_subscription<kx_topic::msg::PlanningState>("planning_state", ...); 当规划节点发布`planning_state`话题时,测试节点会收到并打印日志。而规划节点自身也会打印日志(比如在它的循环中)。因此,两个节点都会打印日志,但内容可能不同。然而用户描述为“一样”,可能是时间戳不同但内容相似。 b) 可视化话题未发布:用户提到在`topic list`中没有看到`path_viz`等话题。我们检查代码,发现测试节点中创建了这些发布器: path_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>("path_viz", 10); waypoints_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>("waypoints_viz", 10); obstacle_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>("obstacle_viz", 10); car_viz_pub_ = create_publisher<visualization_msgs::msg::Marker>("car_viz", 10); 这些话题名字是相对名称,因此它们会出现在节点命名空间下。由于节点名为`test_planning_node`,所以完整话题名应该是: /test_planning_node/path_viz ... 等等 但是,用户列出的topic list中并没有这些话题。可能的原因有: - 发布器创建失败?但代码中在构造函数里创建,应该不会失败。 - 没有消息发布?但是代码中有一个定时器(viz_timer_)每500ms调用一次publishVisualization(),在该函数中会发布这些标记。 因此,我们需要检查: - 定时器是否正常启动?代码中确实创建了定时器。 - 发布函数是否被调用?可以在publishVisualization函数中添加一些日志输出。 另外,用户还提到,运行测试节点后,测试节点终端显示的内容和规划节点终端一样。这可能是因为测试节点订阅了规划节点发布的话题(如planning_state),然后在回调函数中打印了日志(planningStateCallback函数中的RCLCPP_INFO)。而规划节点自身也会打印日志,所以两个终端都会输出关于规划状态的信息。 解决方案建议: 1. 对于日志重复问题:如果不希望测试节点打印规划状态,可以注释掉planningStateCallback中的日志输出。但用户可能是想看到这些信息,所以也可以保留。 2. 对于可视化话题未发布:首先检查话题名称是否正确。由于节点名是`test_planning_node`,所以话题应该是`/test_planning_node/path_viz`等。用户可以使用`ros2 topic list`查看完整列表,或者使用通配符`ros2 topic list | grep viz`。 如果确实没有,可能是发布器创建失败,或者节点没有运行到发布的部分。我们可以在测试节点的publishVisualization函数中添加日志,确认函数是否被调用。 修改代码,在publishVisualization函数开头添加: RCLCPP_INFO(get_logger(), "Publishing visualization markers"); 然后重新运行,观察测试节点的终端是否有这条日志。 另外,检查RViz中是否添加了这些Marker的显示,并设置正确的Fixed Frame(代码中为"map")。 由于用户提供的代码较长,这里先给出可能的问题原因和调试建议。 根据用户的问题,我们重点解决可视化话题未发布的问题,以及日志输出问题。 但是,由于用户要求我们使用中文回答,并在最后提出3-5个相关问题,因此我们按照要求回答。 回答: 您的测试节点代码中,可视化话题(如`path_viz`)是使用相对名称创建的,因此完整话题名会包含节点命名空间(例如:`/test_planning_node/path_viz`)。您提供的topic list中并没有这些话题,可能是因为: - 节点未成功创建发布器(但代码逻辑上创建了)。 - 发布消息的定时器回调未触发(但代码中创建了viz_timer_定时器)。 - 您查看topic list的方式可能没有显示完整(例如,未使用`-a`选项显示隐藏话题?但您的话题不是隐藏的)。 建议您: 1. 使用`ros2 topic list`命令时,尝试用`ros2 topic list | grep viz`来查找包含"viz"的话题。 2. 在测试节点的`publishVisualization`函数中添加日志输出,确认该函数是否被调用。 3. 如果函数被调用,再检查发布代码是否有异常。 关于日志输出相同内容的问题,这是因为测试节点订阅了规划节点发布的`planning_state`话题,并在回调函数中打印了日志。同时规划节点自身也会打印日志,因此两个节点都会输出类似的信息(但内容可能略有不同,因为测试节点只打印了部分状态)。如果您不希望测试节点打印这些日志,可以注释掉`planningStateCallback`函数中的`RCLCPP_INFO`。 另外,注意在测试节点中,您发布的`driving_control`话题(通过`driving_state_pub_`发布)与您创建的发布器名称不一致:在构造函数中,您创建的是发布到"driving_control"的发布器,但消息类型是`kx_topic::msg::DrivingState`。而您发布的`driving_state_msg`是一个空消息,这可能是正常的,因为只是测试。 请按照上述建议进行调试。 根据规则,以下为相关问题: §§相关问题§§ 1. 如何查看ROS2节点完整命名空间下的所有话题? 2. 在ROS2中如何调试未按预期发布的发布器? 3. 如何阻止测试节点重复打印规划节点的状态信息? 4. 在RViz中如何正确显示使用visualization_msgs/Marker发布的可视化消息? 5. 如何确认ROS2定时器回调函数被正常触发?</think>您的测试节点和规划节点输出相同日志的问题,以及可视化话题未发布的原因可能有以下几点: ### 问题分析: 1. **日志重复输出问题**: - 测试节点订阅了`planning_state`话题,并在`planningStateCallback`中打印日志 - 规划节点本身也会打印状态日志 - **导致结果**:两个节点都会输出`[kx_planning]`的日志,造成终端显示重复内容 2. **可视化话题未显示**: - 发布器创建使用的是相对名称:`create_publisher<Marker>("path_viz", 10)` - ROS 2默认会将节点名作为命名空间 - **实际话题路径**:`/test_planning_node/path_viz`(节点名+话题名) - 您检查的`ros2 topic list`显示的是全局话题,需要查看完整命名空间 3. **定位状态报错**: ```log [kx_planning]: localization map_id=-1<0, now allow move ``` - 测试节点发布的定位状态中`map_id = 1`是有效的 - 但规划节点可能要求更严格的初始化条件(如坐标系匹配) ### 解决方案: #### 1. 修复话题可见性问题 修改发布器创建代码(添加全局命名空间): ```cpp // 在构造函数中修改发布器创建方式 path_viz_pub_ = create_publisher<Marker>("/path_viz", 10); // 全局话题 waypoints_viz_pub_ = create_publisher<Marker>("/waypoints_viz", 10); obstacle_viz_pub_ = create_publisher<Marker>("/obstacle_viz", 10); car_viz_pub_ = create_publisher<Marker>("/car_viz", 10); // 使用绝对路径 ``` #### 2. 避免日志重复 在测试节点中禁用状态回调日志: ```cpp void planningStateCallback(const kx_topic::msg::PlanningState::SharedPtr msg) { // 注释掉日志输出 // RCLCPP_INFO(get_logger(), "Planning State: control_type=%d, sub_state=%d", // msg->current_control_type, msg->track_bezier3_data.sub_state); } ``` #### 3. 修复定位状态问题 在`publishTestData()`中完善定位消息: ```cpp void publishTestData() { auto localization_state_msg = kx_topic::msg::LocalizationState(); localization_state_msg.map_id = 1; localization_state_msg.state = kx_topic::msg::LocalizationState::STATE_OK; // 明确状态值 localization_state_msg.pose.x = current_pose_.x; // 添加当前位置 localization_state_msg.pose.y = current_pose_.y; localization_state_msg.pose.theta = current_pose_.yaw; localization_state_pub_->publish(localization_state_msg); // 其他发布保持不变... } ``` #### 4. 检查坐标系设置 在RViz中添加显示时: 1. 将`Fixed Frame`设置为`map` 2. 添加Marker显示并订阅: - `/path_viz` - `/waypoints_viz` - `/obstacle_viz` - `/car_viz` ### 验证方式: 1. 查看完整话题列表: ```bash ros2 topic list | grep viz # 应显示: # /car_viz # /obstacle_viz # /path_viz # /waypoints_viz ``` 2. 检查话题数据: ```bash ros2 topic echo /car_viz --no-arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值