Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
ce37e63
fix: compatibility with mujoco 3.10.0
tenfoldpaper Jun 25, 2026
152afdd
feat: add rcs_taxim
tenfoldpaper Jun 25, 2026
d10cd51
feat: working taxim demo with robotiq gripper
tenfoldpaper Jun 25, 2026
0b6380e
fix: remove misplaced tactile sensor demo
tenfoldpaper Jun 25, 2026
84890b5
WIP: implementation of StableBaselines3 PPO
tenfoldpaper Jun 25, 2026
1f3a69d
wip: add readme instruction for starting sb3
tenfoldpaper Jun 27, 2026
855c223
fix: don't flatten obs by default
tenfoldpaper Jun 27, 2026
240405c
feat: add proper spaces for training and inference with parallelizati…
tenfoldpaper Jun 27, 2026
a769104
feat: add mesh-based box
tenfoldpaper Jun 27, 2026
cbccdf1
feat: add norm2tex material piping
tenfoldpaper Jun 27, 2026
e6a0b3e
WIP: run_ablate for physics check
tenfoldpaper Jun 27, 2026
25d3772
feat: somewhat working ablation script
tenfoldpaper Jun 27, 2026
15ae623
add docker container and ppo reward
debOliveira Jun 28, 2026
132aabf
undo changes and add step to startgrasp wrapper
debOliveira Jun 29, 2026
bd560ef
remove deprecated sb3 package
tenfoldpaper Jul 8, 2026
1fab445
fix(docker): link script
juelg May 5, 2026
5771939
feat: zed cli rgb snapshot
juelg May 5, 2026
38e0000
fix(teleop): depth in cameras
juelg May 5, 2026
6a27ad9
chore(quest): simplify right/left swapping logic
juelg May 5, 2026
f76c77a
impr(robotiq): physical reset only in constructor
juelg May 5, 2026
49f5565
feat: robotiq in teleop script
juelg May 12, 2026
0671b3e
impr(gripper): improved change detection
juelg May 12, 2026
706a868
feat(zed): add option to record both eyes
juelg May 12, 2026
0144e47
feat(inference): add initial inference loop script
juelg May 8, 2026
0931f92
style: format inference franka script
juelg May 14, 2026
c736087
fix(franka): inference script after testing
juelg May 14, 2026
3f34995
feat: sim inference
juelg May 18, 2026
f3a6b73
fix: patch always open gripper observation
juelg May 18, 2026
cc9cce7
feat: reconnect and keyboard control
juelg May 19, 2026
22fa5be
feat: optionally record
juelg May 19, 2026
72d3ec8
feat: added mp4 video converter from recording
juelg May 19, 2026
9d178a8
feat(mp4): added joint display
juelg May 19, 2026
015fbbe
fix: printing and sim sleep
juelg May 19, 2026
02ef079
feat: action chunking optionally in inference script
juelg May 19, 2026
e06bf34
feat: support for relative actions
juelg May 19, 2026
e5aafd8
feat: inference add success button
juelg May 19, 2026
549f288
fix(storage wrapper): flush keeps last to avoid success problems
juelg May 19, 2026
8ff3578
fix(mp4): shows joint actions if available
juelg May 19, 2026
10cad99
fix(fr3): torque discontinuity while reset
juelg May 19, 2026
52654fe
fix(hw camera): stop camera before stop polling thread
juelg May 19, 2026
086e4d0
feat: using input instead of pynput
juelg May 19, 2026
804a823
feat: add limited absolute action wrapper
juelg May 20, 2026
9ebe4e6
feat: add limited absolute actions to inference script
juelg May 20, 2026
b59f134
stash: latest version
juelg May 21, 2026
79ce2d2
stash: add notes
juelg May 21, 2026
bd27bf9
fix: left/right wrist camera bug
juelg May 21, 2026
15d2693
fix: docker dependency
juelg May 22, 2026
ba1fd2d
fix(inference): image resize method to match conversion
juelg May 22, 2026
4790f56
docs: added documentation for assets path
juelg Jun 21, 2026
c02ace9
fix(pypi): pin compatible pinocchio runtime deps
juelg Jun 21, 2026
79626e5
fix(egl): fail fast when rendering is requested without egl
juelg Jun 21, 2026
6cf3e0f
chore: rename python package to rcs_core
juelg Jun 25, 2026
8a2bf7e
chore: remove global pynput dependency
juelg Jun 25, 2026
8150ded
bump: version 0.7.1 → 0.7.2
juelg Jun 25, 2026
c57c151
build: rename rcs to rcs-core
juelg Jun 26, 2026
c183ca8
ci: python wheel building
juelg Jun 26, 2026
2ccd738
docs: updated install instructions
juelg Jun 26, 2026
a1ee01f
docs: added libfranka version documentation
juelg Jun 26, 2026
9680c1b
build: auditwheel repair and readded libpoco
juelg Jun 27, 2026
9d886b1
build(panda): fr3 copy over
juelg Jun 27, 2026
a477ac2
build: fix rcs find path
juelg Jun 27, 2026
70464df
build: fix license and author name
juelg Jun 27, 2026
e78bed5
ci: fix wheel and cibuildwheel for pipy uploading
juelg Jun 27, 2026
61d6784
chore: cleanup unused codes and comments
juelg Jun 27, 2026
3d6eb27
docs: added inference
juelg Jun 27, 2026
39497be
style: fix format
juelg Jun 27, 2026
5b61a2e
fix: resolve ruff lint errors
juelg Jun 27, 2026
5c44b8c
fix: resolve mypy type errors
juelg Jun 27, 2026
d171c27
docs: added python headers to readme
juelg Jun 27, 2026
307d7bd
fix: resolve pytest failures and StorageWrapper hang
juelg Jun 27, 2026
5d0cbd7
style: fix gym warning and path obj in cli
juelg Jun 28, 2026
1a4270c
Merge branch 'master' into jin/taxim_cleanup
tenfoldpaper Jul 8, 2026
fb1143e
format: pyformat
tenfoldpaper Jul 8, 2026
a1e33a0
misc: bump taxim version
tenfoldpaper Jul 8, 2026
6c7ccaf
misc: update mujoco-taxim dependency
tenfoldpaper Jul 8, 2026
bc7511b
fix: correct EE orientation and trajectory for Robotiq
tenfoldpaper Jul 12, 2026
062360d
Merge pull request #317 from RobotControlStack/upgrade-mjspec
juelg Jul 12, 2026
efee3d3
fix: remove deprecated test
tenfoldpaper Jul 12, 2026
953051e
fix: correct version number
tenfoldpaper Jul 12, 2026
dbd89fe
format: pyformat
tenfoldpaper Jul 12, 2026
f0834bb
format: pyformat
tenfoldpaper Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .devcontainer/devcontainer.json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this file, looks like a local development file for dev containers.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"name": "rcs",
"build": {
"dockerfile": "../Dockerfile"
},
"remoteUser": "vscode",
"runArgs": [
"--gpus",
"all",
"--name",
"rcs",
"--ipc=host",
"--network=host",
"--env=DISPLAY=${localEnv:DISPLAY}",
"--env=XAUTHORITY=/tmp/.Xauthority",
"--volume=${localEnv:HOME}/.Xauthority:/tmp/.Xauthority:ro",
"--volume=/tmp/.X11-unix:/tmp/.X11-unix:rw"
],
"shutdownAction": "stopContainer",
"postStartCommand": "bash -lc 'grep -qxF \"source /home/vscode/venv/bin/activate\" ~/.bashrc || echo \"source /home/vscode/venv/bin/activate\" >> ~/.bashrc'",
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.defaultProfile.linux": "bash",
"python.defaultInterpreterPath": "/home/vscode/venv/bin/python"
},
"extensions": [
"charliermarsh.ruff",
"eamodio.gitlens",
"ms-python.debugpy",
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.vscode-python-envs",
"openai.chatgpt"
]
}
},
"mounts": [
"source=/mnt/disk_air_fast_2/scannetpp,target=/workspaces/datasets,type=bind"
],
}
46 changes: 46 additions & 0 deletions Dockerfile

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we already have a dockerfile under the docker folder, so can this docker file perhaps be merged with the existing one?

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Chose the base image from https://hub.docker.com/
FROM nvidia/cuda:13.1.2-cudnn-devel-ubuntu24.04

# Set variables
ARG USERNAME=vscode
ARG USER_UID=1001
ARG USER_GID=$USER_UID

# Avoid interactive dialog
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC

# Create new user
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
#
# [Optional] Add sudo support. Omit if you don't need to install software after connecting.
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME

# ********************************************************
# * Anything else you want to do like clean up goes here *
# ********************************************************

# For example, install python 3.12, git and curl
RUN apt-get install -y tzdata
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt update && apt install -y python3.11 python3.11-venv python3.11-dev curl liblz4-dev git libgl1-mesa-dev cmake build-essential
RUN apt install -y ffmpeg ca-certificates cmake curl git libgl1 libglib2.0-0 libglfw3-dev libpoco-dev ninja-build liburdfdom-dev

# [Optional] Set the default user. Omit if you want to keep the default as root.
USER $USERNAME
WORKDIR /workspaces

# Install python dependencies and renderpy
COPY . /workspaces
RUN python3.11 -m venv /home/$USERNAME/venv
RUN /home/$USERNAME/venv/bin/pip install --upgrade pip
RUN /home/$USERNAME/venv/bin/pip install --upgrade setuptools wheel ninja setuptools>=45 scikit-build-core>=0.3.3 mujoco>=3.3.5 pin==3.7.0 pybind11 cmake
RUN /home/$USERNAME/venv/bin/pip install --no-build-isolation --no-cache-dir -ve .
RUN /home/$USERNAME/venv/bin/pip install --no-build-isolation --no-cache-dir -e extensions/rcs_sb3
RUN /home/$USERNAME/venv/bin/pip install --no-build-isolation --no-cache-dir -e extensions/rcs_taxim
RUN cd norm2tex && /home/$USERNAME/venv/bin/pip install --no-build-isolation --no-cache-dir -e .
11 changes: 11 additions & 0 deletions extensions/rcs_taxim/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# RCS Taxim Extension

This extension provides integration with the [Taxim](https://github.com/Robo-Touch/Taxim) tactile sensor simulator.

It ports the tactile pick-up example onto the current RCS scene/config stack by swapping in a TAXIM-equipped Franka hand while reusing the current FR3 pick setup.

## Installation

```shell
pip install -ve extensions/rcs_taxim
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far we only have examples in the global examples folder, so to be consistent this file should go into examples/taxim/grasp_digit_demo.py

Original file line number Diff line number Diff line change
Expand Up @@ -7,70 +7,75 @@
from rcs._core.common import Pose
from rcs._core.sim import SimRobot
from rcs.envs.base import GripperWrapper
from rcs_tacto.creators import FR3TactoSimplePickUpSimEnvCreator
from tqdm import tqdm

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


def _progress(iterable):
try:
from tqdm import tqdm
except ImportError:
return iterable
return tqdm(iterable)


class PickUpDemo:
def __init__(self, env: gym.Env):
self.env = env
self._robot = cast(SimRobot, self.env.get_wrapper_attr("robot"))
self._robot = cast(SimRobot, self.env.get_wrapper_attr("robot")["robot"])
self.home_pose = self._robot.get_cartesian_position()

def _action(self, pose: Pose, gripper: list[float]) -> dict[str, Any]:
return {"xyzrpy": pose.xyzrpy(), "gripper": gripper}
return {"robot": {"xyzrpy": pose.xyzrpy(), "gripper": gripper}}

def get_object_pose(self, geom_name) -> Pose:
def get_object_pose(self, geom_name: str) -> Pose:
model = self.env.get_wrapper_attr("sim").model
data = self.env.get_wrapper_attr("sim").data

geom_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, geom_name)
obj_pose_world_coordinates = Pose(
translation=data.geom_xpos[geom_id], rotation=data.geom_xmat[geom_id].reshape(3, 3)
)
) * Pose(rpy_vector=np.array([0, 0, -np.pi / 4]), translation=np.array([0.0, 0.0, 0.0]))
return self._robot.to_pose_in_robot_coordinates(obj_pose_world_coordinates)

def generate_waypoints(self, start_pose: Pose, end_pose: Pose, num_waypoints: int) -> list[Pose]:
waypoints = []
for i in range(num_waypoints + 1):
t = i / (num_waypoints)
waypoints.append(start_pose.interpolate(end_pose, t))
return waypoints
return [start_pose.interpolate(end_pose, i / num_waypoints) for i in range(num_waypoints + 1)]

def step(self, action: dict) -> dict:
def step(self, action: dict[str, Any]) -> dict[str, Any]:
return self.env.step(action)[0]

def plan_linear_motion(self, geom_name: str, delta_up: float, num_waypoints: int = 200) -> list[Pose]:
def plan_linear_motion(self, geom_name: str, delta_up: float, num_waypoints: int = 20) -> list[Pose]:
end_eff_pose = self._robot.get_cartesian_position()
goal_pose = self.get_object_pose(geom_name=geom_name)
goal_pose *= Pose(translation=np.array([0, 0, delta_up]), quaternion=np.array([1, 0, 0, 0])) # type: ignore
goal_pose *= Pose(translation=np.array([0, 0, delta_up]), quaternion=np.array([1, 0, 0, 0]))
return self.generate_waypoints(end_eff_pose, goal_pose, num_waypoints=num_waypoints)

def execute_motion(self, waypoints: list[Pose], gripper: list[float] = GripperWrapper.BINARY_GRIPPER_OPEN) -> dict:
for i in range(len(waypoints)):
obs = self.step(self._action(waypoints[i], gripper))
def execute_motion(
self, waypoints: list[Pose], gripper: list[float] = GripperWrapper.BINARY_GRIPPER_OPEN
) -> dict[str, Any]:
obs: dict[str, Any] = {}
for waypoint in waypoints:
obs = self.step(self._action(waypoint, gripper))
return obs

def approach(self, geom_name: str):
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=5)
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=60)
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN)

def grasp(self, geom_name: str):

waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=-0.01, num_waypoints=15)
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.09, num_waypoints=60)
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN)

self.step(self._action(Pose(), GripperWrapper.BINARY_GRIPPER_CLOSED))
for _ in range(4):
self.step(self._action(self._robot.get_cartesian_position(), GripperWrapper.BINARY_GRIPPER_CLOSED))

waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=15)
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=60)
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED)

def move_home(self):
end_eff_pose = self._robot.get_cartesian_position()
waypoints = self.generate_waypoints(end_eff_pose, self.home_pose, num_waypoints=10)
waypoints = self.generate_waypoints(end_eff_pose, self.home_pose, num_waypoints=60)
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED)

def pickup(self, geom_name: str):
Expand All @@ -80,17 +85,19 @@ def pickup(self, geom_name: str):


def main():
env_fact = FR3TactoSimplePickUpSimEnvCreator()
env = env_fact(
render_mode="human",
delta_actions=False,
)

for _ in tqdm(range(100)):
# reset the environment
try:
from rcs_taxim.creators import FR3TaximSimplePickUpSimEnvCreator
except ImportError as exc:
msg = "This example requires the rcs_taxim extension, install it with `pip install -e extensions/rcs_taxim`."
raise ImportError(msg) from exc

env_fact = FR3TaximSimplePickUpSimEnvCreator()
env = env_fact(render_mode="human", delta_actions=False)

for _ in _progress(range(100)):
env.reset()
controller = PickUpDemo(env)
controller.pickup("yellow_box_geom")
controller.pickup("_box_geom")
env.close()


Expand Down
27 changes: 27 additions & 0 deletions extensions/rcs_taxim/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "rcs_taxim"
version = "0.7.2"
description = "RCS integration of mujoco-taxim"
dependencies = [
"rcs>=0.7.2",
"omegaconf",
"mujoco-taxim@git+https://github.com/utn-air/mujoco-taxim.git@norm2tex",
]
readme = "README.md"
maintainers = [
{ name = "Tobias Jülg", email = "tobias.juelg@utn.de" },
{ name = "Seongjin Bien", email = "seongjin.bien@utn.de" },
]
authors = [{ name = "Seongjin Bien", email = "seongjin.bien@utn.de" }]
requires-python = ">=3.10"

[tool.black]
line-length = 120
target-version = ["py310"]

[tool.isort]
profile = "black"
1 change: 1 addition & 0 deletions extensions/rcs_taxim/src/rcs_taxim/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__version__ = "0.7.2"
Loading
Loading