Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 4 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,10 @@ jobs:
# can assume the LFS S3 cache IAM role via OIDC (moveit_pro_ci v0.5.x).
contents: read
id-token: write
uses: PickNikRobotics/moveit_pro_ci/.github/workflows/workspace_integration_test.yaml@a0e3b30c9aa8f8f82f95c91e5a34989d01caa046 # v0.9.0
# v0.9.1 adds the synthetic host NIC the integration container licenses against.
# From MoveIt Pro 9.4.2 the fingerprint needs a TPM or a permanent NIC and fails
# closed with neither, which is every runner this job lands on.
uses: PickNikRobotics/moveit_pro_ci/.github/workflows/workspace_integration_test.yaml@2eff8c8aa644ed07acaaebc9eb15af4af7169e79 # v0.9.1
with:
image_tag: ${{ needs.resolve.outputs.image_tag }}
image_ref: ${{ needs.resolve.outputs.image_ref }}
Expand Down
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ ARG USERNAME
ARG USER_UID
ARG USER_GID

# Ubuntu 24.04 images include user `ubuntu` with UID/GID 1000.
# Remove it before creating the workspace user with the host UID/GID.
RUN if id -u ubuntu > /dev/null 2>&1; then userdel -r ubuntu || true; fi

# Copy source code from the workspace's ROS 2 packages to a workspace inside the container
ARG USER_WS=/home/${USERNAME}/user_ws
ENV USER_WS=${USER_WS}
Expand Down
5 changes: 4 additions & 1 deletion src/hangar_sim/config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ hardware:
path: "config/moveit/joint_limits.yaml"
- mujoco_model: "description/hangar_scene.xml"
- mujoco_viewer: false # set to true locally to open the MuJoCo viewer window
# Set to false when use_fuse:=true so fuse is the sole odom -> ridgeback_base_link publisher.
# Publishes /odom messages for Nav2. The odom -> ridgeback_base_link TF edge is NOT
# published by MuJoCo (odom_publish_tf is false in the ros2_control xacro);
# robot_state_publisher owns the live transform to ridgeback_base_link via
# the virtual-rail joint chain, so this can stay true with fuse enabled.
# Rebuild hangar_sim after changing this value.
- publish_odom: true

Expand Down
6 changes: 5 additions & 1 deletion src/hangar_sim/config/fuse/fuse.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@ state_estimator:
base_link_output_frame_id: 'ridgeback_base_link'
odom_frame_id: 'odom'
map_frame_id: 'map'
# robot_state_publisher owns the live TF to ridgeback_base_link via the
# virtual-rail joint chain; fuse must not publish a competing parent.
# Its estimate stays available on odom_filtered. On real hardware, feed
# the estimate into the virtual-rail joint states instead of TF.
world_frame_id: 'odom'
publish_tf: true
publish_tf: false
publish_frequency: 10.0
predict_to_current_time: true
15 changes: 14 additions & 1 deletion src/hangar_sim/description/picknik_ur_mujoco_ros2_control.xacro
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,22 @@
<param name="publish_odom">${publish_odom}</param>
<param name="odom_child_frame">ridgeback_base_link</param>
<param name="odom_rate">150</param>
<param name="odom_zero_z">true</param>
<!-- Zero z/roll/pitch in /odom for this planar base. The previous tag here,
odom_zero_z, is not a recognized odom publisher parameter and was silently
ignored; odom_planar is the real one. -->
<param name="odom_planar">true</param>
<!-- robot_state_publisher owns the live TF to ridgeback_base_link via the
virtual-rail joint chain (driven by MuJoCo's own joint states), so the
odom publisher must not broadcast a competing odom -> ridgeback_base_link
edge. /odom messages keep flowing for Nav2. -->
<param name="odom_publish_tf">false</param>
<param name="odom_frame">odom</param>
<param name="publish_mj_world_tf">false</param>
<!-- Stop the lidar TF fill-in chain at the robot's base instead of walking to
the MJCF worldbody. Without this, MuJoCo broadcasts
base_platform -> ridgeback_base_link, a second parent for a frame that
robot_state_publisher already publishes. -->
<param name="base_link_name">ridgeback_base_link</param>
<param name="mujoco_viewer">${mujoco_viewer}</param>
<param name="mujoco_keyframe">default</param>
</hardware>
Expand Down
10 changes: 8 additions & 2 deletions src/hangar_sim/description/ur5e_ridgeback.xacro
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
<xacro:arg name="initial_positions_file" default="$(find picknik_ur_base_config)/config/initial_positions.yaml"/>
<xacro:arg name="mujoco_model" default="description/bar_scene.xml"/>
<xacro:arg name="mujoco_viewer" default="false" />
<!-- Set to false when use_fuse:=true so fuse is the sole odom → ridgeback_base_link publisher. -->
<!-- Publishes /odom messages for Nav2. The odom → ridgeback_base_link TF edge is never
broadcast by MuJoCo (odom_publish_tf is false in the ros2_control macro), so this can
stay true regardless of use_fuse. -->
<xacro:arg name="publish_odom" default="true"/>

<!-- Import UR and environment macros -->
Expand Down Expand Up @@ -76,7 +78,11 @@
<axis xyz="1 0 0"/>
<parent link="world" />
<child link="virtual_rail_link_1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<!-- z matches the MJCF base_platform_rotation anchor (pos 0 0 -0.048), which is tuned
so the wheels contact the floor (the sim base has no z DOF). Without this offset
the robot_state_publisher chain renders the robot 48 mm above where the physics
(and every sensor frame) actually put it. -->
<origin xyz="0 0 -0.048" rpy="0 0 0" />
<limit effort="1000.0" lower="-25.0" upper="25.0" velocity="0.175" acceleration="10.0"/>
<dynamics damping="20.0" friction="500.0" />
</joint>
Expand Down
Loading
Loading