You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:36:07