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。