Python 接口¶
用 ROS2RobotInterface 从 Python 控制机器人。
前提条件¶
已安装 ROS 2 Jazzy
机器人演示正在运行(mock、Gazebo 或真实硬件)
Python 3.12 (ROS 2 Jazzy)
安装 fa-py-libraries¶
cd ~/
git clone https://github.com/fiveages-sim/fa-py-libraries.git
cd fa-py-libraries
./init.sh all # Python 3.12 env; installs ros2_robot_interface
./init.sh all 会初始化子模块、创建环境并安装 Python 包。然后用 ./run.sh(或 ./run.sh viser)启动。
手动备选
在系统 Python 上 pip install ros2-robot-interface 不是文档主入口。若必须单独装这个包,请在 ./init.sh env 3.12 之后的 fa-py-libraries 环境内安装。
Connect, read, command¶
类名是 ROS2RobotInterface 与 ROS2RobotInterfaceConfig。README「Basic Example」(配置、connect()、get_joint_state()、left_arm_handler)在 ros2_robot_interface。
from geometry_msgs.msg import Pose
from ros2_robot_interface import (
FSM_HOLD,
ROS2RobotInterface,
ROS2RobotInterfaceConfig,
)
config = ROS2RobotInterfaceConfig(
joint_states_topic="/joint_states",
end_effector_pose_topic="/left_current_pose",
end_effector_target_topic="/left_target",
)
interface = ROS2RobotInterface(config)
interface.connect()
joint_state = interface.get_joint_state()
if joint_state:
print(joint_state["positions"])
pose = interface.left_arm_handler.get_pose()
target = Pose()
target.position.x = 0.5
target.position.z = 0.3
target.orientation.w = 1.0
interface.left_arm_handler.send_target(target)
# Stroke in hardware units (not a 0–1 percent)
interface.left_gripper_handler.send_joint_positions(0.01)
interface.send_fsm_command(FSM_HOLD)
interface.disconnect()
connect() 看到 /right_current_pose 后,双臂模式下才有 right_arm_handler / right_gripper_handler。笛卡尔 / 关节 / 夹爪话题(含 */twist、*/relative、target_percent 以及腰部 waist_*),以及 execute_*_action 与 execute_path:ros2_robot_interface(话题 / Action / Service ↔ API 对照)。
结合 Viser 可视化¶
从 fa-py-libraries 启动 Viser(./run.sh viser)。这是主入口;不要从 lerobot_ros2 启动,也不要把 pip install ros2-viser 当成产品启动方式。
cd ~/fa-py-libraries
./run.sh viser
ros2_viser 是该命令的库依赖。在自己的脚本里嵌入 ROS2ViserVisualizer 见 ros2-viser。
FSM 命令¶
/fsm_command 是 std_msgs/Int32(不是 stand / walk 这类字符串)。用 send_fsm_command 发送整数(1 HOME、2 HOLD、3 OCS2、4 MOVEJ、5 COMPLIANCE)。取值与合法转换取决于正在运行的控制器。见 状态机与话题。
WBC 的身体 / 手臂 / 底盘字符串经 send_mode_command 发到 /mode_command,与 /fsm_command 不是同一条话题。该路径需要 ocs2_wbc_controller 以及全身启动/配置——默认 mock / 分体演示并不表示它可用。
带参数的 MoveL / MoveC / MoveJ 用 execute_movel_action、execute_movec_action_* 和 execute_joint_trajectory_action 等待结果。双臂笛卡尔路径走 execute_path 服务(不是已弃用的 /target_path 话题)。
Full method list¶
方法签名、到位检查与 Action 见 API_REFERENCE.md。
故障排除¶
连接失败¶
确认机器人演示正在运行
确认 ROS 2 的 Domain ID 一致
确认话题正在发布:
ros2 topic list首条消息到来前,
get_joint_state()/get_pose()返回None;若从未调用connect(),下发方法会抛出ROS2NotConnectedError
运动指令被忽略¶
Check the controller FSM (
get_fsm_state()/ros2 topic echo /fsm_state)位姿目标需要 OCS2;关节目标需要 MOVEJ(接口可替你切换)
确认目标在关节限位范围内
导入错误¶
cd ~/fa-py-libraries
./init.sh all