Skip to content

Commit 9050fe2

Browse files
committed
Merge branch 'main' of git@github.com:CommonWealthRobotics/mujoco-java.git into kh/update-to-3.x.x
2 parents 6b8f706 + e448589 commit 9050fe2

11 files changed

Lines changed: 258 additions & 63 deletions

File tree

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77

88
jobs:
99
linux:
10-
runs-on: ubuntu-latest
10+
runs-on: ubuntu-20.04
1111
steps:
1212
- name: Checkout
1313
uses: actions/checkout@v1

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ build
1313
*.class*
1414
*jni*.cpp
1515
bin
16-
src/main/resources/*
16+
src/main/resources/linux*
17+
src/main/resources/windows*
18+
src/main/resources/macosx-x*
19+
src/main/java/mujoco/*.h
20+
21+
*.DS_Store*
1722
cppbuild
1823
*hs_err_*.log

README.md

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
11
# mujoco-java
2-
Java JNI binding for mujoco physics system
2+
3+
Java JNI binding for [mujoco physics system](https://github.com/google-deepmind/mujoco)
4+
5+
# Platforms
6+
7+
This library supports
8+
9+
* Windows x86_64
10+
* Linux x86_64
11+
* MacOS x86_64
12+
* MacOS arm64 (M1, M2, M3)
13+
14+
# Examples
15+
16+
An example of loading a MuJoCo model and display in JavaFX 3d:
17+
18+
https://github.com/madhephaestus/MuJoCoTest/releases
19+
20+
Examples are designed to run in [Bowler Studio](http://commonwealthrobotics.com)
321

422
# Maven
523

624
MuJoCo-Java is published on Maven Central via Sonatype.
725

8-
![](https://img.shields.io/nexus/r/https/oss.sonatype.org/com.neuronrobotics/mujoco-java.svg?style=flat)
9-
1026
Hosting is in:
1127

1228
```
@@ -19,7 +35,7 @@ Maven:
1935
<dependency>
2036
<groupId>com.neuronrobotics</groupId>
2137
<artifactId>mujoco-java</artifactId>
22-
<version>VERSION_FROM_BADGE</version>
38+
<version>2.2.0-pre.11</version>
2339
<type>module</type>
2440
</dependency>
2541
```
@@ -31,7 +47,7 @@ repositories {
3147
}
3248
3349
dependencies {
34-
implementation group: 'com.neuronrobotics', name: 'mujoco-java', version: 'VERSION_FROM_BADGE'
50+
implementation group: 'com.neuronrobotics', name: 'mujoco-java', version: '2.2.0-pre.11'
3551
}
3652
```
3753

@@ -43,7 +59,7 @@ installing VC++ redist from:
4359
https://www.microsoft.com/en-gb/download/details.aspx?id=48145
4460
```
4561

46-
# HOWTO set up build
62+
# HOWTO set up Publish
4763

4864
1. Export your gpg private key from the system that you have created it.
4965
1. Find your key-id (using `gpg --list-secret-keys --keyid-format=long`)

build-linux.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ ls $BUILDDIR/
4242
cd $JAVADIR
4343

4444
echo "JavaCPP configs:"
45-
java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -Dcompiler.includepath=$BUILDDIR/include/ -print properties.includepath
45+
$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -Dcompiler.includepath=$BUILDDIR/include/ -print properties.includepath
4646

47-
java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar org/mujoco/MuJoCoConfig.java
48-
java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -copylibs -copyresources -Xcompiler "-I$JAVADIR" -Xcompiler "-L$JAVADIR" org/mujoco/MuJoCoLib.java
47+
$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar org/mujoco/MuJoCoConfig.java
48+
echo "Start compile \n\n"
49+
$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -copylibs -copyresources -Xcompiler "-no-pie" -Xcompiler "-I$JAVADIR" -Xcompiler "-L$JAVADIR" org/mujoco/MuJoCoLib.java
4950
LIBPATH=$PWD/../resources/$TYPE/
5051
mkdir -p $SCRIPT_DIR/src/main/resources/
5152

build-mac-m1.sh

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#!/bin/bash
2+
bash --version
3+
g++ --version
4+
echo "Mac M1 Build"
5+
VER=$(cat mujocoRelease.txt)
6+
7+
TYPE=macosx-arm64
8+
ARCHIVE=mujoco-$VER-macos-universal2.dmg
9+
URL=https://github.com/deepmind/mujoco/releases/download/$VER/$ARCHIVE
10+
echo "$URL"
11+
SCRIPT_DIR=$( pwd )
12+
BUILDDIR=/tmp/
13+
set -e
14+
15+
mkdir -p $BUILDDIR
16+
if [ -f "$BUILDDIR$ARCHIVE" ]; then
17+
echo "$BUILDDIR$ARCHIVE exists."
18+
else
19+
rm -rf $BUILDDIR/mujoco*
20+
curl -L --location-trusted https://github.com/deepmind/mujoco/releases/download/$VER/$ARCHIVE -o $BUILDDIR/$ARCHIVE
21+
cd $BUILDDIR
22+
mkdir mujoco
23+
cd mujoco
24+
hdiutil attach ../$ARCHIVE
25+
find /Volumes/MuJoCo/ -name '*.dylib'
26+
mkdir $BUILDDIR/mujoco/include
27+
cp -R /Volumes/MuJoCo/mujoco.framework/Headers/ $BUILDDIR/mujoco/include/mujoco
28+
mkdir $BUILDDIR/mujoco/lib/
29+
cp /Volumes/MuJoCo/mujoco.framework/Versions/A/libmujoco.$VER.dylib $BUILDDIR/mujoco/lib/libmujoco.dylib
30+
31+
echo $BUILDDIR/mujoco/
32+
ls -al $BUILDDIR/mujoco/
33+
cd /tmp
34+
echo /tmp
35+
ls -al
36+
cd $SCRIPT_DIR/
37+
fi
38+
echo "Include"
39+
ls $BUILDDIR/mujoco/include/
40+
ls $BUILDDIR/mujoco/include/mujoco/
41+
echo "Lib"
42+
ls $BUILDDIR/mujoco/lib/
43+
44+
45+
JAVACPP_VER=1.5.7
46+
JAVACPPDIR=javacpp-platform-$JAVACPP_VER-bin
47+
JAVACPP=$JAVACPPDIR.zip
48+
if [ -f "$JAVACPP" ]; then
49+
echo "$JAVACPP exists."
50+
else
51+
curl -L --location-trusted https://github.com/bytedeco/javacpp/releases/download/$JAVACPP_VER/$JAVACPP -o $JAVACPP
52+
unzip $JAVACPP
53+
echo "JavaCPP:"
54+
ls -al $JAVACPPDIR
55+
cd $SCRIPT_DIR/
56+
57+
fi
58+
JAVADIR=$SCRIPT_DIR/src/main/java/
59+
cd $SCRIPT_DIR/src/main/java/
60+
cp $BUILDDIR/mujoco/lib/* $JAVADIR/
61+
echo "Moving headers "
62+
rm -rf $JAVADIR/mujoco/
63+
cp -r $BUILDDIR/mujoco/include/mujoco $JAVADIR/
64+
java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar org/mujoco/MuJoCoConfig.java
65+
java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -copylibs -copyresources -Xcompiler "-I$JAVADIR" -Xcompiler "-L$JAVADIR" org/mujoco/MuJoCoLib.java
66+
67+
LIBPATH=$PWD/../resources/$TYPE/
68+
mkdir -p $SCRIPT_DIR/src/main/resources/
69+
rm -rf $JAVADIR../resources/$TYPE
70+
find $SCRIPT_DIR|grep $TYPE
71+
mv $JAVADIR/org/mujoco/$TYPE/ $JAVADIR../resources/
72+
cp $BUILDDIR/mujoco/lib/* $JAVADIR../resources/$TYPE/
73+
74+
echo "ls -al $JAVADIR../resources/"
75+
ls -al $JAVADIR../resources/
76+
77+
cd $SCRIPT_DIR/
78+
echo "Resource Files: "
79+
ls -al $JAVADIR../resources/*
80+
ls -al $JAVADIR../resources/$TYPE
81+
./gradlew jar --stacktrace test
82+
83+

src/main/java/libmujoco.dylib

4.29 MB
Binary file not shown.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.mujoco;
2+
3+
import org.mujoco.MuJoCoLib.mjData_;
4+
import org.mujoco.MuJoCoLib.mjModel_;
5+
6+
public interface IMujocoController {
7+
public void controlStep(mjData_ data,mjModel_ model);
8+
}

src/main/java/org/mujoco/MuJoCoModelManager.java

Lines changed: 91 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,29 @@
77
import java.net.URL;
88

99
import org.bytedeco.javacpp.BytePointer;
10+
import org.bytedeco.javacpp.IntPointer;
1011
import org.mujoco.MuJoCoLib.mjData;
1112
import org.mujoco.MuJoCoLib.mjData_;
1213
import org.mujoco.MuJoCoLib.mjModel;
1314
import org.mujoco.MuJoCoLib.mjModel_;
15+
import org.mujoco.MuJoCoLib.mjOption_;
1416
import org.mujoco.MuJoCoLib.mjVFS;
1517

1618
public class MuJoCoModelManager {
1719
MuJoCoLib lib = new MuJoCoLib();
1820

1921
private mjModel m;
2022
private mjData d;
21-
private mjModel_ maccessable;
22-
private mjData_ daccessable;
23+
private mjModel_ model;
24+
private mjData_ data;
25+
private mjOption_ opt;
26+
private IMujocoController controller = null;
2327

28+
private BytePointer modelNames;
29+
30+
private IntPointer jointNameIndexes;
31+
32+
private IntPointer bodyNameIndex;
2433
public MuJoCoModelManager(File config){
2534
loadFromFile(config);
2635
}
@@ -44,8 +53,46 @@ private void loadFromFile(File config) {
4453
d = MuJoCoLib.mj_makeData(m);
4554
setModel(new mjModel_(m));
4655
setData(new mjData_(d));
56+
setOpt(new mjOption_(getModel().opt()));
57+
setModelNames(model.names());
58+
jointNameIndexes = model.name_jntadr();
59+
bodyNameIndex = model.name_bodyadr();
60+
}
61+
public double getCurrentSimulationTimeSeconds() {
62+
return data.time();
63+
}
64+
public int getNumberOfJoints() {
65+
return model.njnt();
66+
}
67+
public String getJointName(int i) {
68+
if(i<0)
69+
throw new IndexOutOfBoundsException("Joint index must be positive or zero");
70+
if(i>=getNumberOfJoints()) {
71+
throw new IndexOutOfBoundsException("Joint index must be less than "+i);
72+
}
73+
BytePointer byp = modelNames.getPointer(jointNameIndexes.getPointer(i).get());
74+
return byp.getString();
75+
}
76+
public int getNumberOfBodys() {
77+
return model.nbody();
78+
}
79+
public String getBodyName(int i) {
80+
if(i<0)
81+
throw new IndexOutOfBoundsException("Body index must be positive or zero");
82+
if(i>=getNumberOfBodys()) {
83+
throw new IndexOutOfBoundsException("Body index must be less than "+i);
84+
}
85+
BytePointer byp = modelNames.getPointer(bodyNameIndex.getPointer(i).get());
86+
return byp.getString();
4787
}
4888

89+
90+
public double getTimestepSeconds() {
91+
return getOpt().timestep();
92+
}
93+
public long getTimestepMilliSeconds() {
94+
return (long)(getTimestepSeconds()*1000);
95+
}
4996
public void close() {
5097
MuJoCoLib.mj_deleteData(d);
5198
MuJoCoLib.mj_deleteModel(m);
@@ -55,31 +102,33 @@ public void close() {
55102
* @return the maccessable
56103
*/
57104
public mjModel_ getModel() {
58-
return maccessable;
105+
return model;
59106
}
60107

61108
/**
62109
* @param maccessable the maccessable to set
63110
*/
64111
private void setModel(mjModel_ maccessable) {
65-
this.maccessable = maccessable;
112+
this.model = maccessable;
66113
}
67114

68115
/**
69116
* @return the daccessable
70117
*/
71118
public mjData_ getData() {
72-
return daccessable;
119+
return data;
73120
}
74121

75122
/**
76123
* @param daccessable the daccessable to set
77124
*/
78125
public void setData(mjData_ daccessable) {
79-
this.daccessable = daccessable;
126+
this.data = daccessable;
80127
}
81128
public void step() {
82129
stepOne();
130+
if(controller!=null)
131+
controller.controlStep(data, model);
83132
stepTwo();
84133
}
85134
public void stepOne() {
@@ -88,4 +137,40 @@ public void stepOne() {
88137
public void stepTwo() {
89138
MuJoCoLib.mj_step2(m, d);
90139
}
140+
/**
141+
* @return the opt
142+
*/
143+
public mjOption_ getOpt() {
144+
return opt;
145+
}
146+
/**
147+
* @param opt the opt to set
148+
*/
149+
public void setOpt(mjOption_ opt) {
150+
this.opt = opt;
151+
}
152+
/**
153+
* @return the controller
154+
*/
155+
public IMujocoController getController() {
156+
return controller;
157+
}
158+
/**
159+
* @param controller the controller to set
160+
*/
161+
public void setController(IMujocoController controller) {
162+
this.controller = controller;
163+
}
164+
/**
165+
* @return the modelNames
166+
*/
167+
public BytePointer getModelNames() {
168+
return modelNames;
169+
}
170+
/**
171+
* @param modelNames the modelNames to set
172+
*/
173+
public void setModelNames(BytePointer modelNames) {
174+
this.modelNames = modelNames;
175+
}
91176
}
1.26 MB
Binary file not shown.
4.29 MB
Binary file not shown.

0 commit comments

Comments
 (0)