Skip to content

Commit

Permalink
Merge branch 'master' of github.com:xiaozhuchacha/OpenBottle
Browse files Browse the repository at this point in the history
  • Loading branch information
mjedmonds committed Mar 1, 2017
2 parents 1bdbba1 + 342be9f commit 0dfe5ae
Show file tree
Hide file tree
Showing 681 changed files with 131,106 additions and 3 deletions.
187 changes: 187 additions & 0 deletions action_earley_srv/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
cmake_minimum_required(VERSION 2.8.3)
project(action_earley_srv)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )

## Generate services in the 'srv' folder
add_service_files(
FILES
action_earley.srv
)

## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )

## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################

## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if you package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES sentence_srv
# CATKIN_DEPENDS rospy std_msgs
# DEPENDS system_lib
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
# add_library(sentence_srv
# src/${PROJECT_NAME}/sentence_srv.cpp
# )

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(sentence_srv ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
# add_executable(sentence_srv_node src/sentence_srv_node.cpp)

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(sentence_srv_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
# target_link_libraries(sentence_srv_node
# ${catkin_LIBRARIES}
# )

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables and/or libraries for installation
# install(TARGETS sentence_srv sentence_srv_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_sentence_srv.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
56 changes: 56 additions & 0 deletions action_earley_srv/package.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?xml version="1.0"?>
<package>
<name>action_earley_srv</name>
<version>0.0.0</version>
<description>The action_earley package</description>

<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="yixin@todo.todo">yixin</maintainer>


<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>TODO</license>


<!-- Url tags are optional, but mutiple are allowed, one per tag -->
<!-- Optional attribute type can be: website, bugtracker, or repository -->
<!-- Example: -->
<!-- <url type="website">http://wiki.ros.org/sentence_srv</url> -->


<!-- Author tags are optional, mutiple are allowed, one per tag -->
<!-- Authors do not have to be maintianers, but could be -->
<!-- Example: -->
<!-- <author email="jane.doe@example.com">Jane Doe</author> -->


<!-- The *_depend tags are used to specify dependencies -->
<!-- Dependencies can be catkin packages or system dependencies -->
<!-- Examples: -->
<!-- Use build_depend for packages you need at compile time: -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- Use buildtool_depend for build tool packages: -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- Use run_depend for packages you need at runtime: -->
<!-- <run_depend>message_runtime</run_depend> -->
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>


<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->

</export>
</package>
43 changes: 43 additions & 0 deletions action_earley_srv/parser_input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
root_48 -> node_19 [1.0]
node_12 -> node_24 node_25 [1.0]
node_13 -> node_26 node_27 [1.0]
node_14 -> node_28 node_29 [1.0]
node_15 -> node_30 node_31 [1.0]
node_16 -> node_32 node_33 [1.0]
node_17 -> node_34 node_35 [1.0]
node_18 -> node_36 node_37 [1.0]
node_19 -> node_38 node_39 [1.0]
node_20 -> node_40 node_41 [1.0]
node_21 -> node_42 node_43 [1.0]
node_22 -> node_44 node_45 [1.0]
node_23 -> node_46 node_47 [1.0]
node_24 -> 'grasp_right' [1.0]
node_25 -> 'twist' [1.0]
node_26 -> 'push' [1.0]
node_27 -> 'twist' [1.0]
node_28 -> node_13 [1.0]
node_29 -> 'neutral' [1.0]
node_30 -> 'grasp_right' [0.553846153846]
node_30 -> node_12 [0.446153846154]
node_31 -> 'pull' [1.0]
node_32 -> 'move' [1.0]
node_33 -> node_15 [0.829787234043]
node_33 -> node_18 [0.170212765957]
node_34 -> node_12 [1.0]
node_35 -> 'ungrasp_right' [1.0]
node_36 -> node_17 [0.744680851064]
node_36 -> node_23 [0.255319148936]
node_37 -> node_16 [1.0]
node_38 -> 'approach' [1.0]
node_39 -> node_18 [0.6]
node_39 -> node_15 [0.0307692307692]
node_39 -> node_21 [0.369230769231]
node_40 -> node_14 [1.0]
node_41 -> node_15 [0.5]
node_41 -> 'move' [0.5]
node_42 -> node_20 [1.0]
node_43 -> node_20 [1.0]
node_44 -> 'pinch' [1.0]
node_45 -> 'twist' [1.0]
node_46 -> node_22 [1.0]
node_47 -> 'unpinch' [1.0]
107 changes: 107 additions & 0 deletions action_earley_srv/scripts/action_earley_srv_node.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#!/usr/bin/env python
import rospy
import rospkg
import nltk
from action_earley_srv.srv import *


def read_induced_grammar(path):
with open(path) as f:
rules = [rule.strip() for rule in f.readlines()]
grammar = nltk.PCFG.fromstring(rules)
return grammar


def predict_next_symbols(grammar, tokens):
def get_production_prob(selected_edge):
# Find the corresponding production rule of the edge, and return its probability
for production in grammar.productions(lhs=selected_edge.lhs()):
if production.rhs() == selected_edge.rhs():
# print selected_edge, production.prob()
return production.prob()

def find_parent(selected_edge):
# Find the parent edges that lead to the selected edge
p_edges = list()
for p_edge in e_chart.edges():
if p_edge.end() == selected_edge.start() and p_edge.nextsym() == selected_edge.lhs():
p_edges.append(p_edge)
return p_edges

def get_edge_prob(selected_edge):
# Compute the probability of the edge by recursion
prob = get_production_prob(selected_edge)
if selected_edge.start() != 0:
parent_prob = 0
for parent_edge in find_parent(selected_edge):
parent_prob += get_edge_prob(parent_edge)
prob *= parent_prob
return prob

symbols = list()
earley_parser = nltk.EarleyChartParser(grammar, trace=0)
e_chart = earley_parser.chart_parse(tokens)
end_edges = list()

for edge in e_chart.edges():
# print edge
if edge.end() == len(tokens):
# Only add terminal nodes
if isinstance(edge.nextsym(), unicode):
symbols.append(edge.nextsym())
end_edges.append(edge)

probs = list()
for end_edge in end_edges:
probs.append(get_edge_prob(end_edge))

# Eliminate duplicate
symbols_no_duplicate = list()
probs_no_duplicate = list()
for s, p in zip(symbols, probs):
if s not in symbols_no_duplicate:
symbols_no_duplicate.append(s)
probs_no_duplicate.append(p)
else:
probs_no_duplicate[symbols_no_duplicate.index(s)] += p

return zip(symbols_no_duplicate, probs_no_duplicate)


def probability(req):
print 'calculate probability'

grammar = read_induced_grammar(rospkg.RosPack().get_path('action_earley_srv') + '/parser_input.txt')
sentence = req.action
print 'input sentence is', sentence

tokens = sentence.split()
prediction = predict_next_symbols(grammar, tokens)

action_label = []
action_prob = []
action_prob_raw = []
for i in range(len(prediction)):
action_label.append(str(prediction[i][0]))
action_prob_raw.append(float(prediction[i][1]))
prob_sum = sum(action_prob_raw)
for i in range(len(prediction)):
action_prob.append(action_prob_raw[i] / prob_sum)

resp = action_earleyResponse()
resp.action_seq = action_label
resp.action_prob = action_prob
resp.success = True
return resp


def actioin_earley_server():
rospy.init_node('action_earley_server')

s = rospy.Service('get_earley_action', action_earley, probability)
print 'earley service is ready'
rospy.spin()


if __name__ == "__main__":
actioin_earley_server()
Loading

0 comments on commit 0dfe5ae

Please sign in to comment.