Skip to main content
peaq_ros2_tether adds an optional ROS 2 node (peaq_tether_node) that integrates Tether WDK (EVM wallet module) so robots can:
  • Create an EVM wallet address
  • Query USDT (ERC-20) balance on peaq EVM
  • Transfer USDT on peaq EVM
This integration is address-only:
  • ROS APIs use only EVM addresses (address, from_address, to_address)
  • Wallet secrets (mnemonic) are stored locally on the robot/machine in one shared registry file
  • No private keys/mnemonics are ever sent over ROS services

Service Catalog

ServiceTypePurpose
/peaq_tether_node/wallet/createpeaq_ros2_interfaces/srv/TetherCreateWalletCreate a new EVM wallet address (mnemonic stored locally)
/peaq_tether_node/usdt/balancepeaq_ros2_interfaces/srv/TetherGetUsdtBalanceRead USDT balance for an address
/peaq_tether_node/usdt/transferpeaq_ros2_interfaces/srv/TetherTransferUsdtTransfer USDT from one local wallet address to another address
Use this index as a quick reference, then dive into the focused guides:

Launch Prerequisites

Install JS dependencies once (Node.js required where the node runs):
cd peaq_ros2_tether/js
npm ci
Start the node via ros2 run. Notes:
  • If you run multiple ROS 2 environments on the same host, isolate them with ROS_DOMAIN_ID to prevent service collisions.
  • When running from a source checkout, the node prefers a CLI path where Node can resolve node_modules/. The simplest approach is to run from the workspace root. You can also override the CLI path explicitly with PEAQ_TETHER_CLI_PATH.
export ROS_DOMAIN_ID="${ROS_DOMAIN_ID:-94}"

# Point this to your clone path
export REPO_DIR="<path to your peaq-robotics-ros2 clone>"
cd "$REPO_DIR"

export PEAQ_CFG="$REPO_DIR/peaq_ros2_examples/config/peaq_robot.yaml"

# IMPORTANT: set this explicitly. If REPO_DIR is empty, the default becomes "/peaq_ros2_tether/..."
export PEAQ_TETHER_CLI_PATH="$REPO_DIR/peaq_ros2_tether/js/peaq_tether_cli.mjs"

# Option A (recommended): tmux detach (keeps the node running after SSH disconnects)
tmux new -s tether
# inside tmux:
ros2 run peaq_ros2_tether tether_node --ros-args -p config.yaml_path:="$PEAQ_CFG"
# detach without stopping: Ctrl-b then d
#
# After detaching, the node keeps running and ROS services continue to work from any terminal
# (as long as you source your ROS environment and use the same ROS_DOMAIN_ID).

# Option B: background + disown
# ros2 run peaq_ros2_tether tether_node --ros-args -p config.yaml_path:="$PEAQ_CFG" \
#   > /tmp/tether_node.log 2>&1 & disown
Confirm the node is running and services are registered:
export ROS_DOMAIN_ID="${ROS_DOMAIN_ID:-94}"
# In a new terminal you must source ROS so `ros2` is available:
# source /opt/ros/<your_ros_distro>/setup.bash
# source <path to your peaq-robotics-ros2 clone>/install/setup.bash
ros2 node list | grep peaq_tether_node
ros2 service list | grep peaq_tether_node
Stop the node:
  • tmux option:
    • Re-attach: tmux attach -t tether
    • Stop inside tmux: Ctrl-c
    • (Or kill the session): tmux kill-session -t tether
  • background/disown option:
    • Try:
      • pkill -f "ros2 run peaq_ros2_tether tether_node" || true
      • pkill -f "peaq_ros2_tether/tether_node" || true
    • If the node was started as another user (or with sudo), you may need sudo pkill ....
    • Verify it’s gone:
      • pgrep -af "peaq_ros2_tether.*tether_node" || echo "tether node stopped"
If ros2 node list still shows stale entries right after stopping, restart the ROS CLI daemon and try again:
ros2 daemon stop || true
ros2 daemon start || true