From 8e226af163caed1d59464603be497ae5fd185b8c Mon Sep 17 00:00:00 2001 From: Rahul Bhadani Date: Mon, 19 Jul 2021 18:00:10 -0700 Subject: [PATCH 1/5] SWIL changes --- onnx2ros/include/NetworkReader.h | 14 ++++++- onnx2ros/launch/control.launch | 25 +++++++++++++ onnx2ros/src/NetworkReader.cpp | 64 +++++++++++++++++++++++++------- 3 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 onnx2ros/launch/control.launch diff --git a/onnx2ros/include/NetworkReader.h b/onnx2ros/include/NetworkReader.h index a6368e4..f47d3a0 100644 --- a/onnx2ros/include/NetworkReader.h +++ b/onnx2ros/include/NetworkReader.h @@ -25,6 +25,14 @@ class BaseReader{ Ort::Experimental::Session session; std::vector input_names, output_names; std::vector> input_shapes; + double HEADWAY_SCALE; + double SPEED_SCALE; + std::string ego_vel_topic; + std::string headway_topic; + std::string relative_vel_topic; + + bool use_leadvel; + public: BaseReader(ros::NodeHandle *nh, std::string onnx_model); @@ -51,8 +59,8 @@ class SynchronousReader : BaseReader{ class PromptReader : BaseReader{ protected: - ros::Subscriber sub_v, sub_lv, sub_h; - geometry_msgs::Twist state_v, state_lv; + ros::Subscriber sub_v, sub_lv, sub_h, sub_relative_vel; + geometry_msgs::Twist state_v, state_lv, state_relative_vel; std_msgs::Float64 state_h; public: @@ -61,6 +69,8 @@ class PromptReader : BaseReader{ void callback_v(const geometry_msgs::Twist& v_msg); void callback_lv(const geometry_msgs::Twist& lv_msg); + + void callback_relative_vel(const geometry_msgs::Twist& rv_msg); void callback_h(const std_msgs::Float64& h_msg); diff --git a/onnx2ros/launch/control.launch b/onnx2ros/launch/control.launch new file mode 100644 index 0000000..eec7d6f --- /dev/null +++ b/onnx2ros/launch/control.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/onnx2ros/src/NetworkReader.cpp b/onnx2ros/src/NetworkReader.cpp index bcef278..b3b31b7 100644 --- a/onnx2ros/src/NetworkReader.cpp +++ b/onnx2ros/src/NetworkReader.cpp @@ -11,8 +11,15 @@ BaseReader::BaseReader(ros::NodeHandle *nh, std::string onnx_model): output_names = session.GetOutputNames(); input_shapes = session.GetInputShapes(); input_shapes[0][0] = 1; - nh->setParam("SPEED_SCALE", 1.0); - nh->setParam("HEADWAY_SCALE", 1.0); + //nh->setParam("SPEED_SCALE", 1.0); + //nh->setParam("HEADWAY_SCALE", 1.0); + + nh->param("SPEED_SCALE", SPEED_SCALE, 1.0); + nh->param("HEADWAY_SCALE", HEADWAY_SCALE, 1.0); + nh->param("ego_vel_topic", ego_vel_topic, std::string("/vel")); + nh->param("relative_vel_topic", relative_vel_topic, std::string("/rel_vel")); + nh->param("headway_topic", headway_topic, std::string("/lead_dist")); + nh->param("use_lead_vel", use_leadvel, false); } double BaseReader::forward(std::vector input_values) { @@ -57,31 +64,60 @@ void SynchronousReader::callback(const geometry_msgs::TwistStampedConstPtr& v_ms PromptReader::PromptReader(ros::NodeHandle *nh, std::string onnx_model): BaseReader(nh, std::move(onnx_model)){ - pub = nh->advertise("v_des", 10); - sub_v = nh->subscribe("vel", 10, &PromptReader::callback_v, this); - sub_lv = nh->subscribe("leader_vel", 10, &PromptReader::callback_lv, this); - sub_h = nh->subscribe("headway_est", 10, &PromptReader::callback_h, this); + pub = nh->advertise("v_des", 1); + sub_v = nh->subscribe(ego_vel_topic, 1, &PromptReader::callback_v, this); + sub_lv = nh->subscribe("leader_vel", 1, &PromptReader::callback_lv, this); + sub_relative_vel = nh->subscribe(relative_vel_topic, 1, &PromptReader::callback_relative_vel, this); + sub_h = nh->subscribe(headway_topic, 1, &PromptReader::callback_h, this); + + + ROS_INFO_STREAM("ego vel topic: "<< ego_vel_topic); + ROS_INFO_STREAM("relative vel topic: "<< relative_vel_topic); + ROS_INFO_STREAM("headway topic: "<< headway_topic); + + ROS_INFO_STREAM("use lead vel: "<< use_leadvel); + ROS_INFO_STREAM("headyway scale: "<< HEADWAY_SCALE); + ROS_INFO_STREAM("speed scale: "<< SPEED_SCALE); } void PromptReader::callback_v(const geometry_msgs::Twist& v_msg) {state_v = v_msg;} void PromptReader::callback_lv(const geometry_msgs::Twist& lv_msg) {state_lv = lv_msg;} +void PromptReader::callback_relative_vel(const geometry_msgs::Twist& relative_vel_msg) {state_relative_vel = relative_vel_msg;} + void PromptReader::callback_h(const std_msgs::Float64& h_msg) {state_h = h_msg;} void PromptReader::publish() { - float speed_scale, headway_scale; - nh->getParam("SPEED_SCALE", speed_scale); - nh->getParam("HEADWAY_SCALE", headway_scale); - float v = (float) state_v.linear.x / speed_scale; - float lv = (float) state_lv.linear.x / speed_scale; - float h = (float) state_h.data / headway_scale; + //float speed_scale, headway_scale; + //nh->getParam("SPEED_SCALE", speed_scale); + //nh->getParam("HEADWAY_SCALE", headway_scale); + + ROS_INFO_STREAM("Current velocity of Ego: "< input_values(input_shapes[0][1]); input_values[0] = v; input_values[1] = lv; input_values[2] = h; - std_msgs::Float64 delta_v; - delta_v.data = PromptReader::forward(input_values); + geometry_msgs::Twist delta_v; + delta_v.linear.x = PromptReader::forward(input_values); pub.publish(delta_v); } From a447ceddfb6ccb96f8cde7a18ca791b6ef3cccb0 Mon Sep 17 00:00:00 2001 From: Rahul Bhadani Date: Mon, 19 Jul 2021 23:55:28 -0700 Subject: [PATCH 2/5] Modification to handle acceleration prediction --- .../19Jul21_RL_accel_output.onnx | Bin 0 -> 52656 bytes onnx2ros/include/NetworkReader.h | 5 +++-- onnx2ros/src/NetworkReader.cpp | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 controllers/19Jul21_RL_accel_output/19Jul21_RL_accel_output.onnx diff --git a/controllers/19Jul21_RL_accel_output/19Jul21_RL_accel_output.onnx b/controllers/19Jul21_RL_accel_output/19Jul21_RL_accel_output.onnx new file mode 100644 index 0000000000000000000000000000000000000000..03bbbcc6ab23858dc6ffd3b364df57315239aaf6 GIT binary patch literal 52656 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 z z%EiA~p#j>p3$bm`ODR9rgKwVhBU@)D@wE(}Q=6MRt8^Trk`9TPy>JVyD>7rP_-?2c z-5nL}mq3m;vv$k#&J1l(3z1!bFe$h*Dn%OUi`bFZYA=~)e?LN#~M$znEdD8ikAgVmjfU{RL zX#BhwHrNqJ3ft4!sqb72f3RMxt#Rg4aV-$Hr8D(=Cf)z@8ic;PA5&cC1eRC+1*N-E z@UG-&OV!LoCtFiAEm1~Q>qfYLxn8WCz7O7RTh7xu;^A#^AD%AwV#>F8wpV&AXxaw~ z@(UzROPBRDvFIJW`l*P+*G@*uF`HnkQUpwo-G}QZ03@v`$L5x$ykV%EdDswJ$_jVH z?DA!-y~6-+26@pGlS*{?n&0|yvaCB5=SrTQDSc5w z&`A#77TMc>$7FGxx}&j_TQZM%Aq?5jBKRqkQN@X@hx;Yjr z6PhJ{pe8k`U1iAZjJ0+?e5UhJ`g+Tn4jt+Z%Cd)e#c&b&Mm5sbAMRwM6fMR+n}Ag< zvmnP<1Inxo$uj5!dTolt5&x`M^PjX29CIDq?|v_L7?BPBc4uitz&mI?-A3km#-u)C zJr3Qx4-V&A3cVgJz$drsIOKsG_fP@+wJ;k8x`XWLD*>fq zg17+C5l>}|OLvbZbYW2eZyTZePmoE7{fcQmH_3?Nk@ z6kHmm8UE*3p~TvRD_Z!s5~A2n`j`IjX6M*PVV3;=N)E^t*>F(*90~j+9E1# zt01S1JuZ0mwcvlf{OE01Ap81k73UV0!t$jB@Nt*}?luggrPKHD_rn(0{9z$i=ZBMK z*+95{VxwpisEO}$<8js2Y^;BfBy`%*nbTTS&_vMS5V=TlncIW(JDrD^72R=h?@FrM z-x;_3{%CqReHO5po`l=AZUm%T_m8Kx4O9tZlnMXIggRhuMcAQkc%C zG~{tuvK!&vO^_89&8~7Q(RE4_L=+rmUfvm6I_Gk!`g3u+wJN^sdX;v3GpBh4D@oot z5YKfPCwA45_C@2~ql;!5dwz+=y?554etI@Ue%^wc4ZWaEVJ-*F+)1~0gpx!shpNlc zc|Kl}&sXMifh?S})q7z;Tc&7keggZ>v*PzwFX*2BQ93$rIenTw21@QchY4mQ!Q6K# zzweU@O4(+tGWjTv`gj0GR20y|V_x)AuL%@tZiuf|#X;hT}P zQnntWs;Vj2rw!CSo^bt|UAW@yajJF?#(<-@;ITsn?P(s!Vo54RZSBh1{nTN=FGK~a zIx(;M8OYhVgZr*9h}T{!G*2Di5cBVm1UQrkZ5+y`CEFuUg0*c5s zHKM5GyZ0&%N@@p@C?F_?ghoXaqyz+}DvKak7oaSH&^CyIxFCpv`R=`lR+cz0xFD!R zElNj}5plt#4ECGOw9{Yh|NHCwxM$9L&ilL#ud-o4u#Q~v7$Md>%AxgVd-@LSBEpL) z^!*CXPjMoS3^|`iQp*MKonq3FHrbIOn=+BoRf>#RPUE=SfiAbqM!)T~r2~W&M045^hElvTkTK z6h@Yq%tL$pIPU^qhnSC%XlcI_YK`I8o32_y;@6PdZR5bCmIwK1HPj$XL^qB=?tW5? zy4#M?>>L4&ayLZb&mX}N-~DL!n--)Cjz$qrZ8#X~Y!cE~1%YQeIV94OXx~ga+Urf8 znPnnL_+#o)QVpG&{pj1Vank5oh`^F>(dh{Vt>j-MJF>4r`MVIb>V*Qvo-CH|*CvAG zH9BH;K|~IZ9YO2#1yGUKNZX#ZK@Hb?(-Ik^3NnYE!cM}zK|n)hU4;db*W{DSV^So~ zlWf-bOC~loK?9i;2wL1vy5>EHHKi2xIb6dLMtZ13X{g>=!??-MP@B1NFjQhk)wPFc z_)|Oh{(2a_Qd13!rT)-#+FUZRZqHQ;UMpOOojpV7j79A{td!}Z=ity!T9dO1r>pLrzV-26D? zp5uZvXY5ge`54F%@Mv+l7m~#XBA#afmqVXRDiz)6SaUj>i0z=!N5yn-g9|lAIW##y z3P1Z+!P4CT8l&AH?BBp?~dQgJ9ESqs4^@Lp>Y7l&)N0Pcd1(&IGfWIH$s-4F0-pfYp zl~f6u6U;!^Lp{DB%>u*GoE)H(;dQz$%)8})PnGUx+plTx>P!g?2QRfMZ8h*uIfCDe z<^!?57Zk-8ahRL{*uKaKgdTkhdJGCcOHDb@40i#^cnJu&-odQ+aGc%Z^9xQaI0*RS z15Dn@S}gJ#!nSoLuvJkFdT+{r)q;bdGw>|yE8)Xjy%GE<3}@ZSj0A>)WoCxU%@vXA zsMr{Jj7t3vO2MdU&T}GKKZR`_f5LPpxq^YI-C)Q$lB}+1x}5vS9-os|k?DS>#A1F4 z>|B$Ns@?w}6?3n{bH65&9Nhr^=yi#8nErtkyPah-R@cG^4^Ql%e8||lV`e6f!}bj#$r>@UuFyr1f??77atl7Wx%XdD>A%gDI>@l#IMsb z*zFgq>B72pu;=&nL@Y+n!=q{peB7q@S8`FQ) z<}WA*-%ff1ggFW)MaAq)P+QCpS_up-EQC`ngi3`va;rQ(Dn%tU67ZC>gp*?v)c^Iy JaJiA0@J|rQPn!S$ literal 0 HcmV?d00001 diff --git a/onnx2ros/include/NetworkReader.h b/onnx2ros/include/NetworkReader.h index f47d3a0..ee2327e 100644 --- a/onnx2ros/include/NetworkReader.h +++ b/onnx2ros/include/NetworkReader.h @@ -27,12 +27,13 @@ class BaseReader{ std::vector> input_shapes; double HEADWAY_SCALE; double SPEED_SCALE; + double T_param; std::string ego_vel_topic; std::string headway_topic; std::string relative_vel_topic; - + bool use_leadvel; - + bool use_accel_predict; public: BaseReader(ros::NodeHandle *nh, std::string onnx_model); diff --git a/onnx2ros/src/NetworkReader.cpp b/onnx2ros/src/NetworkReader.cpp index b3b31b7..1b1ab79 100644 --- a/onnx2ros/src/NetworkReader.cpp +++ b/onnx2ros/src/NetworkReader.cpp @@ -20,6 +20,8 @@ BaseReader::BaseReader(ros::NodeHandle *nh, std::string onnx_model): nh->param("relative_vel_topic", relative_vel_topic, std::string("/rel_vel")); nh->param("headway_topic", headway_topic, std::string("/lead_dist")); nh->param("use_lead_vel", use_leadvel, false); + nh->param("T", T_param, 0.6); + nh->param("use_accel_predict", use_accel_predict, false); } double BaseReader::forward(std::vector input_values) { @@ -78,6 +80,12 @@ PromptReader::PromptReader(ros::NodeHandle *nh, std::string onnx_model): ROS_INFO_STREAM("use lead vel: "<< use_leadvel); ROS_INFO_STREAM("headyway scale: "<< HEADWAY_SCALE); ROS_INFO_STREAM("speed scale: "<< SPEED_SCALE); + + if (use_accel_predict) + { + ROS_INFO_STREAM("We will predict acceleration first. Acceleration will be on linear.z component"); + } + ROS_INFO_STREAM("T Parameter is :"< Date: Wed, 21 Jul 2021 13:37:11 -0700 Subject: [PATCH 3/5] deleted observer --- observers/gaussian_observer/CMakeLists.txt | 206 --------------------- observers/gaussian_observer/package.xml | 68 ------- observers/ideal_observer/CMakeLists.txt | 206 --------------------- observers/ideal_observer/package.xml | 68 ------- 4 files changed, 548 deletions(-) delete mode 100755 observers/gaussian_observer/CMakeLists.txt delete mode 100755 observers/gaussian_observer/package.xml delete mode 100755 observers/ideal_observer/CMakeLists.txt delete mode 100755 observers/ideal_observer/package.xml diff --git a/observers/gaussian_observer/CMakeLists.txt b/observers/gaussian_observer/CMakeLists.txt deleted file mode 100755 index c4e1407..0000000 --- a/observers/gaussian_observer/CMakeLists.txt +++ /dev/null @@ -1,206 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(gaussian_observer) - -## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) - -## 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 - roscpp - rospy - std_msgs -) - -## 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 exec_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 exec_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 -# Service1.srv -# Service2.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 exec_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 your 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 gaussian_observer -# CATKIN_DEPENDS roscpp 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 - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/gaussian_observer.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(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/gaussian_observer_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_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 -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_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_gaussian_observer.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) diff --git a/observers/gaussian_observer/package.xml b/observers/gaussian_observer/package.xml deleted file mode 100755 index 1b9c4c6..0000000 --- a/observers/gaussian_observer/package.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - gaussian_observer - 0.0.0 - The gaussian_observer package - - - - - fangyu - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - catkin - roscpp - rospy - std_msgs - roscpp - rospy - std_msgs - roscpp - rospy - std_msgs - - - - - - - - diff --git a/observers/ideal_observer/CMakeLists.txt b/observers/ideal_observer/CMakeLists.txt deleted file mode 100755 index 13afc1c..0000000 --- a/observers/ideal_observer/CMakeLists.txt +++ /dev/null @@ -1,206 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(ideal_observer) - -## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) - -## 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 - roscpp - rospy - std_msgs -) - -## 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 exec_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 exec_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 -# Service1.srv -# Service2.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 exec_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 your 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 ideal_observer -# CATKIN_DEPENDS roscpp 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 - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/ideal_observer.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(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/ideal_observer_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_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 -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_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_ideal_observer.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) diff --git a/observers/ideal_observer/package.xml b/observers/ideal_observer/package.xml deleted file mode 100755 index 0fd8e4f..0000000 --- a/observers/ideal_observer/package.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - ideal_observer - 0.0.0 - The ideal_observer package - - - - - fangyu - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - catkin - roscpp - rospy - std_msgs - roscpp - rospy - std_msgs - roscpp - rospy - std_msgs - - - - - - - - From 81eee964168bed5c60fbdd708e9304156e038fd8 Mon Sep 17 00:00:00 2001 From: Rahul Bhadani Date: Wed, 21 Jul 2021 14:04:18 -0700 Subject: [PATCH 4/5] Disable print statement --- onnx2ros/src/NetworkReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onnx2ros/src/NetworkReader.cpp b/onnx2ros/src/NetworkReader.cpp index 1b1ab79..dd0167f 100644 --- a/onnx2ros/src/NetworkReader.cpp +++ b/onnx2ros/src/NetworkReader.cpp @@ -30,7 +30,7 @@ double BaseReader::forward(std::vector input_values) { input_values.data(), input_values.size(), input_shapes[0])); auto output_tensors = session.Run(input_names, input_tensors, output_names); const auto *output_values = output_tensors[0].GetTensorData(); - ROS_INFO("%.8f %.8f %.8f > %.8f", input_values[0], input_values[1], input_values[2], output_values[0]); + //ROS_INFO("%.8f %.8f %.8f > %.8f", input_values[0], input_values[1], input_values[2], output_values[0]); return output_values[0]; } From 5e390163a94eed83decf102625a4a8811716b99e Mon Sep 17 00:00:00 2001 From: Rahul Bhadani Date: Wed, 21 Jul 2021 14:12:23 -0700 Subject: [PATCH 5/5] Disable print statement --- onnx2ros/src/NetworkReader.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onnx2ros/src/NetworkReader.cpp b/onnx2ros/src/NetworkReader.cpp index dd0167f..78e352c 100644 --- a/onnx2ros/src/NetworkReader.cpp +++ b/onnx2ros/src/NetworkReader.cpp @@ -101,7 +101,7 @@ void PromptReader::publish() { //nh->getParam("SPEED_SCALE", speed_scale); //nh->getParam("HEADWAY_SCALE", headway_scale); - ROS_INFO_STREAM("Current velocity of Ego: "< input_values(input_shapes[0][1]); input_values[0] = v;