Part I: The ROS 2 stack · §14 of 43

# Controllers & hardware
ros2 param get /left_joint_trajectory_controller interpolation_method   # must be 'splines' on zeus (§4)
ros2 control list_controllers
ros2 control list_hardware_components
ros2 control list_hardware_interfaces
ros2 control set_controller_state left_joint_trajectory_controller inactive|active
ros2 control view_controller_chains
 
# Interfaces
ros2 action list -t
ros2 topic list -t
ros2 action info -t /left_joint_trajectory_controller/follow_joint_trajectory
 
# State
ros2 topic echo /joint_states --field position
ros2 topic hz /joint_states
ros2 topic echo /left_joint_trajectory_controller/controller_state
ros2 topic echo /controller_manager/statistics/full
 
# Model
ros2 param get /robot_state_publisher robot_description > /tmp/openarm.urdf
check_urdf /tmp/openarm.urdf                     # from liburdfdom-tools
ros2 run tf2_tools view_frames                    # frames.pdf
 
# Spawner by hand (with timeouts so it doesn't hang)
ros2 run controller_manager spawner joint_state_broadcaster -c /controller_manager --controller-manager-timeout 30
 
# CAN (host or container with --network host)
ip -details -statistics link show can0
candump -td can0
openarm-can-cli -i can0 monitor
openarm-can-cli -i can0 diagnose
 
# Logs
ls ~/.ros/log/                                    # per-launch logs (every node's messages, also after a crash)
ros2 launch … 2>&1 | tee -i ~/launch.log          # -i: tee ignores Ctrl+C, so the shutdown stays visible
 
# zeus scripts (in the container; = Prandium/robot_scripts on the laptop)
bash /root/scripts/openarm_launch.sh real|sim
python3 /root/scripts/openarm_jmove.py left 7 0.1  # identification wiggle after every real launch
python3 /root/scripts/openarm_jsweep.py left|right|both
python3 /root/scripts/openarm_demo.py 1.5
bash /root/scripts/openarm_stop.sh                 # real robot: instead of Ctrl+C
git -C /root/ros2_ws/src/openarm_ros2 diff --stat  # the 3 local changes (splines + 2 patches)