动作与音频工具
本页记录当前开发包可验证的 motion、tact 和本地音频播放能力。motion 和 tact 由 lejusdk-vr 公开 C++ API 提供;音频播放当前只对外提供随包命令行工具,没有公开 C++ SDK 头文件。
Motion 状态查询
1. 功能描述
getMotionState() 查询当前控制器是否支持 motion、是否正在播放、当前动作名称和实际可用动作列表。
2. 所属 SDK 和头文件
- SDK:
lejusdk-vr - 头文件:
<lejusdk-vr/lejusdk_vr.h>
3. 请求或消息类型
bool getMotionState(leju::vr::MotionState& state,
int timeout_ms = 3000);
4. 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
supported | bool | 当前控制器是否支持 motion 查询/播放 |
motion_playing | bool | 当前是否正在播放 motion |
current_motion_name | std::string | 当前 motion 名称 |
available_motion_names | std::vector<std::string> | 当前可播放 motion 名称 |
timeout_ms | int | RPC 超时,默认 3000 ms |
5. 返回值
RPC 查询成功返回 true 并填充 state;服务不可用或超时返回 false。true 不等于 supported=true,两者需分开判断。
6. 使用前提
RobanVRAPI已初始化,控制器管理程序已启动。- 不在应用中猜测动作名,使用
available_motion_names返回的实际列表。
7. C++ 示例
leju::vr::MotionState state;
if (!vr.getMotionState(state)) return 1;
if (!state.supported) {
std::cout << "当前控制器不支持 motion\n";
return 0;
}
for (const auto& name : state.available_motion_names) {
std::cout << name << '\n';
}
8. 对应仓库示例
当前 src/lejusdk/examples/ 没有独立的 getMotionState() 用户示例。实际服务处理可参考:
src/leju-controllers/leju-rl-controller/src/runtime/input/external_interface.cpp- 公开类型:
installed/include/lejusdk-vr/data_types.h
启动 Motion
1. 功能描述
startMotion() 请求当前控制器播放 CSV motion。可传入具体动作名称,也可传入空字符串调用当前控制器的默认 motion 行为。
2. 所属 SDK 和头文件
- SDK:
lejusdk-vr - 头文件:
<lejusdk-vr/lejusdk_vr.h>
3. 请求或消息类型
bool startMotion(const std::string& name = "",
std::string* message = nullptr,
int timeout_ms = 3000);
4. 字段说明
name:motion 名称;命名列表从getMotionState()获取。message:可选输出参数,返回服务端文本。timeout_ms:RPC 超时,默认 3000 ms。
5. 返回值
服务端成功启动动作返回 true,不支持、动作不存在、超时或其他失败返回 false。
6. 使用前提
- runtime 已运行,机器人姿态和环境满足动作执行条件。
getMotionState()成功且supported=true。- 指定名称时,该名称存在于
available_motion_names。 - 播放期间不同时发送与动作冲突的外部关节指令。
7. C++ 示例
leju::vr::MotionState state;
if (!vr.getMotionState(state) ||
!state.supported ||
state.available_motion_names.empty()) {
return 1;
}
const std::string name = state.available_motion_names.front();
std::string message;
if (!vr.startMotion(name, &message, 3000)) {
std::cerr << message << '\n';
return 2;
}
8. 对应仓库示例
当前 SDK 示例目录未提供独立 startMotion() 客户程序。仓库内实际控制路由为:
src/leju-controllers/leju-rl-controller/src/controllers/controller_manager.cppsrc/leju-controllers/leju-rl-controller/src/controllers/generic_rl_controller.cpp
播放 Tact 动作
1. 功能描述
playTact() 通过 TactPlayer DDS-RPC 播放 .tact 动作。该通道独立于 startMotion() 的 CSV motion 接口。
2. 所属 SDK 和头文件
- SDK:
lejusdk-vr - 头文件:
<lejusdk-vr/lejusdk_vr.h>
3. 请求或消息类型
bool playTact(const std::string& name = "",
std::string* message = nullptr,
int timeout_ms = 3000);
4. 字段说明
name:tact 动作名,不包含.tact后缀。message:可选的服务端返回文本。timeout_ms:RPC 超时,默认 3000 ms。
5. 返回值
服务端成功接受并启动 tact 返回 true,失败返回 false;详细原因通过 message 返回。
6. 使用前提
RobanVRAPI已初始化,TactPlayer 服务已启动。- tact 资源已存在于当前部署的资源目录,并传入不带后缀的实际动作名。
- 机器人处于允许播放该动作的安全状态。
7. C++ 示例
std::string message;
const std::string tact_name = "<已部署的动作名>";
if (!vr.playTact(tact_name, &message, 5000)) {
std::cerr << message << '\n';
return 1;
}
8. 对应仓库示例
- 源码:
src/lejusdk/examples/src/lejusdk-vr/09_play_tact.cpp - 已编译程序:
vr_09_play_tact
仓库示例使用 KuavoVRAPI 演示通用 RPC 流程;Roban2 二次开发应使用 RobanVRAPI。
Tact 命令订阅
1. 功能描述
subscribeTactCommand() 订阅从 NX bridge 通过 Topic 传入的 tact 动作名。该接口用于需要实现 tact 命令消费端的进阶场景,普通客户端播放使用 playTact()。
2. 所属 SDK 和头文件
- SDK:
lejusdk-vr - 头文件:
<lejusdk-vr/lejusdk_vr.h>
3. 请求或消息类型
using TactCmdCallback = std::function<void(const std::string&)>;
void subscribeTactCommand(leju::vr::TactCmdCallback callback);
4. 字段说明
回调参数是不包含 .tact 后缀的动作名字符串。
5. 返回值
订阅方法无返回值。
6. 使用前提
RobanVRAPI已初始化。- 调用者是命令消费端,已自行实现资源检查、播放串行化和安全状态判断。
7. C++ 示例
vr.subscribeTactCommand([](const std::string& name) {
std::cout << "received tact command: " << name << '\n';
});
8. 对应仓库示例
当前 src/lejusdk/examples/ 没有独立订阅示例。公开声明位于:
installed/include/lejusdk-vr/vr_api/vr_base.hinstalled/include/lejusdk-vr/data_types.h
本地音频文件播放
1. 功能描述
play_audio_cli 通过 AudioPlayerService DDS-RPC 请求 audio_player_node 播放本地音频文件。它是随 installed/bin 提供的命令行工具,不是公开 C++ SDK 类。
2. 所属 SDK 和头文件
- 随包程序:
installed/bin/play_audio_cli - 服务端:
installed/bin/audio_player_node - 公开 C++ SDK 头文件:无
3. 请求或消息类型
play_audio_cli <file_name> [volume]
工具内部发送 AudioPlayerService 的 PlayAudioRequest,等待 PlayAudioReply。由于当前开发包未将该 RPC 类型作为 SDK 头文件对外发布,二次开发文档不编造直接 RPC 代码。
4. 字段说明
| 参数 | 说明 |
|---|---|
file_name | 裸文件名相对 audio_player_node 的 AUDIO_FILE_DIR 解析,也可使用实际机器人上的绝对路径 |
volume | 音量百分比,可选,默认 100 |
AUDIO_FILE_DIR 的默认值为 ~/.config/lejuconfig/music。
5. 返回值
命令行返回码:
0:服务端返回播放成功。1:服务不可用、超时、RPC 错误或服务端返回失败。2:未提供file_name,参数不完整。
终端同时输出 [OK] / [FAIL] 和服务端消息。
6. 使用前提
- 已设置
ROBOT_VERSION=17并加载installed/setup.bash。 audio_player_node正在运行;launch_real.sh会将它作为可选节点启动,没有可用播放设备时该节点可能退出。- 播放节点能访问音频文件,并且系统存在可用扬声器和解码环境。
7. C++ 示例
当前开发包没有公开 AudioPlayerService 的 C++ SDK 头文件,因此本节不提供虚构的 C++ 调用。使用随包工具:
play_audio_cli demo.wav
play_audio_cli demo.wav 50
这里的 demo.wav 是示意文件名,需替换为实际已部署文件。
8. 对应仓库示例
- 命令行客户端:
installed/bin/play_audio_cli - 播放服务节点:
installed/bin/audio_player_node - 真机启动编排:
src/leju_launch/scripts/launch_real.sh
当前开发包未提供文本转语音(TTS)公开 SDK,本页不沿用旧版 RobotAudio 或语音合成接口。