欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

安装和使用 ROS2 通信中间件

最编程 2024-03-08 20:37:39
...

import com.alibaba.fastjson.JSON;

import edu.wpi.rail.jrosbridge.Ros;

import edu.wpi.rail.jrosbridge.Topic;

import edu.wpi.rail.jrosbridge.handler.RosHandler;

import edu.wpi.rail.jrosbridge.messages.Message;

import lombok.extern.slf4j.Slf4j;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.web.bind.annotation.RestController;

import team.iOceanPlus.PB.Target.PBTarget;

import team.iOceanPlus.PB.Target.PBTarget.Builder;

 

import javax.annotation.PostConstruct;

import javax.websocket.Session;

import java.util.HashMap;

import java.util.Map;

 

@Slf4j

@ Component

public class RosSubscribe implements RosHandler {

    //properties配置文件配置

 

    //ros服务器ip

//    @Value("${ros.ip}")

    private String ip = "192.168.136.138";

 

    //指定订阅的话题名称/类型

//    @Value("${ros.topic.gnss.name}")

    private String topicName = "our_topic";

//    @Value("${ros.topic.gnss.type}")

    private String msgType = "std_msgs/String";

 

    Ros ros = null;

    boolean connect = false;

    /**

     * ros服务器故障断开每隔五秒重连

     */

    @Scheduled(cron = "*/5 * * * * ?")

    void reconnect() {

        if (!connect) {

            log.error("未连接服务!正在重连ros服务器!");

            init();

        }

    }

 

    @PostConstruct

    void init() {

        try {

            ros = new Ros(ip);

            connect = ros.connect();

            if (connect) {

                Topic topic = new Topic(ros, topicName, msgType);

                Map<String,Object> msg = new HashMap<>();

                msg.put("data","测试  publish");

                Message message1 = new Message(JSON.toJSONString(msg), "std_msgs/String");

                topic.publish(message1);

                //开始订阅话题

                topic.subscribe(message -> {

                    try {

                        Map maps = (Map) JSON.parse(message.toString());   //message即该话题的广播消息

                        System.out.println(maps);

 

                    } catch (Exception e) {

                        log.error(e.toString());

                    }

                });

 

                ros.addRosHandler(this);    //监听器监听ros连接状态

            }

 

        } catch (Exception e) {

            log.error("ros服务器连接错误:" + e.toString());

            connect = false;

        }

    }

 

    @Override

    public void handleConnection(Session session) {

        log.info("ros已连接:" + session.getId());

    }

 

    @Override

    public void handleDisconnection(Session session) {

        log.error("断开ros连接:" + session.getId());

        connect = false;

    }

 

    @Override

    public void handleError(Session session, Throwable t) {

        log.error("ros连接失败:" + session.getId() + "-----失败原因:" + t.toString());

        connect = false;

    }

 

}