Skip to main content

动作与音频工具

本页记录当前开发包可验证的 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. 字段说明​

字段类型说明
supportedbool当前控制器是否支持 motion 查询/播放
motion_playingbool当前是否正在播放 motion
current_motion_namestd::string当前 motion 名称
available_motion_namesstd::vector<std::string>当前可播放 motion 名称
timeout_msintRPC 超时,默认 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.cpp
  • src/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.h
  • installed/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 或语音合成接口。