ROS中msg::Ptr与msg::ConstPtr的区别及适用场景是什么?
关于ROS消息中Ptr和ConstPtr的差异与使用场景
你贴的是ROS消息自动生成代码里的固定类型别名,本质是对boost共享智能指针的封装,具体差异和适用场景如下:
核心差异
二者的本质区别是指向的消息对象是否允许修改:
Ptr全称为boost::shared_ptr<::nav_msgs::Odometry_<ContainerAllocator>>,是指向可修改的Odometry消息实例的共享智能指针。持有该指针时可以任意修改消息内部的header、pose、twist等所有字段内容。ConstPtr全称为boost::shared_ptr<const ::nav_msgs::Odometry_<ContainerAllocator>>,是指向只读的Odometry消息实例的共享智能指针。持有该指针时只能读取消息字段,任何修改操作都会在编译阶段直接报错。
两者均基于boost::shared_ptr实现,通过引用计数自动管理消息内存,不需要手动释放,最后一个持有指针的对象销毁时,消息内存才会自动回收。
适用场景
Ptr适用场景
- 消息发布端构造新消息时使用。你需要手动填充消息的各个字段,必须持有可写的指针:
// 构造空的可写里程计消息 nav_msgs::Odometry::Ptr odom(new nav_msgs::Odometry); // 填充字段 odom->header.stamp = ros::Time::now(); odom->pose.pose.position.x = 2.3; // 发布消息 odom_pub.publish(odom);
- 需要对已有消息做字段修改、加工处理的场景,比如对原始里程计做噪声滤波后更新消息内容。
ConstPtr适用场景
- 订阅回调函数的入参,这是ROS中最常见的用法。既可以避免误改订阅到的原始消息,又能实现零拷贝传递,不需要完整复制整个消息数据,运行效率更高:
void odomCallback(const nav_msgs::Odometry::ConstPtr& msg) { // 仅允许读取字段 ROS_INFO("里程计x坐标: %.2f", msg->pose.pose.position.x); // 尝试修改字段会直接编译报错:msg->pose.pose.position.x = 0; }
- 跨模块传递只读消息的场景,保证消息在传递链路中不会被任意模块意外修改,提升代码安全性。
内容的提问来源于stack exchange,提问作者Zhang Zheng
相关产品推荐
相关产品推荐

