来源:CSDN
发布时间:Nov 18, 2020, 9:30:28 AM
原地址:https://blog.csdn.net/weixin_41877339/article/details/109725355
上一章进行了初步的源码阅读以及简单修改移植,本章的目标是将SDK文件同机器狗的控制文件相结合,达到语音控制小狗运动的效果。
python编写订阅器发布器
考虑到大部分机器狗的控制脚本都是用python编写的,之前代码的编写都是基于c++,所以在这一部分先学习一下python脚本实现订阅器发布器的功能。
发布器
- 代码解析
import rospy #导入rospy模块
from std_msgs.msg import String#导入String类,字符串类型
def talker():#talker函数
pub = rospy.Publisher('chatter', String, queue_size=10)#发布消息,话题是“chatter",类型是string,消息大小queue_size
rospy.init_node('talker', anonymous=True)#初始化节点,匿名
rate = rospy.Rate(10) # 10hz,发布消息的频率
while not rospy.is_shutdown():#定义循环,在没有接收到关闭信号时一直执行循环
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)#这个loginfo(str)有3个作用,第一,打印消息,第二,被写入节点日志文件中,第三,被写入rosout中(这样就可以通过rqt_console查看)
pub.publish(hello_str)#发布消息
rate.sleep()#sleep函数,等待到下一次发布时间。(10HZ,也就是等1/10秒)
if __name__ == '__main__':#主函数
try:
talker()
except rospy.ROSInterruptException:
pass
订阅器
- 代码解析
import rospy
from std_msgs.msg import String
def callback(data):#回调函数,打印信息
rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)
def listener():
# In ROS, nodes are uniquely named. If two nodes with the same
# name are launched, the previous one is kicked off. The
# anonymous=True flag means that rospy will choose a unique
# name for our 'listener' node so that multiple listeners can
# run simultaneously.
rospy.init_node('listener', anonymous=True)
rospy.Subscriber('chatter', String, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
listener()
尝试python订阅器接收c++发布器的消息
我的计划是对于发布器,采用语音识别本来的c++脚本,对于订阅器直接在机器狗控制脚本的python文件中进行修改,所以,首先尝试编写最简单的文件实现两者的通信。移植也很简单,只需要简单修改订阅话题即可。
- 在功能包下创建新文件夹script并编写listener.py
- 修改话题
rospy.Subscriber('voiceWords', String, callback)
- 运行效果
移植代码到树莓派下
之前一直是在pc端跑的程序,机器狗是使用的树莓派3b,所以将语音识别进行移植,不过移植过程中出现了几个问题。为了方便我使用FileZilla进行文件传递。
- 问题1
这是因为缺少软件包导致的。
- 解决办法
sudo apt-get install libasound2-dev
- 问题2
根据问题描述我们可以看出,不能识别libmsc.so文件。是因为交叉编译的原因
- 解决办法
我们先查看现在的文件格式。
file /home/liuda/spotmicro/src/spotMicro/robot_voice/libs/x64/libmsc.so
我们发现是x86-64版本的,而我们树梅派是ARM架构的。所以自然不会识别。
然而,爆炸。
官网中没有给可以在ARM架构中使用的库文件,不过这怎能挡得住我们探索的脚步,网上最不缺的就是资源,我们只需要下载一个树莓派的库即可。下载链接,将下载后的文件中的RaspberryPi文件夹上传到树莓派中的libs文件夹下,并修改相应的编译文件即可成功编译。
- 验证功能性
遇到一个问题,这问题以前也出现过,主要原因是因为登陆失败,授权不成功,需要修改appid。可能是因为我修改了库文件,导致我申请的appid超出权限,登录失败。
- 解决办法
解决办法也相当简单,修改appid即可,我直接在网上找了一个博主的56ee43d0,实测可以使用。 - 识别不到声音
出现一个新问题,识别不到声音
- 问题分析
识别不到声音我考虑是有可能是两个方面的原因,首先是音频输入声音太小,识别不到;其次是科大讯飞语音库SDK移植得有问题,导致不工作。我怀疑是第二种问题的可能性比较大,因此,移植一个不需要外部输入音频的文件进行功能的分析。
遇到了找不到库文件的问题:
解决方法比较简单:直接将库文件复制到/usr/local/lib文件夹下。
然而,调用识别音频文件的功能包还是可以正常识别的(自动忽略“?”乱码),识别结果中美数控还是正常的。由此推断,语音识别功能是正常的,所以问题应该是出现在音频输入收声的部分。
考虑的解决办法是购买一个usb麦克风进行收声,具体效果有待验证。