ros同时接收与发送
时间: 2025-06-01 08:29:06 浏览: 12
### 使用 C++ 实现 ROS 中同时接收和发送消息
为了实现 ROS 节点能够同时执行消息的接收与发送操作,通常会采用多线程编程技术。下面提供了一个简单的示例程序说明如何利用 `ros::AsyncSpinner` 进行异步回调处理[^1]。
#### 定义节点类结构
首先定义一个名为 `MessageHandler` 的类来封装所有的逻辑:
```cpp
class MessageHandler {
public:
MessageHandler(ros::NodeHandle& n);
private:
void messageCallback(const std::shared_ptr<std_msgs::String const>& msg);
void publishMessage();
ros::NodeHandle nh_;
ros::Subscriber sub_;
ros::Publisher pub_;
};
```
#### 初始化订阅者和发布者
在构造函数内部初始化订阅者和发布者对象,并指定要监听的主题名称以及待发布的主题名称:
```cpp
MessageHandler::MessageHandler(ros::NodeHandle &n):nh_(n){
// 订阅来自 /chatter 主题的标准字符串消息
sub_ = nh_.subscribe("/chatter", 1, &MessageHandler::messageCallback,this);
// 发布到自定义主题 /echo 上去的消息同样也是标准字符串类型
pub_ = nh_.advertise<std_msgs::String>("/echo", 1);
}
```
#### 处理接收到的信息
当有新的数据通过 `/chatter` 到达时触发此方法,在这里可以对接收到的内容做任何必要的处理工作之后再转发出去:
```cpp
void MessageHandler::messageCallback(const std::shared_ptr<std_msgs::String const>& msg){
ROS_INFO("Received: [%s]",msg->data.c_str());
// 修改原始内容后重新打包成一个新的消息体准备发出
auto new_msg = boost::make_shared<std_msgs::String>();
new_msg->data = "Echoed:" + msg->data;
// 将修改后的版本广播至其他可能感兴趣的组件那里
pub_.publish(new_msg);
}
```
#### 设置异步调用处理器
为了让上述代码能够在后台持续运行而不阻塞主线程的工作流程,还需要配置好相应的事件循环机制:
```cpp
int main(int argc, char **argv){
ros::init(argc, argv, "talker_listener");
ros::NodeHandle nh;
MessageHandler handler(nh);
// 开启两个线程用于处理所有已注册的服务端口上的活动
ros::AsyncSpinner spinner(2);
spinner.start();
// 阻塞直到用户手动终止应用程序为止
ros::waitForShutdown();
return 0;
}
```
这段代码展示了怎样在一个单独的应用进程中既充当生产方又作为消费方参与到不同话题之间的交互当中去了。值得注意的是,实际应用中应当根据具体需求调整队列长度以及其他性能参数以获得最佳效果[^2]。
阅读全文
相关推荐


















