如何使用 Staubli TX60/TX90/TX2-60/TX2-90 的 ROS 包

在本指南中,我们将带你逐步了解如何使用 Staubli TX60、TX90、TX2-60 和 TX2-90 的 ROS 包进行机器人应用开发。这些包提供了必要的工具和功能,用于通过机器人操作系统(ROS)与 Staubli 机器人进行交互。

注意:这些机器人的 ROS 支持非常实验性,可能无法覆盖所有功能,也不一定稳定。使用风险自负。

相关的仓库是 staubli_experimentalstaubli(后者仅用于支持包)。

目前,该仓库的主分支仅支持 ROS1 Noetic。如果你想使用 ROS2,本文不适用。

Dockerfile

首先,我们创建 Dockerfile 来搭建环境。新建一个名为 Dockerfile 的文件,内容如下:

Dockerfile
# 使用官方 ROS 1 Noetic 镜像
FROM ros:noetic

RUN apt-get update && apt-get install -y \
    git \
    python3-catkin-tools \
    python3-rosdep \
    # rosdep 键所引用的常用 ROS 工具和库
    ros-noetic-roslaunch \
    ros-noetic-catkin \
    ros-noetic-xacro \
    ros-noetic-rviz \
    ros-noetic-joint-state-publisher-gui \
    ros-noetic-moveit \
    ros-noetic-ros-control \
    ros-noetic-ros-controllers \
    ros-noetic-gazebo-ros \
    ros-noetic-gazebo-ros-control \
    && rm -rf /var/lib/apt/lists/*

# 初始化 rosdep(ROS 1)
RUN rosdep update

# 创建 catkin 工作空间
RUN mkdir -p /catkin_ws/src
WORKDIR /catkin_ws

# 将主 Staubli 仓库(包含 staubli_resources)克隆到工作空间中
RUN git clone https://github.com/ros-industrial/staubli.git src/staubli

# 克隆 staubli_experimental 仓库(ROS 1 支持包)
RUN git clone https://github.com/ros-industrial/staubli_experimental.git src/staubli_experimental

# 可选:使用 rosdep 安装依赖(某些键缺失时不会致命)
RUN rosdep install --from-paths src --ignore-src -y || echo "rosdep could not resolve some keys; proceeding because core dependencies are already installed."

# 构建工作空间(允许 staubli_rx160_moveit_plugins 失败,但继续执行)
RUN . /opt/ros/noetic/setup.sh && \
    catkin build --continue-on-failure || echo "catkin build completed with some package failures (e.g. staubli_rx160_moveit_plugins), but core support and resources built."

# source 工作空间
ENV source="/catkin_ws/devel/setup.bash"

# 将辅助脚本复制到镜像中
COPY generate_all_urdfs.sh /usr/local/bin/generate_all_urdfs.sh
RUN chmod +x /usr/local/bin/generate_all_urdfs.sh

CMD ["bash"]

此外,创建 generate_all_urdfs.sh,内容如下,用于为所有支持的机器人生成 URDF 文件:

generate_all_urdfs.sh
#!/usr/bin/env bash
set -euo pipefail

# 使用 xacro 为所有 Staubli 实验性机器人生成 URDF。
# 假定 ROS 和 catkin 工作空间已 source,例如:
#   source /opt/ros/noetic/setup.bash
#   source /catkin_ws/devel/setup.bash

out_dir="${1:-/tmp/staubli_urdfs}"
mkdir -p "${out_dir}"

echo "Writing URDFs to: ${out_dir}"

# staubli_tx60_gazebo(仅顶层 xacro,宏为内部)
xacro "$(rospack find staubli_tx60_gazebo)/urdf/tx60.xacro"  > "${out_dir}/tx60_gazebo.urdf"
xacro "$(rospack find staubli_tx60_gazebo)/urdf/tx60l.xacro" > "${out_dir}/tx60l_gazebo.urdf"

# staubli_tx60_support
xacro "$(rospack find staubli_tx60_support)/urdf/tx60.xacro"  > "${out_dir}/tx60_support.urdf"
xacro "$(rospack find staubli_tx60_support)/urdf/tx60l.xacro" > "${out_dir}/tx60l_support.urdf"

# staubli_tx2_60_support
xacro "$(rospack find staubli_tx2_60_support)/urdf/tx2_60.xacro"  > "${out_dir}/tx2_60.urdf"
xacro "$(rospack find staubli_tx2_60_support)/urdf/tx2_60l.xacro" > "${out_dir}/tx2_60l.urdf"

# staubli_tx2_90_support
xacro "$(rospack find staubli_tx2_90_support)/urdf/tx2_90.xacro"  > "${out_dir}/tx2_90.urdf"
xacro "$(rospack find staubli_tx2_90_support)/urdf/tx2_90l.xacro" > "${out_dir}/tx2_90l.urdf"
xacro "$(rospack find staubli_tx2_90_support)/urdf/tx2_90xl.xacro" > "${out_dir}/tx2_90xl.urdf"

# staubli_tx90_support
xacro "$(rospack find staubli_tx90_support)/urdf/tx90.xacro"  > "${out_dir}/tx90_support.urdf"
xacro "$(rospack find staubli_tx90_support)/urdf/tx90l.xacro" > "${out_dir}/tx90l_support.urdf"
xacro "$(rospack find staubli_tx90_support)/urdf/tx90xl.xacro" > "${out_dir}/tx90xl_support.urdf"

# staubli_rx160_gazebo
xacro "$(rospack find staubli_rx160_gazebo)/urdf/rx160.xacro"  > "${out_dir}/rx160_gazebo.urdf"
xacro "$(rospack find staubli_rx160_gazebo)/urdf/rx160l.xacro" > "${out_dir}/rx160l_gazebo.urdf"

echo "All Staubli experimental URDFs generated successfully."

在工作空间根目录(Dockerfile 所在位置)下,运行:

build_staubli_docker.sh
docker build -t staubli-noetic .

要进入 ROS1 shell:

run_staubli_shell.sh
docker run --rm -it staubli-noetic bash -lc "source /opt/ros/noetic/setup.bash && source /catkin_ws/devel/setup.bash && bash"

URDF 生成

在主机上的工作空间根目录(Dockerfile 所在位置)下,运行:

generate_all_urdfs_docker.sh
docker run --rm \
    -v "$PWD":/out \
    staubli-noetic bash -lc "\
        source /opt/ros/noetic/setup.bash && \
        source /catkin_ws/devel/setup.bash && \
        generate_all_urdfs.sh /tmp/staubli_urdfs && \
        cp /tmp/staubli_urdfs/*.urdf /out/"

该命令会为所有支持的 Staubli 机器人生成 URDF 文件,并将它们复制到主机上的当前目录。

如果你想手动为特定机器人生成 URDF,可以在容器中运行类似这样的命令(以 TX90 为例):

generate-tx60-urdf.sh
xacro $(rospack find staubli_tx60_gazebo)/urdf/tx60.xacro > /tmp/tx60_gazebo.urdf

运行 Gazebo

主机上,允许本地 X 客户端并将显示器暴露给容器(Linux):

setup-x-forwarding.sh
xhost +local:root

然后启动一个带 X 转发的容器,并运行 TX90 Gazebo 演示(正确的 launch 文件是 tx90_gazebo.launch):

gazebo-tx90.sh
docker run --rm \
    -e DISPLAY=$DISPLAY \
    -e QT_X11_NO_MITSHM=1 \
    -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
    staubli-noetic bash -lc "\
        source /opt/ros/noetic/setup.bash && \
        source /catkin_ws/devel/setup.bash && \
        roslaunch staubli_tx90_gazebo tx90_gazebo.launch"

这应该会在你的主机上打开 Gazebo 并加载 TX90 机器人。

Gazebo TX90.avif


Check out similar posts by category: Robotics, Experimental