外设控制
1. 灵巧手
1.1 节点说明
节点 |
包 |
职责 |
|---|---|---|
|
|
灵巧手通信与命令处理 |
配置文件:ti5_hand/config/hand_config.yaml(常用项:port_name、baud_rate、hand_id、master_id、hand_name、comm_type、vendor)
1.2 话题定义
订阅:
ti5/hand_command(ti5_hand/msg/HandCmd)发布:
ti5/hand_status(ti5_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对应内部位置65535HandState:hand_name、is_connected、fingers[]
补充:HandCmd.fingers[] 可只填需调整的手指;未出现的指按默认 0deg。hand_command 速度由服务端固定(内部 speed=255),消息中无速度字段。
1.3 服务接口
/ti5/hand_action(ti5_hand/srv/HandAction)
动作常量:
ACTION_STRAIGHT = 0ACTION_VICTORY = 1ACTION_OK = 2ACTION_HEART = 3
请求字段:hand_name、action_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 节点说明
节点 |
包 |
职责 |
|---|---|---|
|
|
左右夹爪 CAN 通信与命令处理 |
配置文件:ti5_gripper/config/gripper_config.yaml(can_node_id、can_interface、can_bitrate、vendor 等)
协议要点(CAN 2.0 / CAN-FD,固件 ≥ 3.3.0):
下行:ID =
can_node_id,8 字节00 pos vel force acc dec 00 00(pos:0 夹紧,255 张开)上行:同 ID,每收到一次控制帧回传状态(
fault_code、state、pos、vel、force)
2.2 话题与服务
订阅:
ti5/gripper_command(ti5_gripper/msg/GripperCmd)发布:
ti5/gripper_status(ti5_gripper/msg/GripperState)服务:
ti5/gripper_action(ti5_gripper/srv/GripperAction:ACTION_CLOSE=0、ACTION_OPEN=1、ACTION_HALF=2)
GripperCmd 中 velocity / 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 节点说明
节点 |
包 |
职责 |
|---|---|---|
|
|
将 ROS2 服务请求转发到 |
节点参数:
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/stt(std_srvs/srv/Trigger)ti5chat/llm(ti5_chat/srv/TextService)ti5chat/tts(ti5_chat/srv/TextService)ti5chat/chat(std_srvs/srv/Trigger)ti5chat/chatbot_start(std_srvs/srv/Trigger)ti5chat/chatbot_stop(std_srvs/srv/Trigger)ti5chat/chatbot_status(ti5_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.py、rs_multi_camera_launch.py 等 launch 启动。
多设备注意:
必须使用序列号
serial_no,与物理设备一一对应。每台设备的
camera_name须不同(如cam_1、cam_2),避免话题冲突。serial_no建议用引号包裹(如"_123456789012"),确保按字符串解析。
4.2 话题定义
节点启动后,在 sensor_msgs/Image、sensor_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 节点说明
节点 |
包 |
职责 |
|---|---|---|
|
|
六维力传感器 CAN 通信与数据发布 |
配置文件:src/sri_can/config/sri_can/sri_can_sensors.yaml
5.2 话题定义
发布:
sri_can/wrench_array(sri_can/msg/SriWrenchArray)
5.3 服务接口
类型与用途:
SriCommand:connect/disconnect/read_once/start_continuous/stop_continuousSriSetZero:清零与偏置采样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,返回offsetsSriGetStatus:返回connected、can_ok、online、streaming、last_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 节点说明
节点 |
包 |
职责 |
|---|---|---|
|
|
订阅 |
可选参数(默认值见实现):
通用:
backend(默认wushi,兼容别名ti5)、chassis_cmd_topic(默认ti5/chassis_cmd)、cmd_timeout_sec(默认0.3)backend=wushi:robot_ip(默认169.254.128.2)、robot_port(默认5480)backend=lanxin:server_ip、server_port(通常9000/9001)、speed_factor、enable_sdk_ctrl_speed、strict_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=lanxin且enable_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_cmd(ti5_chassis/msg/ChassisCmd)
ChassisCmd 关键字段:
linear_x:线速度(m/s,前向)linear_y:横向线速度(m/s;全向轮可用,非全向请填 0)angular:角速度(rad/s)
建议确认:ros2 node list | grep chassis_cmd_bridge、ros2 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}"