$cd ~/catkin_ws/src
创建一个baidu_nlu的package
$catkin_create_pkg baidu_nlu std_msgs rospy roscpp
$ cd ..
$ catkin_make
编译在src目录下的所有文件
rospack depends baidu_nlu
如果只看直接依赖
rospack depends1 baidu_nlu
下面说下编译cmake
$ catkin_make
$ catkin_make install # (optionally)
如果指定某个包编译
$ catkin_make --source my_src$ catkin_make install --source my_src # (optionally)
string natural_language_json
---
string processing_result_json
无论是msg还是srv,本质上都是msg,所以要修改CMakeLists.txt和package.xml文件,增加对其的支持。
message_generation
message_runtime
当然在package.xml当中还有一些说明性的文字,改为自己的信息就可以。
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
generate_messages( DEPENDENCIES std_msgs)
如果有msg文件则需要改下面这句,我们这里没有所以不用改
add_message_files( FILES SAMPLE.msg)
如果有srv文件则需要改下面这句,我们需要修改
add_service_files( FILES NLU.srv)
下面开始写我们的服务了,python的代码放在当前package的scripts目录下(cpp的放src目录)
#!/usr/bin/env python
from baidu_nlu.srv import *
import rospy
def handle_nlu(req):
print 'request is ',req.natural_language_json
return NLUResponse(req.natural_language_json+'===')
def nlu_server():
rospy.init_node('nlu_server')
s = rospy.Service('nlu',NLU,handle_nlu)
print 'ready to parse the sentence'
rospy.spin()
if __name__ == '__main__':
nlu_server()
$ chmod +x scripts/natural_language_understanding_server.py
下面可以测试下刚才的代码。
$ nohup roscore >/dev/null &
上面的代码可以用启动服务
$ rosrun baidu_nlu natural_language_understanding_server.py
运行之后可以用下面的命令实验
$ rosservice call /nlu 'asdfasdf'
这里的'asdfasdf'是随意给定的字符串,这个服务现在的功能就是给定的字符串之后添加三个等号返回。
#!/usr/bin/env python
#coding=utf-8
import urllib2
from baidu_nlu.srv import *
import rospy
def nlu_test(msg):
domainIds = ','.join([str(x) for x in xrange(1,30)])
url = 'http://yuyin.baidu.com/nlp/analysisPreview?domainIds=%s&query=%s'%(domainIds,msg)
response = urllib2.urlopen(url).read()
return response
def handle_nlu(req):
print 'request is ',req.natural_language_json
return NLUResponse(nlu_test(req.natural_language_json))
def nlu_server():
rospy.init_node('nlu_server')
s = rospy.Service('nlu',NLU,handle_nlu)
print 'ready to parse the sentence'
rospy.spin()
if __name__ == '__main__':
nlu_server()
为方便测试,简单写个测试脚本input.sh
rosservice call /nlu '北京明天的天气'
rosservice call /nlu '请下载周杰伦的歌曲'
rosservice call /nlu '后天北京到广州的火车'
rosservice call /nlu '你今天心情好么'
rosservice call /nlu '宫保鸡丁怎么做'
代码可见 https://github.com/roboyun/ros_nlu
解决个小问题,因为我的代码跑在树莓派上,上面的vim对于中文的支持有点问题,需要改下配置文件。
$ sudo vim /etc/vim/vimrc
set fileencodings=utf-8
set termencoding=utf-8
set encoding=prc
$ source /etc/vim/vimrc
#! /usr/bin/env python
#coding=utf-8