外设控制

1. 灵巧手

1.1 节点说明

节点

职责

hand_manager

ti5_hand

灵巧手通信与命令处理

配置文件:ti5_hand/config/hand_config.yaml(常用项:port_namebaud_ratehand_idmaster_idhand_namecomm_typevendor

1.2 话题定义

  • 订阅:ti5/hand_commandti5_hand/msg/HandCmd

  • 发布:ti5/hand_statusti5_hand/msg/HandState

  • 可选输入:ti5/hand_finger_pos

HandCmd / HandState 关键字段:

  • HandCmd.name:手名称(需与配置中的 hand_name 一致)

  • HandCmd.fingers[]:每个元素为 FingerPos(finger_id, angle)

  • FingerPos.finger_id:手指编号(0-5)

    • 0:大拇指上段(THUMB_UPPER)

    • 1:食指(INDEX)

    • 2:中指(MIDDLE)

    • 3:无名指(RING)

    • 4:小拇指(PINKY)

    • 5:大拇指下段(THUMB_LOWER)

  • FingerPos.angle:手指目标角度(单位:度 deg);协议侧 90deg 对应内部位置 65535

  • HandStatehand_nameis_connectedfingers[]

补充:HandCmd.fingers[] 可只填需调整的手指;未出现的指按默认 0deghand_command 速度由服务端固定(内部 speed=255),消息中无速度字段。

1.3 服务接口

  • /ti5/hand_actionti5_hand/srv/HandAction

动作常量:

  • ACTION_STRAIGHT = 0

  • ACTION_VICTORY = 1

  • ACTION_OK = 2

  • ACTION_HEART = 3

请求字段:hand_nameaction_id

1.4 示例程序

服务与话题:

ros2 service call /ti5/hand_action ti5_hand/srv/HandAction "{hand_name: 'left', action_id: 0}"
ros2 topic pub --once ti5/hand_command ti5_hand/msg/HandCmd "{name: 'left', fingers: [{finger_id: 1, angle: 30.0}, {finger_id: 2, angle: 45.0}]}"

右手多指角度(单位:度 deg,通常 0~90):

ros2 topic pub --once ti5/hand_command ti5_hand/msg/HandCmd "{name: 'right', fingers: [{finger_id: 0, angle: 20.0}, {finger_id: 1, angle: 30.0}, {finger_id: 2, angle: 35.0}, {finger_id: 3, angle: 40.0}, {finger_id: 4, angle: 45.0}, {finger_id: 5, angle: 10.0}]}"

查看状态:

ros2 topic echo ti5/hand_status

预设动作:

ros2 service call /ti5/hand_action ti5_hand/srv/HandAction "{hand_name: 'left', action_id: 0}"   # STRAIGHT
ros2 service call /ti5/hand_action ti5_hand/srv/HandAction "{hand_name: 'left', action_id: 1}"   # VICTORY
ros2 service call /ti5/hand_action ti5_hand/srv/HandAction "{hand_name: 'left', action_id: 2}"   # OK
ros2 service call /ti5/hand_action ti5_hand/srv/HandAction "{hand_name: 'left', action_id: 3}"   # HEART

2. 夹爪(OmniPicker CAN)

2.1 节点说明

节点

职责

gripper_manager

ti5_gripper

左右夹爪 CAN 通信与命令处理

配置文件:ti5_gripper/config/gripper_config.yamlcan_node_idcan_interfacecan_bitratevendor 等)

协议要点(CAN 2.0 / CAN-FD,固件 ≥ 3.3.0):

  • 下行:ID = can_node_id,8 字节 00 pos vel force acc dec 00 00pos:0 夹紧,255 张开)

  • 上行:同 ID,每收到一次控制帧回传状态(fault_codestateposvelforce

2.2 话题与服务

  • 订阅:ti5/gripper_commandti5_gripper/msg/GripperCmd

  • 发布:ti5/gripper_statusti5_gripper/msg/GripperState

  • 服务:ti5/gripper_actionti5_gripper/srv/GripperActionACTION_CLOSE=0ACTION_OPEN=1ACTION_HALF=2

GripperCmdvelocity / force / acceleration / deceleration 为 0 时使用 YAML 中的 default_*

2.3 示例

# 启动(与 joint_manager 同 workspace)
./script/run_ti5_services.sh --type T170C_2_0 --enable-gripper true --enable-hand false

# 50% 行程,其余参数最大(协议示例:00 7F FF FF FF FF 00 00)
ros2 topic pub --once ti5/gripper_command ti5_gripper/msg/GripperCmd \
  "{name: 'left', position: 127, velocity: 255, force: 255, acceleration: 255, deceleration: 255}"

ros2 service call /ti5/gripper_action ti5_gripper/srv/GripperAction "{gripper_name: 'left', action_id: 1}"
ros2 topic echo ti5/gripper_status

bringup:

ros2 launch ti5_bringup ti5_bringup.launch.py type:=T170C_2_0 enable_gripper:=true

3. 语音对话

3.1 节点说明

节点

职责

ti5_chat_node

ti5_chat

将 ROS2 服务请求转发到 ti5Chat HTTP 服务

节点参数:

  • http_base_url:后端 HTTP 地址(默认 http://127.0.0.1:4990

通过 ti5_bringup 启动:

  • ros2 launch ti5_bringup ti5_bringup.launch.py type:=T140A enable_chat:=true

  • 自定义后端地址:... enable_chat:=true chat_http_base_url:=http://127.0.0.1:4990

3.2 话题定义

当前无自定义 topic(该模块为服务型适配层)。

3.3 服务接口

ti5_chat_node 对外提供:

  • ti5chat/sttstd_srvs/srv/Trigger

  • ti5chat/llmti5_chat/srv/TextService

  • ti5chat/ttsti5_chat/srv/TextService

  • ti5chat/chatstd_srvs/srv/Trigger

  • ti5chat/chatbot_startstd_srvs/srv/Trigger

  • ti5chat/chatbot_stopstd_srvs/srv/Trigger

  • ti5chat/chatbot_statusti5_chat/srv/StatusService

3.4 示例程序

查看服务:

ros2 service list | grep ti5chat

调用示例:

# 语音识别(STT)
ros2 service call /ti5chat/stt std_srvs/srv/Trigger "{}"

# 对话(LLM)
ros2 service call /ti5chat/llm ti5_chat/srv/TextService "{text: '你好'}"

# 语音合成(TTS)
ros2 service call /ti5chat/tts ti5_chat/srv/TextService "{text: '你好'}"

# ChatBot 状态
ros2 service call /ti5chat/chatbot_status ti5_chat/srv/StatusService "{}"

4. 相机

4.1 节点说明

通过 ROS 官方包 realsense2_camera 接入 Intel RealSense;依赖与版本说明见:realsense-ros — Installation on Ubuntu

常用节点:realsense2_camera_node;多机位可用 rs_launch.pyrs_multi_camera_launch.py 等 launch 启动。

多设备注意:

  • 必须使用序列号 serial_no,与物理设备一一对应。

  • 每台设备的 camera_name 须不同(如 cam_1cam_2),避免话题冲突。

  • serial_no 建议用引号包裹(如 "_123456789012"),确保按字符串解析。

4.2 话题定义

节点启动后,在 sensor_msgs/Imagesensor_msgs/CameraInfo 等标准类型下发布彩色/深度等流;具体话题名与命名空间、相机名有关,请以 ros2 topic list 为准。在 rviz2 中:Add → By topic,选择对应 image 话题即可查看画面。

4.3 服务接口

本接入以图像/点云等话题为主;相机标定、动态参数等服务以 realsense2_camera 实际声明为准,详见上游文档与 ros2 service list

4.4 示例程序

依赖安装:

sudo apt install ros-humble-librealsense2*
sudo apt install ros-humble-realsense2-*

获取设备序列号:

rs-enumerate-devices | grep "Serial Number"

单设备:

source /opt/ros/humble/setup.bash
ros2 run realsense2_camera realsense2_camera_node

多设备(单终端,两台示例):

source /opt/ros/humble/setup.bash
ros2 launch realsense2_camera rs_multi_camera_launch.py \
    camera_namespace1:=<命名空间1> \
    camera_name1:=<相机名称1> \
    serial_no1:=_<序列号1> \
    camera_namespace2:=<命名空间2> \
    camera_name2:=<相机名称2> \
    serial_no2:=_<序列号2> \

多设备(两终端,各一台):

# 终端 1 / 设备 1
source /opt/ros/humble/setup.bash
ros2 launch realsense2_camera rs_launch.py \
  camera_name:=cam_1 serial_no:=_<序列号1>

# 终端 2 / 设备 2
source /opt/ros/humble/setup.bash
ros2 launch realsense2_camera rs_launch.py \
  camera_name:=cam_2 serial_no:=_<序列号2>

rviz2:

rviz2

5. 六维力

5.1 节点说明

节点

职责

sri_can_node

sri_can

六维力传感器 CAN 通信与数据发布

配置文件:src/sri_can/config/sri_can/sri_can_sensors.yaml

5.2 话题定义

  • 发布:sri_can/wrench_arraysri_can/msg/SriWrenchArray

5.3 服务接口

类型与用途:

  • SriCommand:connect/disconnect/read_once/start_continuous/stop_continuous

  • SriSetZero:清零与偏置采样

  • SriGetStatus:连接/在线/流模式/CAN 状态等查询

节点在私有命名空间下提供服务时,实际名称通常为:

  • /sri_can_node/read_once/sri_can_node/start_continuous/sri_can_node/set_zero/sri_can_node/get_status 等(以 ros2 service list 为准)

语义摘要:

  • SriCommand.read_once:返回 values=[FX,FY,FZ,MX,MY,MZ]

  • SriSetZero:支持 samples,返回 offsets

  • SriGetStatus:返回 connectedcan_okonlinestreaminglast_rx_age_sec

5.4 示例程序

启动:

ros2 launch sri_can sri_can.launch.py

话题与服务:

# 查看实时六维力(以左臂为例)
ros2 topic echo /sri_can/wrench_array

# 单次读取一帧(sensor_id:left_arm)
ros2 service call /sri_can_node/read_once sri_can/srv/SriCommand "{sensor_id: 'left_arm'}"

# 连接并开始连续流(如未开启 auto_start_streaming,可先 start_continuous)
ros2 service call /sri_can_node/start_continuous sri_can/srv/SriCommand "{sensor_id: 'left_arm'}"

# 清零(多次采样取平均)
ros2 service call /sri_can_node/set_zero sri_can/srv/SriSetZero "{sensor_id: 'left_arm', samples: 50}"

# 查询连接/流模式/在线状态等
ros2 service call /sri_can_node/get_status sri_can/srv/SriGetStatus "{sensor_id: ''}"

6. 底盘

6.1 节点说明

节点

职责

chassis_cmd_bridge

ti5_chassis

订阅 ti5/chassis_cmd,按 backend 选择后端(wushi WebSocket / lanxin SDK)下发速度指令

可选参数(默认值见实现):

  • 通用:backend(默认 wushi,兼容别名 ti5)、chassis_cmd_topic(默认 ti5/chassis_cmd)、cmd_timeout_sec(默认 0.3

  • backend=wushirobot_ip(默认 169.254.128.2)、robot_port(默认 5480

  • backend=lanxinserver_ipserver_port(通常 9000/9001)、speed_factorenable_sdk_ctrl_speedstrict_enable_sdk_ctrl_speed_check

注意:

  • ros2 run ti5_chassis chassis_cmd_bridge 不带参数时会用代码默认值(backend=wushi)。

  • ros2 launch ti5_chassis chassis.launch.py 会读取参数文件(默认 share/ti5_chassis/config/chassis.yaml),可在 YAML 中将 backend 设为 lanxin

  • backend=lanxinenable_sdk_ctrl_speed=true 时,节点会在启动连接成功(以及重连成功)后尝试调用一次 EnableSdkCtrlSpeed(true)

  • strict_enable_sdk_ctrl_speed_check=false(默认兼容模式),即便 SDK 返回空 task_id 也会继续发送 SendTwist;若设为 true,则会严格拦截该类发送。

随系统启动:

  • ros2 launch ti5_bringup ti5_bringup.launch.py type:=T140A enable_chassis:=true

  • ./script/run_ti5_services.sh --type T140A --enable-chassis true

6.2 话题定义

  • 订阅:ti5/chassis_cmdti5_chassis/msg/ChassisCmd

ChassisCmd 关键字段:

  • linear_x:线速度(m/s,前向)

  • linear_y:横向线速度(m/s;全向轮可用,非全向请填 0)

  • angular:角速度(rad/s)

建议确认:ros2 node list | grep chassis_cmd_bridgeros2 topic echo ti5/chassis_cmd(使用命名空间 --ns /robot1 时话题为 /robot1/ti5/chassis_cmd)。

6.3 服务接口

无(底盘运动仅通过订阅话题控制)。

6.4 示例程序

发布底盘速度(默认无命名空间为 ti5/chassis_cmd;使用 --ns /robot1 时为 /robot1/ti5/chassis_cmd):

# 前进
ros2 topic pub --once ti5/chassis_cmd ti5_chassis/msg/ChassisCmd "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''}, linear_x: 0.2, linear_y: 0.0, angular: 0.0}"

# 左转
ros2 topic pub --once ti5/chassis_cmd ti5_chassis/msg/ChassisCmd "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''}, linear_x: 0.0, linear_y: 0.0, angular: 0.5}"

# 停止
ros2 topic pub --once ti5/chassis_cmd ti5_chassis/msg/ChassisCmd "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''}, linear_x: 0.0, linear_y: 0.0, angular: 0.0}"

# 持续 20Hz 旋转 3 秒后停止(推荐做法)
timeout 3s ros2 topic pub -r 20 ti5/chassis_cmd ti5_chassis/msg/ChassisCmd "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''}, linear_x: 0.0, linear_y: 0.0, angular: 0.2}"
ros2 topic pub --once ti5/chassis_cmd ti5_chassis/msg/ChassisCmd "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''}, linear_x: 0.0, linear_y: 0.0, angular: 0.0}"