# Important part of Kibo RPC Astrobee Code
###### tags: `Kibo RPC` `java` `ROS`
## Init
```java=
Kinematics k = new DefaultKinematics();
Time t = new Time();
HashMap<Pair<Point,Quaternion>,Integer>HM=new HashMap<>(); //存放QR code拍攝點
private Point P1= new Point(11.5,-5.7,4.5);
private Quaternion Q1=new Quaternion(0,0,0,1);
private Point P2= new Point(11,-6,5.55);
private Quaternion Q2 = new Quaternion(0,-0.7071068F,0,0.7071068F);
private Point P3= new Point(11,-5.5,4.33);
private Quaternion Q3 = new Quaternion(0,0.7071068F,0,0.7071068F);
private Point P4= new Point(10.30,-7.5,4.7);
private Quaternion Q4=new Quaternion(0,0,1,0);
//private Point P5= new Point(11.5,-8,5);
private Point P5= new Point(11.3586,-8,5); //modified
private Quaternion Q5 = new Quaternion(0,0,0,1);
private Point P6= new Point(11,-7.7,5.55);
private Quaternion Q6 = new Quaternion(0,-0.7071068F,0,0.7071068F);
private QRcodeScanner qRcodeScanner = new QRcodeScanner();
private ARtag AR= new ARtag();
```
## Procedure
```java=
t.getTime(1,1);
moveToWrapper(11.50,-5.70,4.50,0,0,0,1);
t.getTime(1,2);
moveToWrapper(11.2012,-9.2729,4.959,0,0,-0.7071068,(float)0.7071068); //modified
t.getTime(17,2);
moveToWrapper(p3[0],p3[1],p3[2],p3[3],p3[4],p3[5],W);
String ID = null;
int cnti = 1;
while((ID == null || ID.length() == 0) && cnti < 30)
{
ID = AR.DetectMarker(api.getMatNavCam());
try{
Thread.sleep(500);
} catch (Exception e){
Log.d("sleep", e.getMessage());
}
if(ID != null)
break;
if((k.getPosition().getX()-p3[0])*(k.getPosition().getX()-p3[0])+(k.getPosition().getY()-p3[1])*(k.getPosition().getY()-p3[1])+(k.getPosition().getZ()-p3[2])*(k.getPosition().getZ()-p3[2])>0.07001)
moveToWrapper(p3[0],p3[1],p3[2],p3[3],p3[4],p3[5],W);
cnti++;
}
api.judgeSendDiscoveredAR(ID);
RelativemoveToWrapper(-0.0125,0.04021,0.16992,p3[3],p3[4],p3[5],W);
double tpx = k.getPosition().getX();
double tpy = k.getPosition().getY();
double tpz = k.getPosition().getZ();
float tqx = k.getOrientation().getX();
float tqy = k.getOrientation().getY();
float tqz = k.getOrientation().getZ();
float tqw = k.getOrientation().getW();
for(int i=0;i<10;i++)
{
if((k.getPosition().getX() - tpx) * (k.getPosition().getX() - tpx) + (k.getPosition().getY()-tpy) * (k.getPosition().getY()-tpy) + (k.getPosition().getZ() - tpz) * (k.getPosition().getZ() - tpz) > 0.1)
moveToWrapper(tpx,tpy,tpz,tqx,tqy,tqz,tqw);
api.laserControl(true);
try{
Thread.sleep(500);
} catch (Exception e){
Log.d("sleep", e.getMessage());
}
api.laserControl(false);
}
t.PrintTimeFromVector();
```
## MultiThreading
```java=
class multiDecode implements Runnable {
private Bitmap bm;
private int no;
public multiDecode(Bitmap temp,int idx) {
bm = temp;
no = idx;
}
private String _value = null;
public void run() {
String TAG = "getQR";
while(_value == null){
_value = QRcodeScanner.decodeQRImage(bm);
if (_value != null && _value.length() > 1) {
try{
Thread.sleep(1000); //modified sleeping time
} catch (Exception e){
Log.d(TAG, e.getMessage());
}
api.judgeSendDiscoveredQR(no, _value);
try{
Thread.sleep(1000); // modified sleeping time
} catch (Exception e){
Log.d(TAG, e.getMessage());
}
String str;
str = _value.replaceAll("[^-0-9.]", "");
double val = Double.parseDouble(str);
Log.d(TAG, "\n\nQRno="+no+"string="+_value+"val= "+val+"iterate times="+"\n\n");
p3[no] = val;
break;
}
}
}
}
```
## RelativeMoveToWrapper (Fix with thread.sleep())
```java=
public void RelativemoveToWrapper(double pos_x, double pos_y, double pos_z,
double qua_x, double qua_y, double qua_z,
float qua_w){
final Point point = new Point(pos_x, pos_y, pos_z);
final Quaternion quaternion = new Quaternion((float)qua_x, (float)qua_y,
(float)qua_z, (float)qua_w);
api.relativeMoveTo(point, quaternion, true);
try{
Thread.sleep(200);
}catch(Exception e){
Log.e("moveToWrapper",e.getMessage());
}
}
```
## Quaternion Orientation: Computing W
```java=
public float w()
{
return (float)Math.sqrt(1-p3[3]*p3[3]-p3[4]*p3[4]-p3[5]*p3[5]);
}
```
## AR Tag
```java=
public String DetectMarker(Mat m)
{
Mat ids = new Mat();
float markerLength = 0.05F;
List<Mat> corners = new ArrayList<>();
int j=-1;
Mat distCoeffs = new Mat();
Mat rvecs = new Mat();
Mat tvecs = new Mat();
Aruco.detectMarkers(m,Aruco.getPredefinedDictionary(Aruco.DICT_5X5_250),corners,ids);
String id = Arrays.toString(ids.get(0, 0));
id = id.replaceAll("[^-0-9.]", "");
if(id.indexOf(".") > 0)
{
id = id.replaceAll("0 ?$", "");//去掉多餘的0
id = id.replaceAll("[.]$", "");//如最後一位是.則去掉
}
Log.d("AR TAG IDS : ", id);
return id;
}
```
## QR code
```java=
public static String decodeQRImage(Bitmap blackWhite)
{
String TAG="decodeQRImage";
//Log.d(TAG,"Begin");
int width = blackWhite.getWidth(), height = blackWhite.getHeight();
int[] pixels = new int[width * height];
blackWhite.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
try {
com.google.zxing.Result result = reader.decode(bBitmap);
return result.getText();
} catch (NotFoundException e) {
HashMap<DecodeHintType, Object> map = new HashMap<>();
map.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
com.google.zxing.Result result = null;
try {
result = reader.decode(bBitmap, map);
} catch (NotFoundException ex) {
ex.printStackTrace();
}
Log.d(TAG,"end");
return result.getText();
}
}
```