Sensors
This section covers the sensor system in DexRobot MuJoCo, focusing on touch sensors and their configuration.
Sensor System Overview
The DexHand includes touch sensors at fingertips:
One touch sensor per fingertip
Based on MuJoCo’s built-in contact sensing
Configurable sensor sites
Real-time force feedback
Components
Sensor Sites
Visual and physical locations for sensors:
sensor_sites = {
"r_f_link1_4": { # Thumb tip
"pos": "0.025 0.003 0",
"size": "0.01",
"type": "sphere"
},
# Additional fingertip sites...
}
Touch Sensors
Contact force sensors at each site:
sensor_info = {
"touch_r_f_link1_4": { # Thumb sensor
"site": "site_r_f_link1_4"
},
# Additional touch sensors...
}
Implementation
Adding Sites
Sites are added using the add_sites()
function:
def add_sites(xml_file_path, site_info):
"""Add sites to specific bodies.
Args:
xml_file_path: Path to MJCF XML file
site_info: Dictionary of site configurations
"""
tree = ET.parse(xml_file_path)
root = tree.getroot()
# Add sites to specified bodies
for body_name, details in site_info.items():
body = find_body(root, body_name)
if body is not None:
add_site_to_body(body, body_name, details)
MJCF Structure
Generated site and sensor elements:
<!-- Site definition -->
<site name="site_r_f_link1_4"
pos="0.025 0.003 0"
size="0.01"
type="sphere"/>
<!-- Sensor definition -->
<sensor>
<touch name="touch_r_f_link1_4"
site="site_r_f_link1_4"/>
</sensor>
Site Parameters
Position (pos)
Specified relative to link frame
Format: “x y z”
Typical fingertip offset
Size
Sphere radius for site visualization
Also affects contact detection area
Default: 0.01 (1cm)
Type
Visual representation type
Usually “sphere” for fingertips
Other options: “box”, “cylinder”
Usage
Reading Sensor Data
Via ROS Topics:
def touch_callback(msg):
"""Handle touch sensor data.
Args:
msg (Float32MultiArray): Touch sensor values
"""
sensor_values = msg.data
# Process sensor data...
# Subscribe to touch sensor topic
rospy.Subscriber(
"touch_sensors",
Float32MultiArray,
touch_callback
)
Via MuJoCo API:
# Using MJControlWrapper
sensor_data = sim.data.sensor("touch_r_f_link1_4").data
Data Format
Each sensor returns contact force magnitude
Values ≥ 0 (no negative forces)
Units: Newtons
Update rate: Simulation timestep
Configuration
Default Setup
The default configuration adds sites and sensors to all fingertips:
# Fingertip site pattern
fingertip_names = [
f"r_f_link{i}_4" for i in range(1, 6)
]
# Generate configurations
sensor_sites = {
name: {
"pos": "0.025 0.003 0",
"size": "0.01",
"type": "sphere"
}
for name in fingertip_names
}
Custom Configuration
Add custom sensor sites:
# Custom site configuration
custom_sites = {
"link_name": {
"pos": "x y z",
"size": "radius",
"type": "shape"
}
}
# Add custom sites
add_sites(xml_path, custom_sites)
add_touch_sensors(xml_path, sensor_info)
Advanced Usage
Contact Parameters
Adjust contact properties in MJCF:
<default>
<site friction="1 0.005 0.0001"
solimp="0.9 0.95 0.001"
solref="0.02 1"/>
</default>
Filtering and Processing
Example sensor data processing:
class TouchProcessor:
def __init__(self):
self.history = []
self.threshold = 0.1
def process(self, sensor_data):
# Apply threshold
filtered = [
f if f > self.threshold else 0
for f in sensor_data
]
# Store history
self.history.append(filtered)
# Calculate features
mean_force = np.mean(filtered)
max_force = np.max(filtered)
active_sensors = sum(f > 0 for f in filtered)
return {
'mean': mean_force,
'max': max_force,
'active': active_sensors
}
Troubleshooting
Common Issues
No Sensor Readings
If not getting sensor data:
Check site placement
Verify sensor configuration
Confirm contact parameters
Check collision settings
Noisy Readings
If experiencing noisy data:
Adjust contact parameters
Implement filtering
Check collision properties
Verify site size and placement
Next Steps
After setting up sensors:
Test with Hand Model Examples
Review ROS Integration for ROS usage