Package Summary
Tags | No category tags. |
Version | 1.0.0 |
License | Apache License 2.0 |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/miroboticslab/cyberdog_ros2.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2021-10-15 |
Dev Status | UNMAINTAINED |
CI status | No Continuous Integration |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- jia
Authors
audio_interaction
模块简介
该模块用于实现整个音频模块的交互部分,主要包括以下几个方面的功能: 1、与其它模块之间关于通用播放的交互功能 2、语音助手相关控制与交互功能(APP(grpc)、决策模块) 3、与APP(grpc)之间关于音量调解的交互功能
播放功能
简介
本模块实现了一个action server作为通用播放接口,其它任意模块可以通过实现action client来请求播放本地音频文件以实现播放提醒的功能。
目前语音播放的action接口播放的实现是阻塞的,即在播放一条本地音频(current_goal)的同时会拒绝接受新的播放请求(pending_goal),直到当前音频播放完毕,才有新的请求能被接收进来,后期的持续升级中,此处将会将当前设计修改为:播放一条本地音频的同时会一定程度上接受有限数量的放请求,audio_base中的播放器会将这些本地的音频播报请求做混音(mix)处理,这样就可以同时满足一定数量的请求能够被同时播放出来。
混音播放多条请求的同时,为了提供更好的听觉体验,后续升级的同时,该模块将根据播放的内容, 将这些本地音源处理为不同优先的的播报类型,混音的同时,将根据播报的类型,将各个混音的音源对象做出相应的音量调节,敬请期待。
音频播放时音频模块最基础的功能,下面着重介绍。
接口描述
action name: audio_play 此处介绍audio server与client之间的接口描述,以便了解如何实现,具体的底层播放的实现细节请参见audio base 模块的README。 回调: check_play_request 涉及的接口文件如下: AudioPlay.msg 文件定义了整个action接口的结构,分为order,result,feedback三部分,如下,每部分又有单独的msg文件来定义,下方可见具体介绍。
# goal definition
AudioOrder order
---
# result definition
AudioResult result文件
---
# feedback
AudioFeedback feed
AudioOrder.msg order部分由三部分构成,第一部分为一个时间戳,第二部分为具体播放的曲目,第三部分为发出order请求的模块,后两部分由单独的msg文件定义
# Time
std_msgs/Header header
# Song name
AudioSongName name
# User
AudioUser user
由于后期产品定义的调整,以及考虑开发者应用更加方便,AudioSongName中的定义目前已弃用,此处可直接传入一个uint16的值,这个值的具体含义可解析为一个本地(/opt/ros2/cyberdog/data/wav/)的wav文件,具体的含义可见附录。
此处支持个人开发者自由生成音频文件来扩充本地音频支援,目前支持的格式为: 采样率:16000 通道数:1 数据格式:16bit 小端 后续OTA持续升级过程中,我们将开放更广泛的采样率支持,敬请期待。
AudioUser.msg 此处定义了此action client端的具体模块名(后续优化中将被替换为优先级)
# Assistant Messages
#
#
int8 DEFAULT = 0
int8 STARTER = 1
int8 POWER = 2
int8 TOUCH = 3
int8 CAMERA = 4
int8 APP = 5
int8 BLUETOOTH = 6
int8 WIFI = 7
int8 XIAOAI = 8
#
int8 id
#
模块内部完成音播放是通过使用audio base模块中提供的方法来实现的。
在本模块中的相关实现可参见以下方法,其中play_callback在播放完成后会自动调用。
void player_init();
void player_handle(int id);
void play_callback();
语音助手控制与交互功能
功能介绍
音频模块除了支持基本的播放功能外,还支持语音助手的功能,语音助手的具体集成实现可参见audio assistant模块的README,该模块只介绍通过APP控制语音助手的交互功能。
这部分的具体功能分为以下几部分: 1、接收APP的指令,完成对语音助手的开关控制(决定助手功能功能的工作状态:是否开启) 2、查询语音助手的工作状态,并与APP的控制状态同步 3、接收语音助手发出的运动控制的指令,通知决策模块对应语音指令的下发 4、接收APP发来的获取device id的请求,并返回device id 5、接收APP发来的传输token的请求,检测token的正确性后,将token写入token.toml文件中 6、检测当前网络状态并广播
此处需要注意的是,为了提高跨平台通信的效率,模块与APP之间的通信引入了grpc的解决方案,grpc的引入不影响本模块代码的正常书写,了解grpc的解决方案,可参考cyberdog_grpc模块的README以及代码实现。
接下来选择性得介绍以上功能的重点部分。
APP控制与查询语音助手的状态通过一个service通信来实现,本模块内部实现了一个service server用于接收APP侧发来的请求,具体的实现简述如下。 service name: token_update 回调: check_app_order
涉及的接口文件如下: TokenPass.srv Token.msg
APP发出的请求主要包括以下几个部分: 1、请求关闭/开启语音助手功能:此处语音助手开启的状态下默认会优先走在线功能(可对话,可运行语音动作指令),在在线功能走失败情况下(网络问题等原因)走离线功能。目前APP的按钮只区分语音助手的开关状态,没有开放对走语音助手离线/在线的选择功能。 2、请求获取device id用于申请在线语音助手功能开启必要的token。 3、请求发送token。 4、请求获取语音助手当前运行状态。
对语音助手模块(audio assistant)的请求目前通过一个topic实现,本模块实现一个topic发布来发布相关请求,audio asistant模块实现订阅来进行接收处理。
目前本模块发布的内容包括以下几个部分,重点实现的方法可通过查询该主题发布的方法PublishAiSwitch来查询。 1、通知开启语音助手在线功能 2、通知关闭语音助手在线功能
考虑Topic发布订阅的方式无法获取接收方是否成功执行的结果,发送请求后也无法获得接收方的应答,目前的这种通信方式正在修改为service的通信方式,本模块实现一个service client来向audio assistant模块发出以下几种请求,并等待audio assistant模块的一个实际执行结果。 1、请求开启语音助手在线功能 2、请求关闭语音助手在线功能 3、请求获取语音助手当前运行状态
这样设计的好处是,本模块可以真实的获取到audio assistant模块接收请求后实际运行的结果,如:发送开启语音助手的请求,这个时候语音助手模块可能会成功开启在线功能,这时候将会返回本模块一个执行成功的结果,语音助手模块也可能会因为网络问题,实际启用了离线功能,或者因为一些其它的错误,实际完全无法启动,这个时候将会返回本模块一个执行错误的结果,当本模块收到执行错误的结果时会在一定时间内向audio assistant模块发送查询当前运行状态的一个请求,这样本模块就会得到audio assistant模块的一个实际的运行状态,方便状态维护的问题,以及APP查询语音助手工作状态时能够返回一个正确的结果。
遗憾的是由于时间问题,这部分的实现还没有完全完成topic -> service的完全替换,这部分会在之后OTA的升级过程中完善。
设计提醒
通过以上的功能介绍可以看出,此部分APP,audio_assistant以及本模块之间的交互相关功能的逻辑过于繁复,一系列audio assistant与APP之间的通信功能需要依靠本模块转发,这样的设计与整个audio模块的任务分工以及其它因素有关。
这样的设计与整个ROS2的去中心化的设计理念是不符的,提醒广大开发者尽量规避。
音量调解功能
本模块提供音量调节的接口,目前该接口是通过接收APP下发的音量设置的请求,与APP之间的通信接口即以上提到的service(name:token_update)的接口。
模块内部完成音量调节是通过使用audio base模块中提供的方法来实现的。
在本模块中的相关实现可参见以下方法:
void volume_set(int vol);
int volume_get();
附录
本地wav对照表 | 编号 | 提示音含义 | | :—- | :—- | | 1 | 开机 | | 2 | 关机 | | 3 | 开始充电/充电完成 | | 4 | 摸头启动连接/连接成功 | | 5 | 连接中/人脸录入中/人脸识别中 | | 6 | 未连接/连接失败 | | 7 | 路径规划失败/有障碍物无法通过/当前状态不可执行 | | 8 | 开始拍照 | | 9 | 录像每隔30s/录像每隔2min |
编号 | TTS音频 |
---|---|
100 | 唤醒狗叫 |
101 | 电量低于%10 |
102 | 现在开始充电 |
103 | 人脸录入开始,蹲在我面前不要动哦 |
104 | 充电完成了 |
105 | 正在连接遥控器 |
106 | 遥控器连接失败 |
107 | 人脸录入开始,站在我面前不要动哦 |
108 | 人脸录入失败 |
109 | 人脸录入成功 |
110 | 开始识别人脸,走到我面前,看着灯光的位置哦 |
111 | 人脸识别失败 |
112 | 人脸识别成功 |
113 | 一次只能录一个人,正对镜头别动哦 |
114 | 我有点看不清,正对镜头别动哦 |
115 | 正对镜头,脸别动哦 |
116 | 主人离我太远了,请等我一下 |
117 | 我们的距离太近了,远一些比较安全 |
118 | 图传开启 |
119 | 我跟丢主人了 |
120 | 这条路好像走不了,再找找别的路吧 |
121 | 前方有障碍物 |
122 | 开始录像 |
123 | 日志抓取失败 |
124 | 请登陆app帐号以启用小爱在线功能 |
125 | 小爱在线功能启动 |
126 | 不行了,快没电了,我要趴下了 |
Wiki Tutorials
Package Dependencies
Deps | Name |
---|---|
ament_cmake | |
ament_lint_auto | |
ament_lint_common | |
audio_base | |
rclcpp | |
std_msgs | |
ception_msgs | |
interaction_msgs | |
motion_msgs | |
cyberdog_utils | |
builtin_interfaces | |
ALSA | |
OpenSSL | |
toml11_vendor |
System Dependencies
Dependant Packages
Name | Deps |
---|---|
cyberdog_audio |