在Android 中使用Rosjava和RosAndroid

435 阅读1分钟

rosjava和rosAndroid的构建环境

implementation "org.ros.rosjava_core:rosjava:[0.2,0.3)"
implementation 'org.ros.rosjava_messages:std_msgs:0.5.11'

rosJava的使用

1.创建一个发送消息的topic:

public class MessageBasePub extends AbstractNodeMain {
    private volatile static MessageBasePub INSTANCE = null;

    public static MessageBasePub getInstance() {
        if (INSTANCE == null) {
            synchronized (MessageBasePub.class) {
                if (INSTANCE == null) {
                    INSTANCE = new MessageBasePub();
                }
            }
        }
        return INSTANCE;
    }

    private ConnectedNode connectedNode;

    private Publisher<std_msgs.String> publisher;

    @Override
    public GraphName getDefaultNodeName() {
        return GraphName.of("rosandroid");
    }

    @Override
    public void onStart(final ConnectedNode connectedNode) {
        this.connectedNode = connectedNode;
        publisher = connectedNode.newPublisher("/message", String._TYPE);  //message 为给后台发送数据的topic
    }

    //发送message  //ros的数据类型和java的数据类型不同
    public void pubMessage(java.lang.String message) {
        connectedNode.getTopicMessageFactory().newFromType();
        std_msgs.String mess=publisher.newMessage();
        mess.setData(message);
        publisher.publish(mess);
    }

}

创建一个接收消息的topic:

public class MessageSub extends AbstractNodeMain {


    private volatile static MessageSub INSTANCE = null;

    public static MessageSub getInstance() {
        if (INSTANCE == null) {
            synchronized (MessageSub.class) {
                if (INSTANCE == null) {
                    INSTANCE = new MessageSub();
                }
            }
        }
        return INSTANCE;
    }


    private String topicName;

    private String robotCode;

    @Override
    public GraphName getDefaultNodeName() {
        return GraphName.of("/android");
    }

    @Override
    public void onStart(ConnectedNode connectedNode) {
        //receiveMessage 接收消息的topic
        Subscriber<PointCloud2> subscriber = connectedNode.newSubscriber("/receiveMessage", String._TYPE); 
        subscriber.addMessageListener(this::handleResult);
    }

    private void handleResult(std_msgs.String  message) {
        Log.d("TAG",message.getData() );
    }
}

绑定topic:

public class RosManager {

    private volatile static RosManager INSTANCE = null;
    public static RosManager getInstance() {
        if (INSTANCE == null) {
            synchronized (RosManager.class) {
                if (INSTANCE == null) {
                    INSTANCE = new RosManager();
                }
            }
        }
        return INSTANCE;
    }
    
    public static void destroyInstance() {
        INSTANCE = null;
    }

    private Node node;

    /**
     * 初始化ros
     */
    public void init() {
        NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(LOACL_IP);  //本地IP
        nodeConfiguration.setNodeName("rosAndroid");
        nodeConfiguration.setMasterUri(URI.create("http://" +ip + ":ipcode/"));
        DefaultScheduledExecutorService defaultScheduledExecutorService = new DefaultScheduledExecutorService();
        node = new DefaultNodeFactory(defaultScheduledExecutorService).newNode(nodeConfiguration, initRosNodeListeners());
    }

    /**
     * 初始化所有的RosNodeListener
     * 将新的topic放进nodeListenerList里面
     */
    private List<NodeListener> initRosNodeListeners() {
        List<NodeListener> nodeListenerList = new ArrayList<>();
        nodeListenerList.add(MessageBasePub.getInstance());
        nodeListenerList.add(MessageSub.getInstance());
        return nodeListenerList;
    }
    
}

使用

//初始化
RosManager.getInstance();

//发送消息
std_msgs.String str = null;
str.setData("hello");
MessageBasePub.getInstance().pubMessage(str);

2.rosAndroid的使用

只需要你的activity继承rosActivity

public class TestActivity extends RosActivity {

    private  NodeConfiguration nodeConfiguration;

    protected TestActivity() {
        super("ros", "ros", URI.create("http://"+ ip+":ipCode/")); //服务端ip
    }

    @Override
    protected void init(NodeMainExecutor nodeMainExecutor) {
        nodeConfiguration = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress(), getMasterUri());
        nodeConfiguration.setNodeName("android");
    }

    public void openRos(){ //连接ros
        nodeMainExecutorService.execute(MessageBasePub.getInstance(), nodeConfiguration);
    }

    public void closeRos(){ //断开ros
        nodeMainExecutorService.shutdownNodeMain(MessageBasePub.getInstance());
    }

}

需要接收数据的话就把MessageBasePub换成MessageSub。