From 11e628300485e19323abd5e7544499af8483429f Mon Sep 17 00:00:00 2001 From: Walter Fetter Lages Date: Sun, 6 May 2018 00:50:37 -0300 Subject: [PATCH 1/1] 2018-03-01 --- .gitignore | 51 +++ twil/CMakeLists.txt | 4 + twil/package.xml | 59 +++ twil_bringup/CMakeLists.txt | 74 ++++ ...ini_twil_dynamics_pid_backstepping_control.yaml | 47 ++ .../mini_twil_dynamics_pid_control.yaml | 37 ++ .../controllers/mini_twil_effort_control.yaml | 12 + .../mini_twil_joint_velocity_control.yaml | 27 ++ .../controllers/mini_twil_linearizing_control.yaml | 21 + .../mini_twil_twist_pid_backstepping_control.yaml | 41 ++ .../controllers/mini_twil_twist_pid_control.yaml | 26 ++ .../twil_dynamics_pid_backstepping_control.yaml | 47 ++ .../controllers/twil_dynamics_pid_control.yaml | 37 ++ .../config/controllers/twil_effort_control.yaml | 12 + .../controllers/twil_joint_velocity_control.yaml | 27 ++ .../controllers/twil_linearizing_control.yaml | 20 + .../twil_twist_pid_backstepping_control.yaml | 39 ++ .../config/controllers/twil_twist_pid_control.yaml | 27 ++ twil_bringup/config/electronics/mini_twil_hw.yaml | 21 + twil_bringup/config/electronics/twil_hw.yaml | 20 + twil_bringup/config/mechanics/mini_twil_specs.yaml | 4 + twil_bringup/config/mechanics/twil_specs.yaml | 4 + twil_bringup/include/twil_bringup/joy.h | 24 ++ .../dynamics_pid_backstepping_controller.launch | 22 + .../controllers/dynamics_pid_controller.launch | 22 + .../controllers/joint_effort_controller.launch | 22 + .../controllers/joint_velocity_controller.launch | 22 + .../controllers/linearizing_controller.launch | 22 + .../twist_pid_backstepping_controller.launch | 24 ++ .../launch/controllers/twist_pid_controller.launch | 22 + twil_bringup/launch/joystick.launch | 30 ++ twil_bringup/launch/navigation/move_base.launch | 14 + twil_bringup/launch/robot_hw.launch | 21 + .../trajectory/mini_twil_circle_trajectory.launch | 17 + .../trajectory/mini_twil_eight_trajectory.launch | 17 + .../trajectory/twil_circle_trajectory.launch | 17 + .../launch/trajectory/twil_eight_trajectory.launch | 18 + twil_bringup/package.xml | 72 ++++ twil_bringup/src/joy.cpp | 50 +++ twil_controllers/CMakeLists.txt | 186 ++++++++ twil_controllers/README | 11 + .../twil_controllers/cart_linearizing_controller.h | 84 ++++ .../dynamics_pid_backstepping_controller.h | 104 +++++ .../twil_controllers/dynamics_pid_controller.h | 92 ++++ .../include/twil_controllers/non_smooth_control.h | 122 ++++++ .../nonlinear_backstepping_controller.h | 5 + .../include/twil_controllers/odometry_tool.h | 73 ++++ .../include/twil_controllers/pose_tool.h | 13 + .../state_feedback_linearization.h | 89 ++++ .../twist_pid_backstepping_controller.h | 105 +++++ .../twil_controllers/twist_pid_controller.h | 90 ++++ .../twil_controllers/velocity_transformation.h | 91 ++++ twil_controllers/package.xml | 77 ++++ twil_controllers/scripts/pub_array.sh | 1 + .../src/cart_linearizing_controller.cpp | 274 ++++++++++++ .../src/dynamics_pid_backstepping_controller.cpp | 474 +++++++++++++++++++++ twil_controllers/src/dynamics_pid_controller.cpp | 342 +++++++++++++++ .../src/nonlinear_backstepping_controller.cpp | 1 + twil_controllers/src/odometry_tool.cpp | 130 ++++++ twil_controllers/src/pose_tool.cpp | 45 ++ .../src/twist_pid_backstepping_controller.cpp | 421 ++++++++++++++++++ twil_controllers/src/twist_pid_controller.cpp | 292 +++++++++++++ twil_controllers/twil_controllers_plugins.xml | 39 ++ twil_description/CMakeLists.txt | 156 +++++++ twil_description/bkp/twil_description.tar.gz | Bin 0 -> 154801 bytes twil_description/meshes/battery_bosch_12v.stl | Bin 0 -> 57284 bytes twil_description/meshes/castor_base.stl | Bin 0 -> 17484 bytes twil_description/meshes/castor_support.stl | Bin 0 -> 20984 bytes twil_description/meshes/castor_wheel.stl | Bin 0 -> 40184 bytes twil_description/meshes/chassis.stl | Bin 0 -> 153284 bytes twil_description/meshes/cpu.stl | Bin 0 -> 46884 bytes twil_description/meshes/fixed_wheel.stl | Bin 0 -> 31184 bytes twil_description/meshes/fixed_wheel_support.stl | Bin 0 -> 76584 bytes twil_description/meshes/left_wheel_support.stl | Bin 0 -> 76584 bytes twil_description/meshes/right_wheel_support.stl | Bin 0 -> 76584 bytes twil_description/package.xml | 54 +++ .../xacro/battery_bosch_12v.urdf.xacro | 42 ++ twil_description/xacro/castor_base.urdf.xacro | 44 ++ twil_description/xacro/castor_support.urdf.xacro | 42 ++ twil_description/xacro/castor_wheel.urdf.xacro | 43 ++ twil_description/xacro/chassis.urdf.xacro | 43 ++ twil_description/xacro/cpu.urdf.xacro | 42 ++ twil_description/xacro/eurocard.urdf.xacro | 47 ++ twil_description/xacro/fixed_wheel.urdf.xacro | 52 +++ .../xacro/fixed_wheel_support.urdf.xacro | 42 ++ twil_description/xacro/twil.urdf.xacro | 113 +++++ twil_description/xacro/twil_real.urdf.xacro | 98 +++++ twil_hw/CMakeLists.txt | 85 ++++ twil_hw/include/twil_hw/twil_hw.h | 47 ++ twil_hw/package.xml | 62 +++ twil_hw/scripts/export_motor_test.sh | 21 + twil_hw/src/twil_hw.cpp | 181 ++++++++ twil_hw/src/twil_hw_node.cpp | 68 +++ twil_trajectories/CMakeLists.txt | 184 ++++++++ .../include/twil_trajectories/circle_path.h | 56 +++ .../include/twil_trajectories/eight_path.h | 40 ++ twil_trajectories/package.xml | 58 +++ twil_trajectories/src/circle_path.cpp | 51 +++ twil_trajectories/src/circle_trajectory.cpp | 100 +++++ twil_trajectories/src/eight_path.cpp | 26 ++ twil_trajectories/src/eight_trajectory.cpp | 94 ++++ twil_trajectories/src/pose2d_stamp.cpp | 75 ++++ 102 files changed, 6220 insertions(+) create mode 100644 .gitignore create mode 100644 twil/CMakeLists.txt create mode 100644 twil/package.xml create mode 100644 twil_bringup/CMakeLists.txt create mode 100644 twil_bringup/config/controllers/mini_twil_dynamics_pid_backstepping_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_dynamics_pid_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_effort_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_joint_velocity_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_linearizing_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_twist_pid_backstepping_control.yaml create mode 100644 twil_bringup/config/controllers/mini_twil_twist_pid_control.yaml create mode 100644 twil_bringup/config/controllers/twil_dynamics_pid_backstepping_control.yaml create mode 100644 twil_bringup/config/controllers/twil_dynamics_pid_control.yaml create mode 100644 twil_bringup/config/controllers/twil_effort_control.yaml create mode 100644 twil_bringup/config/controllers/twil_joint_velocity_control.yaml create mode 100644 twil_bringup/config/controllers/twil_linearizing_control.yaml create mode 100644 twil_bringup/config/controllers/twil_twist_pid_backstepping_control.yaml create mode 100644 twil_bringup/config/controllers/twil_twist_pid_control.yaml create mode 100644 twil_bringup/config/electronics/mini_twil_hw.yaml create mode 100644 twil_bringup/config/electronics/twil_hw.yaml create mode 100644 twil_bringup/config/mechanics/mini_twil_specs.yaml create mode 100644 twil_bringup/config/mechanics/twil_specs.yaml create mode 100644 twil_bringup/include/twil_bringup/joy.h create mode 100644 twil_bringup/launch/controllers/dynamics_pid_backstepping_controller.launch create mode 100644 twil_bringup/launch/controllers/dynamics_pid_controller.launch create mode 100644 twil_bringup/launch/controllers/joint_effort_controller.launch create mode 100644 twil_bringup/launch/controllers/joint_velocity_controller.launch create mode 100644 twil_bringup/launch/controllers/linearizing_controller.launch create mode 100644 twil_bringup/launch/controllers/twist_pid_backstepping_controller.launch create mode 100644 twil_bringup/launch/controllers/twist_pid_controller.launch create mode 100644 twil_bringup/launch/joystick.launch create mode 100644 twil_bringup/launch/navigation/move_base.launch create mode 100644 twil_bringup/launch/robot_hw.launch create mode 100644 twil_bringup/launch/trajectory/mini_twil_circle_trajectory.launch create mode 100644 twil_bringup/launch/trajectory/mini_twil_eight_trajectory.launch create mode 100644 twil_bringup/launch/trajectory/twil_circle_trajectory.launch create mode 100644 twil_bringup/launch/trajectory/twil_eight_trajectory.launch create mode 100644 twil_bringup/package.xml create mode 100644 twil_bringup/src/joy.cpp create mode 100644 twil_controllers/CMakeLists.txt create mode 100644 twil_controllers/README create mode 100644 twil_controllers/include/twil_controllers/cart_linearizing_controller.h create mode 100644 twil_controllers/include/twil_controllers/dynamics_pid_backstepping_controller.h create mode 100644 twil_controllers/include/twil_controllers/dynamics_pid_controller.h create mode 100644 twil_controllers/include/twil_controllers/non_smooth_control.h create mode 100644 twil_controllers/include/twil_controllers/nonlinear_backstepping_controller.h create mode 100644 twil_controllers/include/twil_controllers/odometry_tool.h create mode 100644 twil_controllers/include/twil_controllers/pose_tool.h create mode 100644 twil_controllers/include/twil_controllers/state_feedback_linearization.h create mode 100644 twil_controllers/include/twil_controllers/twist_pid_backstepping_controller.h create mode 100644 twil_controllers/include/twil_controllers/twist_pid_controller.h create mode 100644 twil_controllers/include/twil_controllers/velocity_transformation.h create mode 100644 twil_controllers/package.xml create mode 100755 twil_controllers/scripts/pub_array.sh create mode 100644 twil_controllers/src/cart_linearizing_controller.cpp create mode 100644 twil_controllers/src/dynamics_pid_backstepping_controller.cpp create mode 100644 twil_controllers/src/dynamics_pid_controller.cpp create mode 100644 twil_controllers/src/nonlinear_backstepping_controller.cpp create mode 100644 twil_controllers/src/odometry_tool.cpp create mode 100644 twil_controllers/src/pose_tool.cpp create mode 100644 twil_controllers/src/twist_pid_backstepping_controller.cpp create mode 100644 twil_controllers/src/twist_pid_controller.cpp create mode 100644 twil_controllers/twil_controllers_plugins.xml create mode 100644 twil_description/CMakeLists.txt create mode 100644 twil_description/bkp/twil_description.tar.gz create mode 100644 twil_description/meshes/battery_bosch_12v.stl create mode 100644 twil_description/meshes/castor_base.stl create mode 100644 twil_description/meshes/castor_support.stl create mode 100644 twil_description/meshes/castor_wheel.stl create mode 100644 twil_description/meshes/chassis.stl create mode 100644 twil_description/meshes/cpu.stl create mode 100644 twil_description/meshes/fixed_wheel.stl create mode 100644 twil_description/meshes/fixed_wheel_support.stl create mode 100644 twil_description/meshes/left_wheel_support.stl create mode 100644 twil_description/meshes/right_wheel_support.stl create mode 100644 twil_description/package.xml create mode 100644 twil_description/xacro/battery_bosch_12v.urdf.xacro create mode 100644 twil_description/xacro/castor_base.urdf.xacro create mode 100644 twil_description/xacro/castor_support.urdf.xacro create mode 100644 twil_description/xacro/castor_wheel.urdf.xacro create mode 100644 twil_description/xacro/chassis.urdf.xacro create mode 100644 twil_description/xacro/cpu.urdf.xacro create mode 100644 twil_description/xacro/eurocard.urdf.xacro create mode 100644 twil_description/xacro/fixed_wheel.urdf.xacro create mode 100644 twil_description/xacro/fixed_wheel_support.urdf.xacro create mode 100644 twil_description/xacro/twil.urdf.xacro create mode 100644 twil_description/xacro/twil_real.urdf.xacro create mode 100644 twil_hw/CMakeLists.txt create mode 100644 twil_hw/include/twil_hw/twil_hw.h create mode 100644 twil_hw/package.xml create mode 100755 twil_hw/scripts/export_motor_test.sh create mode 100644 twil_hw/src/twil_hw.cpp create mode 100644 twil_hw/src/twil_hw_node.cpp create mode 100644 twil_trajectories/CMakeLists.txt create mode 100644 twil_trajectories/include/twil_trajectories/circle_path.h create mode 100644 twil_trajectories/include/twil_trajectories/eight_path.h create mode 100644 twil_trajectories/package.xml create mode 100644 twil_trajectories/src/circle_path.cpp create mode 100644 twil_trajectories/src/circle_trajectory.cpp create mode 100644 twil_trajectories/src/eight_path.cpp create mode 100644 twil_trajectories/src/eight_trajectory.cpp create mode 100644 twil_trajectories/src/pose2d_stamp.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1edc29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +devel/ +logs/ +build/ +bin/ +lib/ +msg_gen/ +srv_gen/ +msg/*Action.msg +msg/*ActionFeedback.msg +msg/*ActionGoal.msg +msg/*ActionResult.msg +msg/*Feedback.msg +msg/*Goal.msg +msg/*Result.msg +msg/_*.py +build_isolated/ +devel_isolated/ + +# Generated by dynamic reconfigure +*.cfgc +/cfg/cpp/ +/cfg/*.py + +# Ignore generated docs +#*.dox +*.wikidoc + +# eclipse stuff +.project +.cproject + +# qcreator stuff +CMakeLists.txt.user + +srv/_*.py +*.pcd +*.pyc +qtcreator-* +*.user + +/planning/cfg +/planning/docs +/planning/src + +*~ + +# Emacs +.#* + +# Catkin custom files +CATKIN_IGNORE diff --git a/twil/CMakeLists.txt b/twil/CMakeLists.txt new file mode 100644 index 0000000..ccd3cdb --- /dev/null +++ b/twil/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil) +find_package(catkin REQUIRED) +catkin_metapackage() diff --git a/twil/package.xml b/twil/package.xml new file mode 100644 index 0000000..9724f87 --- /dev/null +++ b/twil/package.xml @@ -0,0 +1,59 @@ + + + twil + 2.0.0 + The twil package + + + + + Walter Fetter Lages + + + + + + GPLv3 + + + + + + + http://www.ece.ufrgs.br/~fetter/twil + + + + + + Walter Fetter Lages + + + + + + + + + + + + + catkin + + twil_description + twil_bringup + twil_controllers + twil_hw + + + + + + + + + + + + diff --git a/twil_bringup/CMakeLists.txt b/twil_bringup/CMakeLists.txt new file mode 100644 index 0000000..2a7e313 --- /dev/null +++ b/twil_bringup/CMakeLists.txt @@ -0,0 +1,74 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil_bringup) + +add_definitions(-std=c++11) + +## Find catkin macros and libraries +find_package(catkin REQUIRED COMPONENTS + controller_interface + controller_manager + hardware_interface + joint_state_controller + roscpp + rospy + std_msgs + sensor_msgs + trajectory_msgs + geometry_msgs + ) +find_package(twil_hw REQUIRED) + +## System dependencies are found with CMake's conventions +find_package(Boost REQUIRED COMPONENTS system) + +################################### +## catkin specific configuration ## +################################### +catkin_package( + INCLUDE_DIRS include + LIBRARIES twil_bringup + CATKIN_DEPENDS controller_interface controller_manager hardware_interface joint_state_controller roscpp rospy std_msgs + DEPENDS system_lib + ) + +########### +## Build ## +########### + +include_directories( + include + ${catkin_INCLUDE_DIRS} + ${twil_hw_INCLUDE_DIRS} + ${AIC_LIB_ROOT_DIR}/include + ) + +add_executable(twil_joystick_node src/joy.cpp) +target_link_libraries(twil_joystick_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 twil_joystick_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 +# ) diff --git a/twil_bringup/config/controllers/mini_twil_dynamics_pid_backstepping_control.yaml b/twil_bringup/config/controllers/mini_twil_dynamics_pid_backstepping_control.yaml new file mode 100644 index 0000000..6070cec --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_dynamics_pid_backstepping_control.yaml @@ -0,0 +1,47 @@ +mini_twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + dynamics_pid_backstepping_controller: + type: twil_controllers/DynamicsPIDBacksteppingController + joints: + - left_wheel_joint + - right_wheel_joint + + feedback_linearization: + A: -7.969445e+00 + B: -1.876616e-02 + C: 3.454858e-01 + D: -9.405481e+00 + E: -5.987630e+00 + F: 3.472006e+00 + + linear_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 12000 + antiwindup: false + + angular_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 12000 + antiwindup: false + + take: 0 + + nonsmooth_controller: + lambda1: 0 + lambda2: 1 + lambda3: 0.5 + gamma1: 1 + gamma2: 1 + update_ratio: 1 + + x_ini: 0.0 + y_ini: 0.0 + th_ini: 0.0 diff --git a/twil_bringup/config/controllers/mini_twil_dynamics_pid_control.yaml b/twil_bringup/config/controllers/mini_twil_dynamics_pid_control.yaml new file mode 100644 index 0000000..a4b4084 --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_dynamics_pid_control.yaml @@ -0,0 +1,37 @@ +mini_twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + dynamics_pid_controller: + type: twil_controllers/DynamicsPIDController + joints: + - left_wheel_joint + - right_wheel_joint + + feedback_linearization: + A: -7.969445e+00 + B: -1.876616e-02 + C: 3.454858e-01 + D: -9.405481e+00 + E: -5.987630e+00 + F: 3.472006e+00 + + velocity_filter_taps: 5 + + linear_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 12000 + antiwindup: false + + angular_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 12000 + antiwindup: false + + + diff --git a/twil_bringup/config/controllers/mini_twil_effort_control.yaml b/twil_bringup/config/controllers/mini_twil_effort_control.yaml new file mode 100644 index 0000000..4f77130 --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_effort_control.yaml @@ -0,0 +1,12 @@ +mini_twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + left_wheel_joint_effort_controller: + type: effort_controllers/JointEffortController + joint: left_wheel_joint + + right_wheel_joint_effort_controller: + type: effort_controllers/JointEffortController + joint: right_wheel_joint diff --git a/twil_bringup/config/controllers/mini_twil_joint_velocity_control.yaml b/twil_bringup/config/controllers/mini_twil_joint_velocity_control.yaml new file mode 100644 index 0000000..68491d1 --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_joint_velocity_control.yaml @@ -0,0 +1,27 @@ +mini_twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + left_wheel_joint_velocity_controller: + type: effort_controllers/JointVelocityController + joint: left_wheel_joint + pid: + p: 0.5476848 + i: 4.457272 + d: 0.0 + i_clamp: 12000 + antiwindup: False + + right_wheel_joint_velocity_controller: + type: effort_controllers/JointVelocityController + joint: right_wheel_joint + pid: + p: 0.5147369 + i: 4.295548 + d: 0.0 + i_clamp: 12000 + antiwindup: False + + diff --git a/twil_bringup/config/controllers/mini_twil_linearizing_control.yaml b/twil_bringup/config/controllers/mini_twil_linearizing_control.yaml new file mode 100644 index 0000000..604ec8f --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_linearizing_control.yaml @@ -0,0 +1,21 @@ +mini_twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + cart_linearizing_controller: + type: twil_controllers/CartLinearizingController + joints: + - left_wheel_joint + - right_wheel_joint + + velocity_filter_taps: 5 + + feedback_linearization: + A: -7.969445e+00 + B: -1.876616e-02 + C: 3.454858e-01 + D: -9.405481e+00 + E: -5.987630e+00 + F: 3.472006e+00 + diff --git a/twil_bringup/config/controllers/mini_twil_twist_pid_backstepping_control.yaml b/twil_bringup/config/controllers/mini_twil_twist_pid_backstepping_control.yaml new file mode 100644 index 0000000..29563b2 --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_twist_pid_backstepping_control.yaml @@ -0,0 +1,41 @@ +mini_twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + twist_pid_backstepping_controller: + type: twil_controllers/TwistPIDBacksteppingController + joints: + - left_wheel_joint + - right_wheel_joint + + left_wheel_joint_pid_parameters: + p: 2.455561e-01 + i: 1.814526e+00 + d: 0 + i_clamp: 12000 + antiwindup: true + + right_wheel_joint_pid_parameters: + p: 1.751695e-01 + i: 1.553672e+00 + d: 0 + i_clamp: 12000 + antiwindup: False + + velocity_filter_taps: 3 + take: 0 + + + nonsmooth_controller: + lambda1: 1000 + lambda2: 10 + lambda3: 0.1 + gamma1: 0.8 + gamma2: 0.8 + update_ratio: 1 + + x_ini: 0.0 + y_ini: 0.0 + th_ini: 0.0 diff --git a/twil_bringup/config/controllers/mini_twil_twist_pid_control.yaml b/twil_bringup/config/controllers/mini_twil_twist_pid_control.yaml new file mode 100644 index 0000000..c12f774 --- /dev/null +++ b/twil_bringup/config/controllers/mini_twil_twist_pid_control.yaml @@ -0,0 +1,26 @@ +mini_twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 25 + + twist_pid_controller: + type: twil_controllers/TwistPIDController + joints: + - left_wheel_joint + - right_wheel_joint + + velocity_filter_taps: 2 + + left_wheel_joint_pid_parameters: + p: 2.455561e-01 + i: 1.814526e+00 + d: 0 + i_clamp: 12000 + antiwindup: True + + right_wheel_joint_pid_parameters: + p: 1.751695e-01 + i: 1.553672e+00 + d: 0 + i_clamp: 12000 + antiwindup: True diff --git a/twil_bringup/config/controllers/twil_dynamics_pid_backstepping_control.yaml b/twil_bringup/config/controllers/twil_dynamics_pid_backstepping_control.yaml new file mode 100644 index 0000000..9724795 --- /dev/null +++ b/twil_bringup/config/controllers/twil_dynamics_pid_backstepping_control.yaml @@ -0,0 +1,47 @@ +twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + dynamics_pid_backstepping_controller: + type: twil_controllers/DynamicsPIDBacksteppingController + joints: + - left_wheel_joint + - right_wheel_joint + + feedback_linearization: + A: -14.778419353034346 + B: 0.009650740074675 + C: 0.133440027500232 + D: -9.731786200206576 + E: -13.056880796631793 + F: 0.666386266954281 + + linear_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 120000 + antiwindup: false + + angular_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 120000 + antiwindup: false + + take: 0 + + nonsmooth_controller: + lambda1: 1000 + lambda2: 10 + lambda3: 0.00001 + gamma1: 1 + gamma2: 1 + update_ratio: 1 + + x_ini: 0.0 + y_ini: 0.0 + th_ini: 0 diff --git a/twil_bringup/config/controllers/twil_dynamics_pid_control.yaml b/twil_bringup/config/controllers/twil_dynamics_pid_control.yaml new file mode 100644 index 0000000..3be6e84 --- /dev/null +++ b/twil_bringup/config/controllers/twil_dynamics_pid_control.yaml @@ -0,0 +1,37 @@ +twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + dynamics_pid_controller: + type: twil_controllers/DynamicsPIDController + joints: + - left_wheel_joint + - right_wheel_joint + + feedback_linearization: + A: -14.778419353034346 + B: 0.009650740074675 + C: 0.133440027500232 + D: -9.731786200206576 + E: -13.056880796631793 + F: 0.666386266954281 + + velocity_filter_taps: 10 + + linear_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 120000 + antiwindup: True + + angular_velocity_pid_parameters: + p: 16 + i: 64 + d: 0.0 + i_clamp: 120000 + antiwindup: True + + + diff --git a/twil_bringup/config/controllers/twil_effort_control.yaml b/twil_bringup/config/controllers/twil_effort_control.yaml new file mode 100644 index 0000000..ffb0b43 --- /dev/null +++ b/twil_bringup/config/controllers/twil_effort_control.yaml @@ -0,0 +1,12 @@ +twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + left_wheel_joint_effort_controller: + type: effort_controllers/JointEffortController + joint: left_wheel_joint + + right_wheel_joint_effort_controller: + type: effort_controllers/JointEffortController + joint: right_wheel_joint diff --git a/twil_bringup/config/controllers/twil_joint_velocity_control.yaml b/twil_bringup/config/controllers/twil_joint_velocity_control.yaml new file mode 100644 index 0000000..1ec7199 --- /dev/null +++ b/twil_bringup/config/controllers/twil_joint_velocity_control.yaml @@ -0,0 +1,27 @@ +twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + left_wheel_joint_velocity_controller: + type: effort_controllers/JointVelocityController + joint: left_wheel_joint + pid: + p: 4.622505e-01 + i: 6.617994e+01 + d: 0 + i_clamp: 120000 + antiwindup: false + + right_wheel_joint_velocity_controller: + type: effort_controllers/JointVelocityController + joint: right_wheel_joint + pid: + p: 1.158977e+00 + i: 7.266055e+01 + d: 0 + i_clamp: 120000 + antiwindup: false + + diff --git a/twil_bringup/config/controllers/twil_linearizing_control.yaml b/twil_bringup/config/controllers/twil_linearizing_control.yaml new file mode 100644 index 0000000..16d8ec7 --- /dev/null +++ b/twil_bringup/config/controllers/twil_linearizing_control.yaml @@ -0,0 +1,20 @@ +twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + cart_linearizing_controller: + type: twil_controllers/CartLinearizingController + joints: + - left_wheel_joint + - right_wheel_joint + + velocity_filter_taps: 5 + + feedback_linearization: + A: -14.778419353034346 + B: 0.009650740074675 + C: 0.133440027500232 + D: -9.731786200206576 + E: -13.056880796631793 + F: 0.666386266954281 diff --git a/twil_bringup/config/controllers/twil_twist_pid_backstepping_control.yaml b/twil_bringup/config/controllers/twil_twist_pid_backstepping_control.yaml new file mode 100644 index 0000000..9d5b20d --- /dev/null +++ b/twil_bringup/config/controllers/twil_twist_pid_backstepping_control.yaml @@ -0,0 +1,39 @@ +twil: + + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + twist_pid_backstepping_controller: + type: twil_controllers/TwistPIDBacksteppingController + joints: + - left_wheel_joint + - right_wheel_joint + + left_wheel_joint_pid_parameters: + p: 4.622505e-01 + i: 6.617994e+01 + d: 0 + i_clamp: 120000 + antiwindup: false + + right_wheel_joint_pid_parameters: + p: 1.158977e+00 + i: 7.266055e+01 + d: 0 + i_clamp: 1000 + antiwindup: false + + take: 1 + + nonsmooth_controller: + lambda1: 1000 + lambda2: 10 + lambda3: 0.00001 + gamma1: 1 + gamma2: 1 + update_ratio: 1 + + x_ini: 0.0 + y_ini: 0.0 + th_ini: 0.0 diff --git a/twil_bringup/config/controllers/twil_twist_pid_control.yaml b/twil_bringup/config/controllers/twil_twist_pid_control.yaml new file mode 100644 index 0000000..bd48c43 --- /dev/null +++ b/twil_bringup/config/controllers/twil_twist_pid_control.yaml @@ -0,0 +1,27 @@ +twil: + joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 100 + + twist_pid_controller: + type: twil_controllers/TwistPIDController + joints: + - left_wheel_joint + - right_wheel_joint + + velocity_filter_taps: 1 + + + left_wheel_joint_pid_parameters: + p: 4.622505e-01 + i: 6.617994e+01 + d: 0 + i_clamp: 120000 + antiwindup: False + + right_wheel_joint_pid_parameters: + p: 1.158977e+00 + i: 7.266055e+01 + d: 0 + i_clamp: 120000 + antiwindup: False diff --git a/twil_bringup/config/electronics/mini_twil_hw.yaml b/twil_bringup/config/electronics/mini_twil_hw.yaml new file mode 100644 index 0000000..d8465fd --- /dev/null +++ b/twil_bringup/config/electronics/mini_twil_hw.yaml @@ -0,0 +1,21 @@ +mini_twil: + + left_wheel_joint: + aic_com_device: 2 + can_bus_number: 0 + can_iface: 0 + can_id_number: 2 + dead_zone_compensation: False + neg_dead_zone: 0 + pos_dead_zone: 0 + + right_wheel_joint: + aic_com_device: 2 + can_bus_number: 0 + can_iface: 0 + can_id_number: 3 + dead_zone_compensation: False + neg_dead_zone: 0 + pos_dead_zone: 0 + + control_loop_rate: 25 diff --git a/twil_bringup/config/electronics/twil_hw.yaml b/twil_bringup/config/electronics/twil_hw.yaml new file mode 100644 index 0000000..f034707 --- /dev/null +++ b/twil_bringup/config/electronics/twil_hw.yaml @@ -0,0 +1,20 @@ +twil: + + left_wheel_joint: + + aic_com_device: 1 + serial_port: /dev/ttyUSB0 + dead_zone_compensation: False + neg_dead_zone: -4.9 + pos_dead_zone: 3.4 + + right_wheel_joint: + + aic_com_device: 1 + serial_port: /dev/ttyUSB1 + dead_zone_compensation: False + neg_dead_zone: -3.3 + pos_dead_zone: 3.7 + + control_loop_rate: 100 + diff --git a/twil_bringup/config/mechanics/mini_twil_specs.yaml b/twil_bringup/config/mechanics/mini_twil_specs.yaml new file mode 100644 index 0000000..3b22b69 --- /dev/null +++ b/twil_bringup/config/mechanics/mini_twil_specs.yaml @@ -0,0 +1,4 @@ +mini_twil: + + wheel_radius: 0.0325 + robot_baseline: 0.198 diff --git a/twil_bringup/config/mechanics/twil_specs.yaml b/twil_bringup/config/mechanics/twil_specs.yaml new file mode 100644 index 0000000..1866cf6 --- /dev/null +++ b/twil_bringup/config/mechanics/twil_specs.yaml @@ -0,0 +1,4 @@ +twil: + + wheel_radius: 0.075 + robot_baseline: 0.285 diff --git a/twil_bringup/include/twil_bringup/joy.h b/twil_bringup/include/twil_bringup/joy.h new file mode 100644 index 0000000..2ddad45 --- /dev/null +++ b/twil_bringup/include/twil_bringup/joy.h @@ -0,0 +1,24 @@ +#ifndef JOY_H +#define JOY_H + +#include +#include + +class JoyHandle +{ +public: + JoyHandle(ros::NodeHandle nh); + +private: + void joyCallback(const sensor_msgs::Joy::ConstPtr& joy); + + ros::NodeHandle nh_; + + int linear_, angular_; + double l_scale_, a_scale_; + ros::Publisher vel_pub1,vel_pub2,vel_pub3,vel_pub4; + ros::Subscriber joy_sub_; + +}; + +#endif diff --git a/twil_bringup/launch/controllers/dynamics_pid_backstepping_controller.launch b/twil_bringup/launch/controllers/dynamics_pid_backstepping_controller.launch new file mode 100644 index 0000000..2028903 --- /dev/null +++ b/twil_bringup/launch/controllers/dynamics_pid_backstepping_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/dynamics_pid_controller.launch b/twil_bringup/launch/controllers/dynamics_pid_controller.launch new file mode 100644 index 0000000..30176da --- /dev/null +++ b/twil_bringup/launch/controllers/dynamics_pid_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/joint_effort_controller.launch b/twil_bringup/launch/controllers/joint_effort_controller.launch new file mode 100644 index 0000000..754b916 --- /dev/null +++ b/twil_bringup/launch/controllers/joint_effort_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/joint_velocity_controller.launch b/twil_bringup/launch/controllers/joint_velocity_controller.launch new file mode 100644 index 0000000..3de11de --- /dev/null +++ b/twil_bringup/launch/controllers/joint_velocity_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/linearizing_controller.launch b/twil_bringup/launch/controllers/linearizing_controller.launch new file mode 100644 index 0000000..bb1e5f8 --- /dev/null +++ b/twil_bringup/launch/controllers/linearizing_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/twist_pid_backstepping_controller.launch b/twil_bringup/launch/controllers/twist_pid_backstepping_controller.launch new file mode 100644 index 0000000..37dd661 --- /dev/null +++ b/twil_bringup/launch/controllers/twist_pid_backstepping_controller.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/controllers/twist_pid_controller.launch b/twil_bringup/launch/controllers/twist_pid_controller.launch new file mode 100644 index 0000000..1bdc7e6 --- /dev/null +++ b/twil_bringup/launch/controllers/twist_pid_controller.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/joystick.launch b/twil_bringup/launch/joystick.launch new file mode 100644 index 0000000..dc772b3 --- /dev/null +++ b/twil_bringup/launch/joystick.launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + +--> + + + + + diff --git a/twil_bringup/launch/navigation/move_base.launch b/twil_bringup/launch/navigation/move_base.launch new file mode 100644 index 0000000..8079ec8 --- /dev/null +++ b/twil_bringup/launch/navigation/move_base.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/robot_hw.launch b/twil_bringup/launch/robot_hw.launch new file mode 100644 index 0000000..01a5a1f --- /dev/null +++ b/twil_bringup/launch/robot_hw.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/trajectory/mini_twil_circle_trajectory.launch b/twil_bringup/launch/trajectory/mini_twil_circle_trajectory.launch new file mode 100644 index 0000000..a1b197b --- /dev/null +++ b/twil_bringup/launch/trajectory/mini_twil_circle_trajectory.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/trajectory/mini_twil_eight_trajectory.launch b/twil_bringup/launch/trajectory/mini_twil_eight_trajectory.launch new file mode 100644 index 0000000..9bbc561 --- /dev/null +++ b/twil_bringup/launch/trajectory/mini_twil_eight_trajectory.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/trajectory/twil_circle_trajectory.launch b/twil_bringup/launch/trajectory/twil_circle_trajectory.launch new file mode 100644 index 0000000..31babb9 --- /dev/null +++ b/twil_bringup/launch/trajectory/twil_circle_trajectory.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/launch/trajectory/twil_eight_trajectory.launch b/twil_bringup/launch/trajectory/twil_eight_trajectory.launch new file mode 100644 index 0000000..1f14b76 --- /dev/null +++ b/twil_bringup/launch/trajectory/twil_eight_trajectory.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/twil_bringup/package.xml b/twil_bringup/package.xml new file mode 100644 index 0000000..2c60d71 --- /dev/null +++ b/twil_bringup/package.xml @@ -0,0 +1,72 @@ + + + twil_bringup + 0.0.0 + The twil_bringup package + + + + + talves + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + controller_interface + controller_manager + hardware_interface + joint_state_controller + roscpp + rospy + std_msgs + twil_hw + sensor_msgs + trajectory_msgs + geometry_msgs + + controller_interface + controller_manager + hardware_interface + joint_state_controller + roscpp + rospy + std_msgs + twil_hw + sensor_msgs + trajectory_msgs + geometry_msgs + + + + + + + diff --git a/twil_bringup/src/joy.cpp b/twil_bringup/src/joy.cpp new file mode 100644 index 0000000..ad86efd --- /dev/null +++ b/twil_bringup/src/joy.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include "twil_bringup/joy.h" +#include + +JoyHandle::JoyHandle(ros::NodeHandle nh): + linear_(1), + angular_(2), + nh_(nh) +{ + nh_.param("axis_linear", linear_, linear_); + nh_.param("axis_angular", angular_, angular_); + nh_.param("scale_angular", a_scale_, a_scale_); + nh_.param("scale_linear", l_scale_, l_scale_); + + vel_pub1 = nh_.advertise("/twil/dynamics_pid_controller/cmd_vel", 1); + vel_pub2 = nh_.advertise("/twil/twist_pid_controller/cmd_vel", 1); + vel_pub3 = nh_.advertise("/mini_twil/dynamics_pid_controller/cmd_vel", 1); + vel_pub4 = nh_.advertise("/mini_twil/twist_pid_controller/cmd_vel", 1); + + + joy_sub_ = nh_.subscribe("joy", 1, &JoyHandle::joyCallback, this); +} + +void JoyHandle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy) +{ + + // Twil + geometry_msgs::Twist twist; + twist.angular.z = a_scale_*joy->axes[angular_]; + twist.linear.x = l_scale_*joy->axes[linear_]; + vel_pub1.publish(twist); + vel_pub2.publish(twist); + vel_pub3.publish(twist); + vel_pub4.publish(twist); + std::cout << "Joystick SP [v, w]: [" << twist.linear.x << ", " << twist.angular.z << "]"<< std::endl; +} + + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "joy_node_handle"); + ros::NodeHandle nh; + JoyHandle Node(nh); + ros::spin(); +} diff --git a/twil_controllers/CMakeLists.txt b/twil_controllers/CMakeLists.txt new file mode 100644 index 0000000..a0fe050 --- /dev/null +++ b/twil_controllers/CMakeLists.txt @@ -0,0 +1,186 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil_controllers) + +## Add support for C++11, supported in ROS Kinetic and newer +add_definitions(-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 + controller_interface + control_msgs + control_toolbox + urdf + roscpp + rospy + ) + +find_package(cmake_modules REQUIRED) + + + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) +find_package(Eigen REQUIRED) +find_package(orocos_kdl REQUIRED) +find_package(kdl_parser REQUIRED) + +## 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 and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependencies might have been +## pulled in transitively but can be declared for certainty nonetheless: +## * add a build_depend tag for "message_generation" +## * 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 +# 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 # Or other packages containing msgs +# ) + +################################### +## 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 ${PROJECT_NAME} + CATKIN_DEPENDS controller_interface control_toolbox + # DEPENDS system_lib + DEPENDS Eigen + ) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Eigen_INCLUDE_DIRS} + ) + +## Declare a cpp library +add_library(twil_controllers + src/odometry_tool.cpp + src/pose_tool.cpp + src/cart_linearizing_controller.cpp + src/dynamics_pid_controller.cpp + src/dynamics_pid_backstepping_controller.cpp + src/nonlinear_backstepping_controller.cpp + src/twist_pid_backstepping_controller.cpp + src/twist_pid_controller.cpp + ) + +## Declare a cpp executable +# add_executable(twil_controllers_node src/twil_controllers_node.cpp) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +# add_dependencies(twil_controllers_node twil_controllers_generate_messages_cpp) + +## Specify libraries to link a library or executable target against +target_link_libraries(${PROJECT_NAME} + ${catkin_LIBRARIES} + ${orocos-kdl_LIBRARIES} + ${kdl_parser_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 ${PROJECT_NAME} + 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 twistd cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_twil_controllers.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/twil_controllers/README b/twil_controllers/README new file mode 100644 index 0000000..acd2807 --- /dev/null +++ b/twil_controllers/README @@ -0,0 +1,11 @@ +To publish with joint_effort_controller: + +rostopic pub /twil/left_wheel_joint_effort_controller/command std_msgs/Float64 "0.0" + +To publish with cart_linearizing_controller: + +rostopic pub /twil/cart_linearizing_controller/command std_msgs/Float64MultiArray "data: [0.1, 0.0]" + +To get time and pose: + +rostopic echo -p /gazebo/model_states | awk '{FS=","; printf("%g %g %g %g\n",$1/1e9,$11,$12,2*atan2(sqrt($14^2+$15^2+$16^2),$17))}' diff --git a/twil_controllers/include/twil_controllers/cart_linearizing_controller.h b/twil_controllers/include/twil_controllers/cart_linearizing_controller.h new file mode 100644 index 0000000..79c5a80 --- /dev/null +++ b/twil_controllers/include/twil_controllers/cart_linearizing_controller.h @@ -0,0 +1,84 @@ +/****************************************************************************** + Twil Controllers + Linearizing Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef TWIL_CONTROLLERS_CART_LINEARIZING_CONTROLLER_H +#define TWIL_CONTROLLERS_CART_LINEARIZING_CONTROLLER_H + +#include +#include +#include +#include +#include +#include "Eigen/Dense" + +#include "state_feedback_linearization.h" +#include "velocity_transformation.h" + +#define CART_LIN_DEBUG + +#ifdef CART_LIN_DEBUG +#include +#endif + +namespace twil_controllers +{ +class CartLinearizingController: public controller_interface::Controller +{ +public: + CartLinearizingController(void); + ~CartLinearizingController(void); + + bool init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n); + void starting(const ros::Time& time); + void update(const ros::Time& time,const ros::Duration& duration); + void stopping(void); + void commandCB(const std_msgs::Float64MultiArray::ConstPtr &command); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + +private: + ros::NodeHandle node_; + hardware_interface::EffortJointInterface *robot_; + std::vector joints_; + StateFeedbackLinearization * feedback_linearization; + std::string robot_ns; + + ros::Subscriber sub_command_; + + Eigen::Vector2d Effort; + Eigen::Vector2d nu_ref; + Mat2_4 Fu; + +#ifdef CART_LIN_DEBUG + std::ofstream fd; + bool makeLog; + std::string log_date; + int take; +#endif + + std::vector WheelRadius; + double WheelBase; +}; +} +#endif diff --git a/twil_controllers/include/twil_controllers/dynamics_pid_backstepping_controller.h b/twil_controllers/include/twil_controllers/dynamics_pid_backstepping_controller.h new file mode 100644 index 0000000..c969434 --- /dev/null +++ b/twil_controllers/include/twil_controllers/dynamics_pid_backstepping_controller.h @@ -0,0 +1,104 @@ +/****************************************************************************** + Twil Controllers + Linearizing Backstep Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_H +#define DYNAMICS_PID_BACKSTEPPING_CONTROLLER_H + +#include +#include +#include +#include +#include +#include +#include "twil_controllers/odometry_tool.h" +#include "twil_controllers/velocity_transformation.h" +#include "non_smooth_control.h" +#include "state_feedback_linearization.h" + +#define DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG +#include +#endif + + +namespace twil_controllers{ + +class DynamicsPIDBacksteppingController: public controller_interface::Controller +{ + +public: + DynamicsPIDBacksteppingController(); + ~DynamicsPIDBacksteppingController(); + bool init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n); + void starting(const ros::Time &); + void update(const ros::Time &time, const ros::Duration &duration); + void stopping(const ros::Time &); + void commandCB(const geometry_msgs::PoseStampedConstPtr &command); + void command2dCB(const geometry_msgs::Pose2DConstPtr &command); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + +private: + + /* ROS Variables and Structures */ + ros::Subscriber PositionSub[2]; + control_toolbox::Pid PID[2]; + ros::NodeHandle node_; + hardware_interface::EffortJointInterface *robot_; + std::vector joints_; + std::string robot_ns; + + /* Dynamics PID Controller Variables */ + StateFeedbackLinearization * feedback_linearization; + Eigen::Vector2d Effort; + Eigen::Vector2d nu_ref; + Eigen::Vector2d u_ref; + Mat2_4 Fu; + + /* Nonlinear Kinematic Controller Variables */ + Eigen::Vector3d lambda; + Eigen::Vector2d gamma; + Eigen::Vector3d pose_ref; + OdometryTool * Odometer; + NonSmoothControl * Kinematics; + int update_ratio; + + + /* Model Variables */ + Eigen::Vector2d WheelRadius; + double WheelBase; + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + std::ofstream fd; + bool makeLog; + std::string log_date; + int take; +#endif + +}; + +} + +#endif diff --git a/twil_controllers/include/twil_controllers/dynamics_pid_controller.h b/twil_controllers/include/twil_controllers/dynamics_pid_controller.h new file mode 100644 index 0000000..d70de47 --- /dev/null +++ b/twil_controllers/include/twil_controllers/dynamics_pid_controller.h @@ -0,0 +1,92 @@ +/****************************************************************************** + Twil Controllers + Dynamics PID Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef DYNAMICS_PID_CONTROLLER_H +#define DYNAMICS_PID_CONTROLLER_H + +#include +#include +#include +#include +#include +#include +#include "velocity_transformation.h" +#include "state_feedback_linearization.h" + +#define DYNAMICS_PID_DEBUG + +#ifdef DYNAMICS_PID_DEBUG +#include +#endif + +namespace twil_controllers +{ +class DynamicsPIDController: public controller_interface::Controller +{ + +public: + DynamicsPIDController(void); + ~DynamicsPIDController(void); + + bool init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n); + void starting(const ros::Time& time); + void update(const ros::Time& time,const ros::Duration& duration); + void stopping(void); + void commandCB(const geometry_msgs::TwistConstPtr &CommandVel); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + + private: + + /* ROS Variables and Structures */ + ros::Subscriber VelocitySub; + control_toolbox::Pid PID[2]; + ros::NodeHandle node_; + hardware_interface::EffortJointInterface *robot_; + std::vector joints_; + std::string robot_ns; + + /* Dynamics Controller Variables */ + StateFeedbackLinearization * feedback_linearization; + Eigen::Vector2d Effort; + Eigen::Vector2d nu_ref; + Eigen::Vector2d u_ref; + + Mat2_4 Fu; + + + +#ifdef DYNAMICS_PID_DEBUG + std::ofstream fd; + bool makeLog; + std::string log_date; + int take; +#endif + + std::vector WheelRadius; + double WheelBase; +}; +} +#endif diff --git a/twil_controllers/include/twil_controllers/non_smooth_control.h b/twil_controllers/include/twil_controllers/non_smooth_control.h new file mode 100644 index 0000000..631c2a0 --- /dev/null +++ b/twil_controllers/include/twil_controllers/non_smooth_control.h @@ -0,0 +1,122 @@ +/****************************************************************************** + Twil Controllers + Nonlinear Kinematic Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef NON_SMOOTH_CONTROL_H +#define NON_SMOOTH_CONTROL_H + +#include "Eigen/Dense" +#include +#include + +//#define NONSMOOTH_CONTROLLER_OUTPUT_SCREEN +class NonSmoothControl +{ +public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + NonSmoothControl(const Eigen::Vector3d &lambda, const Eigen::Vector2d &gamma) + : lamb(lambda), gam(gamma) { + std::cout << "Parametros [lb, gm]: "< 1e-6) ? + (gam[0]*(lamb[2]/lamb[1])*cos(alpha)*(sin(alpha)/alpha)*psi) : (gam[0]*(lamb[2]/lamb[1])*cos(alpha)*(1)*psi); + } + + if (std::isnan(u_r[0])) { + u_r[0] = 0; + std::cout << "u_r[0] generated a nan-value..." << std::endl; + } + + if (std::isnan(u_r[1])) { + u_r[1] = 0; + std::cout << "u_r[1] generated a nan-value..." << std::endl; + } + +#ifdef NONSMOOTH_CONTROLLER_OUTPUT_SCREEN + std::cout << "\ne: " << e << " - alpha: " << alpha << " - psi: " << psi; + std::cout << " - ur0: " << u_r[0] << " - ur1: " << u_r[1] << std::endl; +#endif + return u_r; + } + + bool StopCondition(const Eigen::Vector3d &xc, const Eigen::Vector3d &x_r, double eps){ + return StopCondition(xc, x_r, eps, eps); + } + + bool StopCondition(const Eigen::Vector3d &xc, const Eigen::Vector3d &x_r, double eps_pos, double eps_heading){ + double err_pos = 0; + err_pos += pow((xc[0]-x_r[0]),2); + err_pos += pow((xc[1]-x_r[1]),2); + if(sqrt(err_pos)>=eps_pos) return false; + + double err_heading = pow((xc[2]-x_r[2]),2); + if(sqrt(err_heading)>=eps_pos) return false; + + return true; + } + +private: + + const Eigen::Vector3d coordinate_change(const Eigen::Vector3d &x, const Eigen::Vector3d &x_r){ + Eigen::Matrix3d rot; + rot << cos(x_r[2]), sin(x_r[2]), 0, + -sin(x_r[2]), cos(x_r[2]), 0, + 0, 0, 1; + Eigen::Vector3d x_bar = rot*(x-x_r); + +#ifdef NONSMOOTH_CONTROLLER_OUTPUT_SCREEN + // std::cout << "Rotation Matrix: " << rot < + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef ODOMETRY_TOOL_H +#define ODOMETRY_TOOL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "twil_controllers/pose_tool.h" +#include + +namespace twil_controllers +{ +class OdometryTool +{ +public: + OdometryTool(); + ~OdometryTool(); + bool publish(); + bool init(ros::NodeHandle n, std::string topic_root, const Eigen::Vector3d &initial_state); + bool compute(ros::Duration duration, const Eigen::Vector2d &u); + Eigen::Vector3d getPose(); + void shutdown(); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + +private: + + ros::NodeHandle Node; + geometry_msgs::PoseWithCovariance pose; + geometry_msgs::Pose2D pose2d; + Eigen::Vector2d u; + ros::Duration odometer_cycle; + ros::Time odometer_compute_time; + + boost::shared_ptr > tf_odom_pub; + boost::shared_ptr< realtime_tools::RealtimePublisher >odom_pub; +// boost::shared_ptr< realtime_tools::RealtimePublisher >pose_pub; +}; + + +} +#endif // ODOMETRY_H diff --git a/twil_controllers/include/twil_controllers/pose_tool.h b/twil_controllers/include/twil_controllers/pose_tool.h new file mode 100644 index 0000000..156dcd3 --- /dev/null +++ b/twil_controllers/include/twil_controllers/pose_tool.h @@ -0,0 +1,13 @@ +#ifndef POSE_TOOL_H +#define POSE_TOOL_H + +#include +#include +#include +#include + +//Eigen::Vector3d conv_pose_to_vector(geometry_msgs::PoseWithCovariance pose_); +//Eigen::Vector3d conv_pose2d_to_vector(geometry_msgs::Pose2D pose_); +//geometry_msgs::PoseWithCovariance conv_vector_to_pose(Eigen::Vector3d pose_); +//geometry_msgs::Pose2D conv_vector_to_pose2d(Eigen::Vector3d pose_); +#endif diff --git a/twil_controllers/include/twil_controllers/state_feedback_linearization.h b/twil_controllers/include/twil_controllers/state_feedback_linearization.h new file mode 100644 index 0000000..627aad5 --- /dev/null +++ b/twil_controllers/include/twil_controllers/state_feedback_linearization.h @@ -0,0 +1,89 @@ +/****************************************************************************** + Twil Controllers + State Feedback Linearization + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + + +#ifndef STATE_FEEDBACK_LINEARIZATION_H +#define STATE_FEEDBACK_LINEARIZATION_H + +#include +#include +#include "Eigen/Dense" + +typedef Eigen::Matrix Mat2_4; + +class StateFeedbackLinearization +{ +public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + StateFeedbackLinearization(const Eigen::Matrix2d &G_, + const Eigen::Matrix2d &H_beta_) + { + H_beta = H_beta_; + Ginv = G_.inverse(); + Tau_zero.setZero(); + std::cout << "\n Value of H(beta): " << H_beta << std::endl; + std::cout << "\n Value of G: " << G_ << std::endl; + std::cout << "\n Value of Ginv: " << Ginv << std::endl; + std::cout << "\n Value of Tau0: " << Tau_zero << std::endl; + } + + Eigen::Vector2d computeInputs(const Eigen::Vector2d &v_, + const Eigen::Vector2d &F_Beta_u_) + { + /** + + * This class follows the standard feedback linearization defined by + * Tau_0 = G^-1(Beta)*( H(Beta)v + f(Beta,u) ) + * + * Input -> Joint Velocities + * v_(0): Linear Acceleration (m/s^2) + * v_(1): Angular Acceleration (rd/s^2) + * + * Return -> Robot Base Velocities + * Tau_zero(0): Right Actuator Effort + * Tau_zero(1): Left Actuator Effort + */ + + v = v_; + F_Beta_u = F_Beta_u_; + // std::cout << "\n Fbeta -v: " << F_Beta_u - v << std::endl; + // std::cout << "\n Fbeta: " << F_Beta_u << std::endl; + Tau_zero = Ginv*(H_beta*v + F_Beta_u); + + // std::cout << "\n Tau: " << Tau_zero << std::endl; + return Tau_zero; + } + + ~StateFeedbackLinearization() {} + +private: + Eigen::Matrix2d Ginv; + Eigen::Matrix2d H_beta; + Eigen::Vector2d F_Beta_u; + Eigen::Vector2d v; + Eigen::Vector2d Tau_zero; +}; + +#endif diff --git a/twil_controllers/include/twil_controllers/twist_pid_backstepping_controller.h b/twil_controllers/include/twil_controllers/twist_pid_backstepping_controller.h new file mode 100644 index 0000000..bea6ac3 --- /dev/null +++ b/twil_controllers/include/twil_controllers/twist_pid_backstepping_controller.h @@ -0,0 +1,105 @@ +/****************************************************************************** + Twil Controllers + PID Backstepping Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef TWIST_PID_BACKSTEPPING_CONTROLLER_H +#define TWIST_PID_BACKSTEPPING_CONTROLLER_H + +#include +#include +#include +#include +#include +#include +#include +#include "twil_controllers/odometry_tool.h" +#include "twil_controllers/pose_tool.h" +#include "twil_controllers/velocity_transformation.h" +#include "non_smooth_control.h" + + + +#define TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG +#include +#endif + +namespace twil_controllers{ + +class TwistPIDBacksteppingController: public controller_interface::Controller +{ + +public: + TwistPIDBacksteppingController(); + ~TwistPIDBacksteppingController(); + bool init(hardware_interface::EffortJointInterface *, ros::NodeHandle &); + void starting(const ros::Time &); + void update(const ros::Time &time, const ros::Duration &duration); + void stopping(const ros::Time &); + void commandCB(const geometry_msgs::PoseStampedConstPtr &command); + void command2dCB(const geometry_msgs::Pose2DConstPtr &command); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + +private: + + /* ROS Variables and Structures */ + ros::Subscriber PositionSub[2]; + control_toolbox::Pid PID[2]; + ros::NodeHandle node_; + hardware_interface::EffortJointInterface *robot_; + std::vector joints_; + std::string robot_ns; + + + /* Twist PID Controller Variables */ + Eigen::Vector2d dphi_ref, dphi, Effort; + Eigen::Vector2d u_ref; + + /* Nonlinear Kinematic Controller Variables */ + Eigen::Vector3d lambda; + Eigen::Vector2d gamma; + Eigen::Vector3d pose_ref; + OdometryTool * Odometer; + NonSmoothControl * Kinematics; + int update_ratio; + + + /* Model Variables */ + Eigen::Vector2d WheelRadius; + double WheelBase; + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + std::ofstream fd; + bool makeLog; + std::string log_date; + int take; +#endif + +}; + +} + +#endif + diff --git a/twil_controllers/include/twil_controllers/twist_pid_controller.h b/twil_controllers/include/twil_controllers/twist_pid_controller.h new file mode 100644 index 0000000..a3d840d --- /dev/null +++ b/twil_controllers/include/twil_controllers/twist_pid_controller.h @@ -0,0 +1,90 @@ +/****************************************************************************** + Twil Controllers + Twist PID Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef DYNAMICS_CONTROLLER_ +#define DYNAMICS_CONTROLLER_H + +#include +#include +#include +#include +#include +#include +#include "velocity_transformation.h" +#include "state_feedback_linearization.h" + +#define TWIST_PID_DEBUG + +#ifdef TWIST_PID_DEBUG +#include +#endif + +typedef Eigen::Matrix Mat2_4; + +namespace twil_controllers +{ +class TwistPIDController: public controller_interface::Controller +{ +public: + TwistPIDController(void); + ~TwistPIDController(void); + + bool init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n); + void starting(const ros::Time& time); + void update(const ros::Time& time,const ros::Duration& duration); + void stopping(void); + void commandCB(const geometry_msgs::TwistConstPtr &CommandVel); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + private: + + /* ROS Variables and Structures */ + ros::Subscriber VelocitySub; + control_toolbox::Pid PID[2]; + ros::NodeHandle node_; + hardware_interface::EffortJointInterface *robot_; + std::vector joints_; + std::string robot_ns; + + /* Velocity Controller Variables */ + Eigen::Vector2d dphi_ref, dphi, Effort; + Eigen::Vector2d u_ref; + + /* Model Variables */ + Eigen::Vector2d WheelRadius; + double WheelBase; + +#ifdef TWIST_PID_DEBUG + std::ofstream fd; + bool makeLog; + std::string log_date; + int take; +#endif + + +}; +} +#endif // DYNAMICS_CONTROLLER_H + diff --git a/twil_controllers/include/twil_controllers/velocity_transformation.h b/twil_controllers/include/twil_controllers/velocity_transformation.h new file mode 100644 index 0000000..a9ea53b --- /dev/null +++ b/twil_controllers/include/twil_controllers/velocity_transformation.h @@ -0,0 +1,91 @@ +/****************************************************************************** + Twil Controllers + Velocity Transformations + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + + +#ifndef VELOCITY_TRANSFORMATION_H +#define VELOCITY_TRANSFORMATION_H + +#include +#include +#include + +class VelocityTransformation +{ +public: + VelocityTransformation(); + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + static Eigen::Vector2d WheelToBase(const Eigen::Vector2d &JointVelocities, + double WheelBase, + double WheelRadius) + { + /** + * Input -> Joint Velocities + * dphi(0): Right Wheel + * dphi(1): Left Wheel + * + * Return -> Robot Base Velocities + * u(0): Linear Velocity (m/s) + * u(1): Angular Velocity (rd/s) + */ + + double b = WheelBase/2; // To maintain compatibility with Barros' formulation. + double c = WheelRadius/(2*b); + Eigen::Vector2d u, dphi; + u.setZero(); + dphi.setZero(); + dphi = JointVelocities; + u[0] = WheelRadius*(dphi[0]+dphi[1])/2; + u[1] = c*(dphi[0]-dphi[1]); + return u; + } + + static Eigen::Vector2d BaseToWheel(const Eigen::Vector2d &BaseVelocity, + double WheelBase, + double WheelRadius) + { + /** + * Input -> Base Velocities + * u(0): Linear Velocity (m/s) + * u(1): Angular Velocity (rd/s) + * + * Return -> Joint Velocities + * dphi(0): Right Wheel + * dphi(1): Left Wheel + */ + + double b = WheelBase/2; // To maintain compatibility with Barros' formulation. + double c = WheelRadius/(2*b); + Eigen::Vector2d dphi, u; + u.setZero(); + dphi.setZero(); + u = BaseVelocity; + dphi[0] = ( u[0]/WheelRadius )+( u[1]/(2*c) ); + dphi[1] = ( u[0]/WheelRadius )-( u[1]/(2*c) ); + return dphi; + } +}; + +#endif diff --git a/twil_controllers/package.xml b/twil_controllers/package.xml new file mode 100644 index 0000000..d644f67 --- /dev/null +++ b/twil_controllers/package.xml @@ -0,0 +1,77 @@ + + + twil_controllers + 2.0.0 + The twil_controllers package + + + + + Walter Fetter Lages + + + + + + GPLv3 + + + + + + + + + + + + + Walter Fetter Lages + + + + + + + + + + + + + + catkin + + controller_interface + effort_controllers + kdl_parser + orocos_kdl + twil_gazebo_ros_control + control_toolbox + + + cmake_modules + + + controller_interface + controller_manager + effort_controllers + joint_state_controller + kdl_parser + orocos_kdl + twil_gazebo_ros_control + control_toolbox + + cmake_modules + + + + + + + + + + + + diff --git a/twil_controllers/scripts/pub_array.sh b/twil_controllers/scripts/pub_array.sh new file mode 100755 index 0000000..5bc4ba5 --- /dev/null +++ b/twil_controllers/scripts/pub_array.sh @@ -0,0 +1 @@ +rostopic pub /twil/cart_linearizing_controller/command std_msgs/Float64MultiArray '{data: [0.01, 0.00]}' diff --git a/twil_controllers/src/cart_linearizing_controller.cpp b/twil_controllers/src/cart_linearizing_controller.cpp new file mode 100644 index 0000000..8f3acfc --- /dev/null +++ b/twil_controllers/src/cart_linearizing_controller.cpp @@ -0,0 +1,274 @@ +/****************************************************************************** + Twil Controllers + Linearizing Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include +#include +#include + +//#define URDF +//#define CONTROLLER_OUTPUT_SCREEN + +namespace twil_controllers +{ +CartLinearizingController::CartLinearizingController(void): + WheelRadius(2){} + +CartLinearizingController::~CartLinearizingController(void) { + sub_command_.~Subscriber(); + feedback_linearization->~StateFeedbackLinearization(); +} + +bool CartLinearizingController::init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n) { + node_=n; + robot_=robot; + + if(!node_.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("Robot namespace: %s", robot_ns.c_str()); + + XmlRpc::XmlRpcValue joint_names; + if(!node_.getParam("joints",joint_names)) + { + ROS_ERROR("No 'joints' parameter in controller. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + if(joint_names.getType() != XmlRpc::XmlRpcValue::TypeArray) + { + ROS_ERROR("The 'joints' parameter is not a struct. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + for(int i=0; i < joint_names.size();i++) + { + XmlRpc::XmlRpcValue &name_value=joint_names[i]; + if(name_value.getType() != XmlRpc::XmlRpcValue::TypeString) + { + ROS_ERROR("Array of joint names should contain only strings. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + hardware_interface::JointHandle j=robot->getHandle((std::string)name_value); + joints_.push_back(j); + } + sub_command_ = node_.subscribe("command",1000,&CartLinearizingController::commandCB,this); + +#ifdef urdf + std::string robot_desc_string; + if(!node_.getParam("/robot_description",robot_desc_string)) + { + ROS_ERROR("Could not find '/robot_description'."); + return false; + } + + KDL::Tree tree; + if (!kdl_parser::treeFromString(robot_desc_string,tree)) + { + ROS_ERROR("Failed to construct KDL tree."); + return false; + } + + // get wheelBase from URDF (actually from KDL tree) + KDL::SegmentMap::const_iterator segmentMapIter=tree.getSegment("left_wheel_support"); + KDL::Frame leftSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("right_wheel_support"); + KDL::Frame rightSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + WheelRadius.resize(joints_.size()); + wheelBase=leftSupportFrame(1,3)-rightSupportFrame(1,3); + std::string full_param_name; + + // get wheelRadius from URDF (actually from KDL tree) + segmentMapIter=tree.getSegment("chassis"); + KDL::Frame chassisFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("left_wheel"); + KDL::Joint leftWheelJoint=segmentMapIter->second.segment.getJoint(); + wheelRadius[0]=chassisFrame(2,3)+leftSupportFrame(2,3)+leftWheelJoint.JointOrigin().z(); + + segmentMapIter=tree.getSegment("right_wheel"); + KDL::Joint rightWheelJoint=segmentMapIter->second.segment.getJoint(); + wheelRadius[1]=chassisFrame(2,3)+rightSupportFrame(2,3)+rightWheelJoint.JointOrigin().z(); + + std::cout << "Wheel Radius: " << WheelRadius[0] << " - " << WheelRadius[1] << std::endl; + std::cout << "Wheel base: " << WheelBase << std::endl; + +#else + if (node_.getParam("/"+robot_ns+"/robot_baseline",WheelBase)) + ROS_INFO("Robot baseline: %f", WheelBase); + else ROS_ERROR("Failed to get param 'robot_baseline'"); + + if (node_.getParam("/" + robot_ns + "/wheel_radius",WheelRadius[0])){ + WheelRadius[1] = WheelRadius[0]; + ROS_INFO("Wheel Radius: %f", WheelRadius[1]); + } else ROS_ERROR("Failed to get param 'wheel_radius'"); +#endif + + /* + * Dynamics Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + if (!node_.getParam("/log_date",log_date)){ + ROS_ERROR("Parameter '%s/log_date' not found! The log will be disabled...",node_.getNamespace().c_str()); + log_date=""; + } + +#ifdef CART_LIN_DEBUG + if (!node_.getParam("take",take)){ + ROS_ERROR("Execution take '%s/take' not found! The parameter will be assumed as '0'",node_.getNamespace().c_str()); + take = 0; + } +#endif + + double k_parameters[6]; + + std::string param_name[] = {"feedback_linearization/A", + "feedback_linearization/B", + "feedback_linearization/C", + "feedback_linearization/D", + "feedback_linearization/E", + "feedback_linearization/F"}; + + for (int i = 0; i < 6; i++){ + if (n.getParam(param_name[i].c_str(),k_parameters[i])) + ROS_INFO("%s: %f", param_name[i].c_str(), k_parameters[i]); + else ROS_ERROR("Failed to get param '%s'", param_name[i].c_str()); + } + + const double A = k_parameters[0]; + const double B = k_parameters[1]; + const double C = k_parameters[2]; + const double D = k_parameters[3]; + const double E = k_parameters[4]; + const double F = k_parameters[5]; + + Eigen::Matrix2d G; + G << C, C, F, -F; + Fu << A, 0, 0, B, 0, D, E, 0; + std::cout << "Value of constants of F(u): " << Fu << std::endl; + + feedback_linearization = new StateFeedbackLinearization(G, Eigen::MatrixXd::Identity(2,2)); + return true; +} + +void CartLinearizingController::starting(const ros::Time& time) +{ + nu_ref.setZero(); + Effort.setZero(); + +#ifdef CART_LIN_DEBUG + if (makeLog == false) + { + std::string filename = "none"; + + if (robot_ns == "mini_twil") + { + filename = "/home/talves/Dropbox/Mini_Twil/ros/exp/" + log_date + "/cart_lin_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + else if (robot_ns == "twil") + { + filename = "/home/talves/Dropbox/Twil/ros/exp/" + log_date + "/cart_lin_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str());; + fd.open(filename); + makeLog = true; + } + } +#endif +} + +void CartLinearizingController::update(const ros::Time& time, + const ros::Duration& duration) +{ +#ifdef CART_LIN_DEBUG + static int k = 0; + if (makeLog==true){ + if (this->fd.is_open()){ + if (k==0) + { + ROS_INFO("Starting the LOG for the '%s_robot'...",robot_ns.c_str()); + fd << "seq," << "dur," << "u_ref1," <<"u_ref2," << "nu_ref1," <<"nu_ref2,"<< "u1," << "u2," << "eff1," << "eff2," << "dphi1," << "dphi2" << std::endl; + } + k++; + } + } +#endif + + Eigen::Vector2d u, fu, joint_ang_vel; + Eigen::Vector4d uf; + + // Compute Velocities + for(unsigned int i=0;i < joints_.size();i++) joint_ang_vel[i]=joints_[i].getVelocity(); + Eigen::Vector2d dphi; + dphi << joint_ang_vel[1], joint_ang_vel[0]; + + u = VelocityTransformation::WheelToBase(dphi,WheelBase,WheelRadius[0]); + + // Compute linearization + uf << u[0], u[1], u[1]*u[0], u[1]*u[1]; + fu = -Fu*uf; + Effort = feedback_linearization->computeInputs(nu_ref,fu); + // Apply Control Efforts + joints_[0].setCommand(Effort[1]); + joints_[1].setCommand(Effort[0]); + +#ifdef CART_LIN_DEBUG + if (makeLog==true){ + if (k>0) + { + fd << k << ","<< duration.toSec() << "," << 0 << "," << 0 << "," << nu_ref[0] << "," << nu_ref[1] << "," << uf[0] << "," << uf[1] << "," + << Effort[0] << "," << Effort[1] << "," << dphi[1] << "," << dphi[0] << std::endl; + } + } +#endif +} + +void CartLinearizingController::stopping() +{ + +#ifdef CART_LIN_DEBUG + fd.close(); +#endif + sub_command_.shutdown(); +} + +void CartLinearizingController::commandCB(const std_msgs::Float64MultiArray::ConstPtr &command) +{ + for(unsigned int i=0;i < command->data.size();i++){ + nu_ref[i]=command->data[i]; + } +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("nu_ref: {%f, %f}", nu_ref[0], nu_ref[1]); +#endif +} + +} +PLUGINLIB_EXPORT_CLASS(twil_controllers::CartLinearizingController,controller_interface::ControllerBase) diff --git a/twil_controllers/src/dynamics_pid_backstepping_controller.cpp b/twil_controllers/src/dynamics_pid_backstepping_controller.cpp new file mode 100644 index 0000000..67a8020 --- /dev/null +++ b/twil_controllers/src/dynamics_pid_backstepping_controller.cpp @@ -0,0 +1,474 @@ +/****************************************************************************** + Twil Controllers + Linearizing Backstep Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include "twil_controllers/dynamics_pid_backstepping_controller.h" +#include +#include +#include + +//#define URDF +//#define CONTROLLER_OUTPUT_SCREEN + +namespace twil_controllers +{ + +DynamicsPIDBacksteppingController::DynamicsPIDBacksteppingController() +{ + +} + +DynamicsPIDBacksteppingController::~DynamicsPIDBacksteppingController() +{ + PositionSub[0].~Subscriber(); + PositionSub[1].~Subscriber(); + PID[0].~Pid(); + PID[1].~Pid(); +} + +bool DynamicsPIDBacksteppingController::init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n) +{ + + node_ = n; + robot_ = robot; + + if(!node_.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("Robot namespace: %s", robot_ns.c_str()); + + XmlRpc::XmlRpcValue joint_names; + if(!node_.getParam("joints",joint_names)) + { + ROS_ERROR("No 'joints' parameter in controller. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + if(joint_names.getType() != XmlRpc::XmlRpcValue::TypeArray) + { + ROS_ERROR("The 'joints' parameter is not a struct. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + for(int i=0; i < joint_names.size();i++) + { + XmlRpc::XmlRpcValue &name_value=joint_names[i]; + if(name_value.getType() != XmlRpc::XmlRpcValue::TypeString) + { + ROS_ERROR("Array of joint names should contain only strings. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + hardware_interface::JointHandle j=robot->getHandle((std::string)name_value); + joints_.push_back(j); + } + + // PositionSub[0] = node_.subscribe("cmd_pos",1,&DynamicsPIDBacksteppingController::commandCB,this); + PositionSub[0] = node_.subscribe("/move_base_simple/goal",1,&DynamicsPIDBacksteppingController::commandCB,this); + PositionSub[1] = node_.subscribe("cmd_pos2d",1,&DynamicsPIDBacksteppingController::command2dCB,this); + +#ifdef URDF + std::string robot_desc_string; + if(!node_.getParam("/robot_description",robot_desc_string)) + { + ROS_ERROR("Could not find '/robot_description'."); + return false; + } + + KDL::Tree tree; + if (!kdl_parser::treeFromString(robot_desc_string,tree)) + { + ROS_ERROR("Failed to construct KDL tree."); + return false; + } + + // get wheelBase from URDF (actually from KDL tree) + KDL::SegmentMap::const_iterator segmentMapIter=tree.getSegment("left_wheel_support"); + KDL::Frame leftSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("right_wheel_support"); + KDL::Frame rightSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + WheelRadius.resize(joints_.size()); + WheelBase=leftSupportFrame(1,3)-rightSupportFrame(1,3); + + // get wheelRadius from URDF (actually from KDL tree) + segmentMapIter=tree.getSegment("chassis"); + KDL::Frame chassisFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("left_wheel"); + KDL::Joint leftWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[0]=chassisFrame(2,3)+leftSupportFrame(2,3)+leftWheelJoint.JointOrigin().z(); + + segmentMapIter=tree.getSegment("right_wheel"); + KDL::Joint rightWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[1]=chassisFrame(2,3)+rightSupportFrame(2,3)+rightWheelJoint.JointOrigin().z(); + + std::cout << "Wheel Radius: " << WheelRadius[0] << " - " << WheelRadius[1] << std::endl; + std::cout << "Wheel base: " << WheelBase << std::endl; + +#else + if (node_.getParam("/"+robot_ns+"/robot_baseline",WheelBase)) + ROS_INFO("Robot baseline: %f", WheelBase); + else ROS_ERROR("Failed to get param 'robot_baseline'"); + + if (node_.getParam("/" + robot_ns + "/wheel_radius",WheelRadius[0])){ + WheelRadius[1] = WheelRadius[0]; + ROS_INFO("Wheel Radius: %f", WheelRadius[1]); + } else ROS_ERROR("Failed to get param 'wheel_radius'"); +#endif + + + /* + * Velocity PID Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + if (!PID[0].init(ros::NodeHandle(node_, "linear_velocity_pid_parameters"))){ + ROS_ERROR("This class could not construct PID controller for linear velocity"); + return false; + } else ROS_INFO("\n-------------------------------------------------->PID01_OK\n-------------------------------------------------->"); + + if (!PID[1].init(ros::NodeHandle(node_, "angular_velocity_pid_parameters"))){ + ROS_ERROR("This class could not construct PID controller for angular velocity"); + return false; + } + + double p, i, d, imin, imax; + bool awdup; + + + PID[0].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Left PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + PID[1].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Right PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + + double low_level_control_rate = 0.0; + if(node_.getParam("/" + robot_ns + "/control_loop_rate", low_level_control_rate)) { + ROS_INFO("Low_level Control Frequency: %fHz", low_level_control_rate); + } else return false; + + if (!node_.getParam("/log_date",log_date)){ + ROS_ERROR("Parameter '/robot_date' not found! The log will be disabled..."); + log_date=""; + } + + /* + * Dynamics Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + { + + + double k_parameters[6]; + + std::string param_name[] = {"feedback_linearization/A", + "feedback_linearization/B", + "feedback_linearization/C", + "feedback_linearization/D", + "feedback_linearization/E", + "feedback_linearization/F"}; + + for (int i = 0; i < 6; i++){ + if (node_.getParam(param_name[i].c_str(),k_parameters[i])) + ROS_INFO("%s: %f", param_name[i].c_str(), k_parameters[i]); + else ROS_ERROR("Failed to get param '%s'", param_name[i].c_str()); + } + + const double A = k_parameters[0]; + const double B = k_parameters[1]; + const double C = k_parameters[2]; + const double D = k_parameters[3]; + const double E = k_parameters[4]; + const double F = k_parameters[5]; + + Eigen::Matrix2d G; + G << C, C, F, -F; + Fu << A, 0, 0, B, 0, D, E, 0; + std::cout << "Value of constants of F(u): " << Fu << std::endl; + + feedback_linearization = new StateFeedbackLinearization(G, Eigen::MatrixXd::Identity(2,2)); + + } + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (!node_.getParam("take",take)){ + ROS_ERROR("Execution take '%s/take' not found! The parameter will be assumed as '0'",node_.getNamespace().c_str()); + take = 0; + } +#endif + + /* + * Nonlinear Kinematic Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + { + // Starting Odometer + Eigen::Vector3d pos_ini; + + if (!node_.getParam("x_ini",pos_ini[0])){ + ROS_ERROR("Initial pose parameter '%s/x_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[0] = 0; + } + + if (!node_.getParam("y_ini",pos_ini[1])){ + ROS_ERROR("Initial pose parameter '%s/y_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[1] = 0; + } + + if (!node_.getParam("th_ini",pos_ini[2])){ + ROS_ERROR("Initial pose parameter '%s/th_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[2] = 0; + } + + + Odometer = new OdometryTool(); + Odometer->init(node_, robot_ns, pos_ini); + + // TODO + // Start odometer in a arbitrary pose + + // Starting Kinematic Controller + + double non_smooth_parameters[6]; + std::string param_name[] = {"nonsmooth_controller/lambda1", + "nonsmooth_controller/lambda2", + "nonsmooth_controller/lambda3", + "nonsmooth_controller/gamma1", + "nonsmooth_controller/gamma2", + "nonsmooth_controller/update_ratio"}; + + for (int i = 0; i < 6; i++){ + if (node_.getParam(param_name[i].c_str(),non_smooth_parameters[i])) + ROS_INFO("%s: %f", param_name[i].c_str(), non_smooth_parameters[i]); + else { + ROS_ERROR("Failed to get param '%s'", param_name[i].c_str()); + return false; + } + } + + lambda[0] = non_smooth_parameters[0]; + lambda[1] = non_smooth_parameters[1]; + lambda[2] = non_smooth_parameters[2]; + gamma[0] = non_smooth_parameters[3]; + gamma[1] = non_smooth_parameters[4]; + update_ratio = non_smooth_parameters[5]; + + Kinematics = new NonSmoothControl(lambda,gamma); + } + ROS_INFO("%s: %f", "Kinematic Controller Frequency: ", low_level_control_rate/update_ratio); + + return true; +} + +void DynamicsPIDBacksteppingController::starting(const ros::Time &) +{ + Effort.setZero(); + nu_ref.setZero(); + u_ref.setZero(); + pose_ref = Odometer->getPose(); + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (makeLog == false) + { + std::string filename = "none"; + + if (robot_ns == "mini_twil") + { + filename = "/home/talves/Dropbox/Mini_Twil/ros/exp/" + log_date + "/dynamics_backstepping_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + else if (robot_ns == "twil") + { + filename = "/home/talves/Dropbox/Twil/ros/exp/" + log_date + "/dynamics_backstepping_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + } +#endif +} + +void DynamicsPIDBacksteppingController::update(const ros::Time &time, const ros::Duration &duration) +{ + static int kinematic_cycle = 0; + static int filter_cycle = 0; + static double last_vel[2] = {0.0f, 0.0f}, alph = 0.5; + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + static int k = 0; + if (makeLog == true){ + if (this->fd.is_open()){ + if (k==0) + { + ROS_INFO("Starting the LOG for the '%s_robot'...",robot_ns.c_str()); + fd << "seq," << "dur," << "pose_ref1," << "pose_ref2," << "pose_ref3," << "pose1," << "pose2," + << "pose3," << "u_ref1," <<"u_ref2," << "nu_ref1," <<"nu_ref2," << "u1," << "u2," + << "eff1," << "eff2," << "dphi1," << "dphi2" << std::endl; + } + k++; + } + } +#endif + + /* --------------------------------------------------------------------------------------------------------------------- + * Nonlinear Pose Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + + Eigen::Vector2d u, joint_ang_vel; + + // Compute Velocities + for(int i=0; i < joints_.size(); i++) joint_ang_vel[i]=joints_[i].getVelocity(); + + /* + * dphi[0] equals to right joint velocity and + * dphi[1] equals to left joint velocity (as in the formulation). + * In ros the left joint is defined as 0 and right joint as 1 + * to correct the mismatch, a conversion denoted by dphi=[joint_ang_vel[1], joint_ang_vel[0]] is defined + */ + Eigen::Vector2d dphi; + if (filter_cycle == 0){ + dphi << joint_ang_vel[1], joint_ang_vel[0]; + filter_cycle++; + } else { + dphi << (alph*joint_ang_vel[1]) +((1-alph)*last_vel[1]), (alph*joint_ang_vel[0]) +((1-alph)*last_vel[0]); + } + last_vel[0]=joint_ang_vel[0]; + last_vel[1]=joint_ang_vel[1]; + + u = VelocityTransformation::WheelToBase(dphi,WheelBase,WheelRadius[0]); + + Odometer->compute(duration,u); + Eigen::Vector3d pose = Odometer->getPose(); + + if (++kinematic_cycle == update_ratio){ + kinematic_cycle = 0; +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Updating kinematic controller"); +#endif + + // if (!Kinematics->StopCondition(pose,pose_ref,10e-3,1e-3)){ + u_ref = Kinematics->compute(pose,pose_ref); // Here will be generated the linear and angular velocities setpoints + // } else u_ref.setZero(); + } + + /* --------------------------------------------------------------------------------------------------------------------- + * Velocity Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + + Eigen::Vector2d error; + error[0] = u_ref[0]-u[0]; + error[1] = u_ref[1]-u[1]; + nu_ref[0] = PID[0].computeCommand(error[0],duration); // Here will be generated the linear acceleration setpoint (m/s^2) + nu_ref[1] = PID[1].computeCommand(error[1],duration); // Here will be generated the angular acceleration setpoint (rd/s^2) + + /* --------------------------------------------------------------------------------------------------------------------- + * Dynamics Feedback Linearization + * --------------------------------------------------------------------------------------------------------------------- + */ + + Eigen::Vector2d fu; + Eigen::Vector4d uf; + + // Feedback Linearization ----------------------------------------------------------------------------------------------- + uf << u[0], u[1], u[1]*u[0], u[1]*u[1]; + fu = -Fu*uf; + Effort = feedback_linearization->computeInputs(nu_ref,fu); + // Control Efforts ------------------------------------------------------------------------------------------------------ + joints_[0].setCommand(Effort(1)); + joints_[1].setCommand(Effort(0)); + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("uref[0]: %f; u[0]: %f",u_ref[0],u[0]); + ROS_INFO("uref[1]: %f; u[1]: %f",u_ref[1],u[1]); + ROS_INFO("Ref: {%f,%f,%f}; Pos: {%f,%f,%f}",pose_ref[0], pose_ref[1], pose_ref[2], pose[0], pose[1], pose[2]); +#endif + + Odometer->publish(); + +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (makeLog==true){ + if (k>0){ + fd << k << "," << duration.toSec() << "," << pose_ref[0] << "," << pose_ref[1] + << "," << pose_ref[2] << "," << pose[0] << "," << pose[1] << "," << pose[2] + << "," << u_ref[0] << "," << u_ref[1] << nu_ref[0] << "," << nu_ref[1] << "," << u[0] << "," << u[1] + << "," << Effort[0] << "," << Effort[1] << "," << dphi[1] << "," << dphi[0] + << std::endl; + } + } +#endif + +} + +void DynamicsPIDBacksteppingController::stopping(const ros::Time &) +{ +#ifdef DYNAMICS_PID_BACKSTEPPING_CONTROLLER_DEBUG + fd.close(); +#endif + PositionSub[0].shutdown(); + PositionSub[1].shutdown(); +} + +void DynamicsPIDBacksteppingController::commandCB(const geometry_msgs::PoseStampedConstPtr &command) +{ + pose_ref[0] = command->pose.position.x; + pose_ref[1] = command->pose.position.y; + tf::Quaternion quat_aux(command->pose.orientation.x, + command->pose.orientation.y, + command->pose.orientation.z, + command->pose.orientation.w); + tf::Matrix3x3 m(quat_aux); + double roll, pitch, yaw; + m.getRPY(roll, pitch, yaw); + pose_ref[2] = yaw; +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Pose_ref: {%f, %f, %f}", pose_ref[0], pose_ref[1], pose_ref[2]); +#endif +} + +void DynamicsPIDBacksteppingController::command2dCB(const geometry_msgs::Pose2DConstPtr &command) +{ + // pose_ref[0] = command->x; + // pose_ref[1] = command->y; + // pose_ref[2] = command->theta; + // std::cout << "Pose_ref: " << pose_ref << std::endl; + + pose_ref[0] = command->x; + pose_ref[1] = command->y; + pose_ref[2] = command->theta; + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Pose_ref: {%f, %f, %f}", pose_ref[0], pose_ref[1], pose_ref[2]); +#endif +} + +} +PLUGINLIB_EXPORT_CLASS(twil_controllers::DynamicsPIDBacksteppingController,controller_interface::ControllerBase) diff --git a/twil_controllers/src/dynamics_pid_controller.cpp b/twil_controllers/src/dynamics_pid_controller.cpp new file mode 100644 index 0000000..71007ae --- /dev/null +++ b/twil_controllers/src/dynamics_pid_controller.cpp @@ -0,0 +1,342 @@ +/****************************************************************************** + Twil Controllers + Dynamics PID Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include +#include +#include + +//#define URDF +//#define CONTROLLER_OUTPUT_SCREEN + +namespace twil_controllers +{ +DynamicsPIDController::DynamicsPIDController(void): + WheelRadius(2){} + +DynamicsPIDController::~DynamicsPIDController(void) { + VelocitySub.~Subscriber(); + feedback_linearization->~StateFeedbackLinearization(); + PID[0].~Pid(); + PID[1].~Pid(); +} + +bool DynamicsPIDController::init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n) { + node_=n; + robot_=robot; + + if(!node_.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("Robot namespace: %s", robot_ns.c_str()); + + XmlRpc::XmlRpcValue joint_names; + if(!node_.getParam("joints",joint_names)) + { + ROS_ERROR("No 'joints' parameter in controller. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + if(joint_names.getType() != XmlRpc::XmlRpcValue::TypeArray) + { + ROS_ERROR("The 'joints' parameter is not a struct. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + for(int i=0; i < joint_names.size();i++) + { + XmlRpc::XmlRpcValue &name_value=joint_names[i]; + if(name_value.getType() != XmlRpc::XmlRpcValue::TypeString) + { + ROS_ERROR("Array of joint names should contain only strings. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + hardware_interface::JointHandle j=robot->getHandle((std::string)name_value); + joints_.push_back(j); + } + + VelocitySub = node_.subscribe("cmd_vel",1,&DynamicsPIDController::commandCB,this); + +#ifdef urdf + std::string robot_desc_string; + if(!node_.getParam("/robot_description",robot_desc_string)) + { + ROS_ERROR("Could not find '/robot_description'."); + return false; + } + + KDL::Tree tree; + if (!kdl_parser::treeFromString(robot_desc_string,tree)) + { + ROS_ERROR("Failed to construct KDL tree."); + return false; + } + + // get wheelBase from URDF (actually from KDL tree) + KDL::SegmentMap::const_iterator segmentMapIter=tree.getSegment("left_wheel_support"); + KDL::Frame leftSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("right_wheel_support"); + KDL::Frame rightSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + WheelRadius.resize(joints_.size()); + wheelBase=leftSupportFrame(1,3)-rightSupportFrame(1,3); + + // get wheelRadius from URDF (actually from KDL tree) + segmentMapIter=tree.getSegment("chassis"); + KDL::Frame chassisFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("left_wheel"); + KDL::Joint leftWheelJoint=segmentMapIter->second.segment.getJoint(); + wheelRadius[0]=chassisFrame(2,3)+leftSupportFrame(2,3)+leftWheelJoint.JointOrigin().z(); + + segmentMapIter=tree.getSegment("right_wheel"); + KDL::Joint rightWheelJoint=segmentMapIter->second.segment.getJoint(); + wheelRadius[1]=chassisFrame(2,3)+rightSupportFrame(2,3)+rightWheelJoint.JointOrigin().z(); + std::cout << "Wheel Radius: " << WheelRadius[0] << " - " << WheelRadius[1] << std::endl; + std::cout << "Wheel base: " << WheelBase << std::endl; +#else + if (node_.getParam("/"+robot_ns+"/robot_baseline",WheelBase)) + ROS_INFO("Robot baseline: %f", WheelBase); + else ROS_ERROR("Failed to get param 'robot_baseline'"); + + if (node_.getParam("/" + robot_ns + "/wheel_radius",WheelRadius[0])){ + WheelRadius[1] = WheelRadius[0]; + ROS_INFO("Wheel Radius: %f", WheelRadius[1]); + } else ROS_ERROR("Failed to get param 'wheel_radius'"); +#endif + + + + /* + * Velocity PID Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + if (!PID[0].init(ros::NodeHandle(node_, "linear_velocity_pid_parameters"))){ + + ROS_ERROR("This class could not construct PID controller for linear velocity"); + return false; + } + + if (!PID[1].init(ros::NodeHandle(node_, "angular_velocity_pid_parameters"))){ + ROS_ERROR("This class could not construct PID controller for angular velocity"); + return false; + } + + double p, i, d, imin, imax; + bool awdup; + + + PID[0].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Left PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + PID[1].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Right PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + + if (!node_.getParam("/log_date",log_date)){ + ROS_ERROR("Parameter '/log_date' not found! The log will be disabled..."); + log_date=""; + } + +#ifdef TWIST_PID_DEBUG + if (!node_.getParam("take",take)){ + ROS_ERROR("Execution take '%s/take' not found! The parameter will be assumed as '0'",node_.getNamespace().c_str()); + take = 0; + } +#endif + + /* + * Dynamics Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + double k_parameters[6]; + + std::string param_name[] = {"feedback_linearization/A", + "feedback_linearization/B", + "feedback_linearization/C", + "feedback_linearization/D", + "feedback_linearization/E", + "feedback_linearization/F"}; + + for (int i = 0; i < 6; i++){ + if (node_.getParam(param_name[i].c_str(),k_parameters[i])) + ROS_INFO("%s: %f", param_name[i].c_str(), k_parameters[i]); + else ROS_ERROR("Failed to get param '%s'", param_name[i].c_str()); + } + + const double A = k_parameters[0]; + const double B = k_parameters[1]; + const double C = k_parameters[2]; + const double D = k_parameters[3]; + const double E = k_parameters[4]; + const double F = k_parameters[5]; + + Eigen::Matrix2d G; + G << C, C, F, -F; + Fu << A, 0, 0, B, 0, D, E, 0; + std::cout << "Value of constants of F(u): " << Fu << std::endl; + + feedback_linearization = new StateFeedbackLinearization(G, Eigen::MatrixXd::Identity(2,2)); + return true; +} + +void DynamicsPIDController::starting(const ros::Time& time) +{ + nu_ref.setZero(); + u_ref.setZero(); + Effort.setZero(); + +#ifdef DYNAMICS_PID_DEBUG + if (makeLog == false) + { + std::string filename = "none"; + + if (robot_ns == "mini_twil") + { + filename = "/home/talves/Dropbox/Mini_Twil/ros/exp/" + log_date + "/dynamics_pid_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + else if (robot_ns == "twil") + { + filename = "/home/talves/Dropbox/Twil/ros/exp/" + log_date + "/dynamics_pid_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + } +#endif +} + +void DynamicsPIDController::update(const ros::Time& time, + const ros::Duration& duration) +{ +#ifdef DYNAMICS_PID_DEBUG + static int k = 0; + if (makeLog==true){ + if (this->fd.is_open()){ + if (k==0) + { + ROS_INFO("Starting the LOG for the '%s_robot'...",robot_ns.c_str()); + fd << "seq," << "dur," << "u_ref1," <<"u_ref2," << "nu_ref1," <<"nu_ref2,"<< "u1," << "u2," << "eff1," << "eff2," << "dphi1," << "dphi2" << std::endl; + } + k++; + } + } +#endif + + /* --------------------------------------------------------------------------------------------------------------------- + * Velocity Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + Eigen::Vector2d u, joint_ang_vel; + + // Compute Velocities + for(int i=0; i < joints_.size(); i++) joint_ang_vel[i]=joints_[i].getVelocity(); + + /* + * dphi[0] equals to right joint velocity and + * dphi[1] equals to left joint velocity (as in the formulation). + * In ros the left joint is defined as 0 and right joint as 1 + * to correct the mismatch, a conversion denoted by dphi=[joint_ang_vel[1], joint_ang_vel[0]] is defined + */ + Eigen::Vector2d dphi; + dphi << joint_ang_vel[1], joint_ang_vel[0]; + u = VelocityTransformation::WheelToBase(dphi,WheelBase,WheelRadius[0]); + + + + // Velocity PID Calculation --------------------------------------------------------------------------------------------- + Eigen::Vector2d error; + error[0] = u_ref[0]-u[0]; + error[1] = u_ref[1]-u[1]; + nu_ref[0] = PID[0].computeCommand(error[0],duration); // Here will be generated the linear acceleration setpoint (m/s^2) + nu_ref[1] = PID[1].computeCommand(error[1],duration); // Here will be generated the angular acceleration setpoint (rd/s^2) + /* + * ---------------------------------------------------------------------------------------------------------------------- + */ + + + /* --------------------------------------------------------------------------------------------------------------------- + * Dynamics Feedback Linearization + * --------------------------------------------------------------------------------------------------------------------- + */ + + Eigen::Vector2d fu; + Eigen::Vector4d uf; + + // Feedback Linearization ----------------------------------------------------------------------------------------------- + uf << u[0], u[1], u[1]*u[0], u[1]*u[1]; + fu = -Fu*uf; + Effort = feedback_linearization->computeInputs(nu_ref,fu); + // Control Efforts ------------------------------------------------------------------------------------------------------ + joints_[0].setCommand(Effort(1)); + joints_[1].setCommand(Effort(0)); + + /* + * ---------------------------------------------------------------------------------------------------------------------- + */ + + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("uref[0]: %f; u[0]: %f",u_ref[0],u[0]); + ROS_INFO("uref[1]: %f; u[1]: %f",u_ref[1],u[1]); +#endif + +#ifdef DYNAMICS_PID_DEBUG + if (makeLog == true){ + if (k>0) + { + fd << k << ","<< duration.toSec() << "," << u_ref[0] << "," << u_ref[1] << "," << nu_ref[0] << "," << nu_ref[1] << "," << u[0] << "," << u[1] << "," + << Effort[0] << "," << Effort[1] << "," << dphi[1] << "," << dphi[0] << std::endl; + } + } +#endif +} + +void DynamicsPIDController::stopping(void) +{ +#ifdef DYNAMICS_PID_DEBUG + fd.close(); +#endif + VelocitySub.shutdown(); +} + + + +void DynamicsPIDController::commandCB(const geometry_msgs::TwistConstPtr &CommandVel) +{ + u_ref.setZero(); + u_ref[0] = CommandVel->linear.x; + u_ref[1] = CommandVel->angular.z; +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("u_ref: {%f, %f}", u_ref[0], u_ref[1]); +#endif +} + +} +PLUGINLIB_EXPORT_CLASS(twil_controllers::DynamicsPIDController,controller_interface::ControllerBase) diff --git a/twil_controllers/src/nonlinear_backstepping_controller.cpp b/twil_controllers/src/nonlinear_backstepping_controller.cpp new file mode 100644 index 0000000..5e1ed79 --- /dev/null +++ b/twil_controllers/src/nonlinear_backstepping_controller.cpp @@ -0,0 +1 @@ +#include "twil_controllers/nonlinear_backstepping_controller.h" diff --git a/twil_controllers/src/odometry_tool.cpp b/twil_controllers/src/odometry_tool.cpp new file mode 100644 index 0000000..5b1739d --- /dev/null +++ b/twil_controllers/src/odometry_tool.cpp @@ -0,0 +1,130 @@ +/****************************************************************************** + Twil Controllers + Odometry Tool + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + + +#include "twil_controllers/odometry_tool.h" +#include +#include +#include + +namespace twil_controllers +{ +OdometryTool::OdometryTool() +{ +} + +OdometryTool::~OdometryTool() +{ + odom_pub->~RealtimePublisher(); + tf_odom_pub->~RealtimePublisher(); +} + +bool OdometryTool::compute(ros::Duration duration, const Eigen::Vector2d &u_) +{ + u = u_; + odometer_compute_time = ros::Time::now(); + odometer_cycle = duration; + + Eigen::Vector3d dp; + Eigen::MatrixXd B_x(3,2); + + double th = this->pose2d.theta + (u[1]*duration.toSec()/2.0); // Compute the heading angle for Runge-Kutta Integration + B_x << cos(th), 0.0, sin(th), 0.0, 0.0, 1.0; // Compute the B(x) matrix + dp = B_x*u*duration.toSec(); // Compute the displacement + + // Update the pose + this->pose2d.x += dp[0]; + this->pose2d.y += dp[1]; + this->pose2d.theta += dp[2]; + return true; + +} + +Eigen::Vector3d OdometryTool::getPose() +{ + Eigen::Vector3d pose_atu; + pose_atu << this->pose2d.x, this->pose2d.y, this->pose2d.theta; + return pose_atu; +} + +bool OdometryTool::publish() +{ + bool ret = false; + + const geometry_msgs::Quaternion orientation_from_quat(tf::createQuaternionMsgFromYaw(pose2d.theta)); + + if(odom_pub->trylock()) + { + odom_pub->msg_.header.stamp = odometer_compute_time; + odom_pub->msg_.pose.pose.position.x = this->pose2d.x; + odom_pub->msg_.pose.pose.position.y = this->pose2d.y; + odom_pub->msg_.pose.pose.orientation = orientation_from_quat; + odom_pub->msg_.twist.twist.linear.x = u[0]; + odom_pub->msg_.twist.twist.angular.z = u[1]; + odom_pub->unlockAndPublish(); + ret = true; + } else ret = false; + + if(tf_odom_pub->trylock()){ + geometry_msgs::TransformStamped& odom_frame = tf_odom_pub->msg_.transforms[0]; + odom_frame.header.stamp = odometer_compute_time; + odom_frame.transform.translation.x = this->pose2d.x; + odom_frame.transform.translation.y = this->pose2d.y; + odom_frame.transform.rotation = orientation_from_quat; + tf_odom_pub->unlockAndPublish(); + ret = true; + } else ret = false; + + return ret; +} + +bool OdometryTool::init(ros::NodeHandle n, std::string topic_root, const Eigen::Vector3d &initial_state) +{ + Node = n; + + this->pose2d.x = initial_state[0]; + this->pose2d.y = initial_state[1]; + this->pose2d.theta = initial_state[2]; + + odom_pub.reset(new realtime_tools::RealtimePublisher(Node, "/odom", 4)); + odom_pub->msg_.header.frame_id = "odom"; + odom_pub->msg_.child_frame_id = "twil_origin"; + odom_pub->msg_.pose.pose.position.z = 0; + odom_pub->msg_.twist.twist.linear.y = 0; + odom_pub->msg_.twist.twist.linear.z = 0; + odom_pub->msg_.twist.twist.angular.x = 0; + odom_pub->msg_.twist.twist.angular.y = 0; + + tf_odom_pub.reset(new realtime_tools::RealtimePublisher(Node, "/tf", 100)); + tf_odom_pub->msg_.transforms.resize(1); + tf_odom_pub->msg_.transforms[0].transform.translation.z = 0.0; + tf_odom_pub->msg_.transforms[0].child_frame_id = "twil_origin"; + tf_odom_pub->msg_.transforms[0].header.frame_id = "odom"; + + return true; + +} + +} diff --git a/twil_controllers/src/pose_tool.cpp b/twil_controllers/src/pose_tool.cpp new file mode 100644 index 0000000..75e1a89 --- /dev/null +++ b/twil_controllers/src/pose_tool.cpp @@ -0,0 +1,45 @@ +#include "twil_controllers/pose_tool.h" +#include + +//Eigen::Vector3d conv_pose_to_vector(geometry_msgs::PoseWithCovariance pose_) +//{ +// Eigen::Vector3d actual_pose; + +// tf::Quaternion quat_aux(pose_.pose.orientation.x, pose_.pose.orientation.y, pose_.pose.orientation.z, pose_.pose.orientation.w); +// tf::Matrix3x3 m(quat_aux); +// double roll, pitch, yaw; +// m.getRPY(roll, pitch, yaw); + +// actual_pose[0] = pose_.pose.position.x; +// actual_pose[1] = pose_.pose.position.y; +// actual_pose[2] = yaw; +// return actual_pose; +//} + +//Eigen::Vector3d conv_pose2d_to_vector(geometry_msgs::Pose2D pose_) +//{ +// Eigen::Vector3d pose_vector; +// pose_vector[0]=pose_.x; +// pose_vector[1]=pose_.y; +// pose_vector[2]=pose_.theta; +// return pose_vector; +//} + +//geometry_msgs::PoseWithCovariance conv_vector_to_pose(Eigen::Vector3d pose_) +//{ +// geometry_msgs::PoseWithCovariance pose_conv; +// pose_conv.pose.position.x = pose_[0]; +// pose_conv.pose.position.y = pose_[1]; +// pose_conv.pose.orientation = tf::createQuaternionMsgFromYaw(pose_[2]); +// return pose_conv; +//} + + +//geometry_msgs::Pose2D conv_vector_to_pose2d(Eigen::Vector3d pose_){ +// geometry_msgs::Pose2D pose2d; +// pose2d.x = pose_[0]; +// pose2d.y = pose_[1]; +// pose2d.theta = pose_[2]; +//} + + diff --git a/twil_controllers/src/twist_pid_backstepping_controller.cpp b/twil_controllers/src/twist_pid_backstepping_controller.cpp new file mode 100644 index 0000000..c83b85c --- /dev/null +++ b/twil_controllers/src/twist_pid_backstepping_controller.cpp @@ -0,0 +1,421 @@ +/****************************************************************************** + Twil Controllers + PID Backstepping Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include "twil_controllers/twist_pid_backstepping_controller.h" +#include +#include +#include + +//#define URDF +//#define CONTROLLER_OUTPUT_SCREEN + +namespace twil_controllers +{ + +TwistPIDBacksteppingController::TwistPIDBacksteppingController() +{ + +} + +TwistPIDBacksteppingController::~TwistPIDBacksteppingController() +{ + PositionSub[0].~Subscriber(); + PositionSub[1].~Subscriber(); + PID[0].~Pid(); + PID[1].~Pid(); +} + +bool TwistPIDBacksteppingController::init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n) +{ + node_ = n; + robot_ = robot; + + if(!node_.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("Robot namespace: %s", robot_ns.c_str()); + + XmlRpc::XmlRpcValue joint_names; + if(!node_.getParam("joints",joint_names)) + { + ROS_ERROR("No 'joints' parameter in controller. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + if(joint_names.getType() != XmlRpc::XmlRpcValue::TypeArray) + { + ROS_ERROR("The 'joints' parameter is not a struct. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + for(int i=0; i < joint_names.size();i++) + { + XmlRpc::XmlRpcValue &name_value=joint_names[i]; + if(name_value.getType() != XmlRpc::XmlRpcValue::TypeString) + { + ROS_ERROR("Array of joint names should contain only strings. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + hardware_interface::JointHandle j=robot->getHandle((std::string)name_value); + joints_.push_back(j); + } + + // VelocitySub = node_.subscribe("cmd_vel",1,&TwistPIDController::commandCB,this); + PositionSub[0] = node_.subscribe("cmd_pos",1,&TwistPIDBacksteppingController::commandCB,this); + PositionSub[1] = node_.subscribe("cmd_pos2d",1,&TwistPIDBacksteppingController::command2dCB,this); + +#ifdef URDF + std::string robot_desc_string; + if(!node_.getParam("/robot_description",robot_desc_string)) + { + ROS_ERROR("Could not find '/robot_description'."); + return false; + } + + KDL::Tree tree; + if (!kdl_parser::treeFromString(robot_desc_string,tree)) + { + ROS_ERROR("Failed to construct KDL tree."); + return false; + } + + // get wheelBase from URDF (actually from KDL tree) + KDL::SegmentMap::const_iterator segmentMapIter=tree.getSegment("left_wheel_support"); + KDL::Frame leftSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("right_wheel_support"); + KDL::Frame rightSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + WheelRadius.resize(joints_.size()); + WheelBase=leftSupportFrame(1,3)-rightSupportFrame(1,3); + + // get wheelRadius from URDF (actually from KDL tree) + segmentMapIter=tree.getSegment("chassis"); + KDL::Frame chassisFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("left_wheel"); + KDL::Joint leftWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[0]=chassisFrame(2,3)+leftSupportFrame(2,3)+leftWheelJoint.JointOrigin().z(); + + segmentMapIter=tree.getSegment("right_wheel"); + KDL::Joint rightWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[1]=chassisFrame(2,3)+rightSupportFrame(2,3)+rightWheelJoint.JointOrigin().z(); + + std::cout << "Wheel Radius: " << WheelRadius[0] << " - " << WheelRadius[1] << std::endl; + std::cout << "Wheel base: " << WheelBase << std::endl; + +#else + if (node_.getParam("/"+robot_ns+"/robot_baseline",WheelBase)) + ROS_INFO("Robot baseline: %f", WheelBase); + else ROS_ERROR("Failed to get param 'robot_baseline'"); + + if (node_.getParam("/" + robot_ns + "/wheel_radius",WheelRadius[0])){ + WheelRadius[1] = WheelRadius[0]; + ROS_INFO("Wheel Radius: %f", WheelRadius[1]); + } else ROS_ERROR("Failed to get param 'wheel_radius'"); +#endif + + + /* + * Twist PID Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + if (!PID[0].init(ros::NodeHandle(node_, "left_wheel_joint_pid_parameters"))){ + ROS_ERROR("MyController could not construct PID controller for joint left_wheel_pid"); + return false; + } + + if (!PID[1].init(ros::NodeHandle(node_, "right_wheel_joint_pid_parameters"))){ + ROS_ERROR("MyController could not construct PID controller for joint right_wheel_pid"); + return false; + } + + double p, i, d, imin, imax; + bool awdup; + + PID[0].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Left PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + PID[1].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Right PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + + double low_level_control_rate = 0.0; + if(node_.getParam("/" + robot_ns + "/control_loop_rate", low_level_control_rate)) { + ROS_INFO("Low_level Control Frequency: %fHz", low_level_control_rate); + } else return false; + + if (!node_.getParam("/log_date",log_date)){ + ROS_ERROR("Parameter '/robot_date' not found! The log will be disabled..."); + log_date=""; + } + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (!node_.getParam("take",take)){ + ROS_ERROR("Execution take '%s/take' not found! The parameter will be assumed as '0'",node_.getNamespace().c_str()); + take = 0; + } +#endif + + /* + * Nonlinear Kinematic Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + // Starting Odometer + Eigen::Vector3d pos_ini; + + if (!node_.getParam("x_ini",pos_ini[0])){ + ROS_ERROR("Initial pose parameter '%s/x_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[0] = 0; + } + + if (!node_.getParam("y_ini",pos_ini[1])){ + ROS_ERROR("Initial pose parameter '%s/y_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[1] = 0; + } + + if (!node_.getParam("th_ini",pos_ini[2])){ + ROS_ERROR("Initial pose parameter '%s/th_ini' not found! The parameter will be disabled as '0'",node_.getNamespace().c_str()); + pos_ini[2] = 0; + } + + + Odometer = new OdometryTool(); + Odometer->init(node_, robot_ns, pos_ini); + + // TODO + // Start odometer in a arbitrary pose + + // Starting Kinematic Controller + + double non_smooth_parameters[6]; + std::string param_name[] = {"nonsmooth_controller/lambda1", + "nonsmooth_controller/lambda2", + "nonsmooth_controller/lambda3", + "nonsmooth_controller/gamma1", + "nonsmooth_controller/gamma2", + "nonsmooth_controller/update_ratio"}; + + for (int i = 0; i < 6; i++){ + if (node_.getParam(param_name[i].c_str(),non_smooth_parameters[i])) + ROS_INFO("%s: %f", param_name[i].c_str(), non_smooth_parameters[i]); + else { + ROS_ERROR("Failed to get param '%s'", param_name[i].c_str()); + return false; + } + } + + lambda[0] = non_smooth_parameters[0]; + lambda[1] = non_smooth_parameters[1]; + lambda[2] = non_smooth_parameters[2]; + gamma[0] = non_smooth_parameters[3]; + gamma[1] = non_smooth_parameters[4]; + update_ratio = non_smooth_parameters[5]; + + Kinematics = new NonSmoothControl(lambda,gamma); + + ROS_INFO("%s: %f", "Kinematic Controller Frequency: ", low_level_control_rate/update_ratio); + + return true; +} + +void TwistPIDBacksteppingController::starting(const ros::Time &) +{ + dphi_ref.setZero(); + dphi.setZero(); + Effort.setZero(); + u_ref.setZero(); + pose_ref = Odometer->getPose(); + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (makeLog == false) + { + std::string filename = "none"; + + if (robot_ns == "mini_twil") + { + filename = "/home/talves/Dropbox/Mini_Twil/ros/exp/" + log_date + "/backstepping_pid_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + else if (robot_ns == "twil") + { + filename = "/home/talves/Dropbox/Twil/ros/exp/" + log_date + "/backstepping_pid_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + } +#endif +} + +void TwistPIDBacksteppingController::update(const ros::Time &time, const ros::Duration &duration) +{ + static int kinematic_cycle = 0; + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + static int k = 0; + if (makeLog == true){ + if (this->fd.is_open()){ + if (k==0) + { + ROS_INFO("Starting the LOG for the '%s_robot'...",robot_ns.c_str()); + fd << "seq," << "dur," << "pose_ref1," << "pose_ref2," << "pose_ref3," << "pose1," << "pose2," + << "pose3," << "u_ref1," <<"u_ref2," << "nu_ref1," <<"nu_ref2," << "u1," << "u2," + << "eff1," << "eff2," << "dphi1," << "dphi2" << std::endl; + } + k++; + } + } +#endif + + /* --------------------------------------------------------------------------------------------------------------------- + * Nonlinear Pose Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + + Eigen::Vector2d error, joint_ang_vel; + + for (int i=0; i<2; i++) joint_ang_vel[i]=joints_[i].getVelocity(); + + /* + * dphi[0] equals to right joint velocity and + * dphi[1] equals to left joint velocity (as in the formulation). + * In ros the left joint is defined as 0 and right joint as 1 + * to correct the mismatch, a conversion denoted by dphi=[joint_ang_vel[1], joint_ang_vel[0]] is defined + */ + dphi << joint_ang_vel[1], joint_ang_vel[0]; + Eigen::Vector2d u = VelocityTransformation::WheelToBase(dphi,WheelBase,WheelRadius[0]); + + Odometer->compute(duration,u); + Eigen::Vector3d pose = Odometer->getPose(); + + if (++kinematic_cycle == update_ratio){ + kinematic_cycle = 0; +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Updating kinematic controller"); +#endif + + // if (!Kinematics->StopCondition(pose,pose_ref,10e-3,1e-2)){ + u_ref = Kinematics->compute(pose,pose_ref); // Here will be generated the linear and angular velocities setpoints + dphi_ref = VelocityTransformation::BaseToWheel(u_ref,WheelBase,WheelRadius[0]); + // } else dphi_ref.setZero(); + } + + /* --------------------------------------------------------------------------------------------------------------------- + * Velocity Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + + error[1] = dphi_ref[1]-dphi[1]; // Here will be computed left velocity error + error[0] = dphi_ref[0]-dphi[0]; // Here will be computed right velocity error + + /* + * To return to ros space joint numbers, the efforts are calculated as + * effort[0] equals to left joint effort and + * effort[1] equals to right joint effort + */ + + Effort[0] = PID[0].computeCommand(error[1],duration); // Here will be generated left wheel control effort + Effort[1] = PID[1].computeCommand(error[0],duration); // Here will be generated right wheel control effort + // Control Efforts ------------------------------------------------------------------------------------------------------ + joints_[0].setCommand(Effort[0]); // Here wil be applied the left control effort + joints_[1].setCommand(Effort[1]); // Here wil be applied the right control effort + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("uref[0]: %f; u[0]: %f",u_ref[0],u[0]); + ROS_INFO("uref[1]: %f; u[1]: %f",u_ref[1],u[1]); + ROS_INFO("Ref: {%f,%f,%f}; Pos: {%f,%f,%f}",pose_ref[0], pose_ref[1], pose_ref[2], pose[0], pose[1], pose[2]); +#endif + + + + Odometer->publish(); + +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + if (makeLog==true){ + if (k>0){ + fd << k << "," << duration.toSec() << "," << pose_ref[0] << "," << pose_ref[1] + << "," << pose_ref[2] << "," << pose[0] << "," << pose[1] << "," << pose[2] + << "," << u_ref[0] << "," << u_ref[1] << "," << 0 << "," << 0 << "," << u[0] << "," << u[1] + << "," << Effort[0] << "," << Effort[1] << "," << dphi[1] << "," << dphi[0] + << std::endl; + } + } +#endif +} + +void TwistPIDBacksteppingController::stopping(const ros::Time &) +{ +#ifdef TWIST_PID_BACKSTEPPING_CONTROLLER_DEBUG + fd.close(); +#endif + PositionSub[0].shutdown(); + PositionSub[1].shutdown(); + +} + + +void TwistPIDBacksteppingController::commandCB(const geometry_msgs::PoseStampedConstPtr &command) +{ + pose_ref[0] = command->pose.position.x; + pose_ref[1] = command->pose.position.y; + tf::Quaternion quat_aux(command->pose.orientation.x, + command->pose.orientation.y, + command->pose.orientation.z, + command->pose.orientation.w); + tf::Matrix3x3 m(quat_aux); + double roll, pitch, yaw; + m.getRPY(roll, pitch, yaw); + pose_ref[2] = yaw; +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Pose_ref: {%f, %f, %f}", pose_ref[0], pose_ref[1], pose_ref[2]); +#endif +} + +void TwistPIDBacksteppingController::command2dCB(const geometry_msgs::Pose2DConstPtr &command) +{ + // Eigen::Vector3d pose_vector_aux; + // pose_vector_aux[0] = command->x; + // pose_vector_aux[1] = command->y; + // pose_vector_aux[2] = command->theta; + // geometry_msgs::PoseWithCovariance pose_aux_ = conv_vector_to_pose(pose_vector_aux); + // pose_ref = conv_pose_to_vector(pose_aux_); + + pose_ref[0] = command->x; + pose_ref[1] = command->y; + pose_ref[2] = command->theta; + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("Pose_ref: {%f, %f, %f}", pose_ref[0], pose_ref[1], pose_ref[2]); +#endif +} + +} +PLUGINLIB_EXPORT_CLASS(twil_controllers::TwistPIDBacksteppingController,controller_interface::ControllerBase) + diff --git a/twil_controllers/src/twist_pid_controller.cpp b/twil_controllers/src/twist_pid_controller.cpp new file mode 100644 index 0000000..0502004 --- /dev/null +++ b/twil_controllers/src/twist_pid_controller.cpp @@ -0,0 +1,292 @@ +/****************************************************************************** + Twil Controllers + Twist PID Controller + + Copyright (C) 2017 Tiago G. Alves + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include "twil_controllers/twist_pid_controller.h" +#include +#include + +//#define URDF +//#define CONTROLLER_OUTPUT_SCREEN + + +namespace twil_controllers +{ +TwistPIDController::TwistPIDController(void) + : WheelRadius(2) {} + +TwistPIDController::~TwistPIDController() +{ + VelocitySub.~Subscriber(); + + PID[0].~Pid(); + PID[0].~Pid(); +} + +bool TwistPIDController::init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n) +{ + node_ = n; + robot_ = robot; + + if(!node_.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("Robot namespace: %s", robot_ns.c_str()); + + XmlRpc::XmlRpcValue joint_names; + if(!node_.getParam("joints",joint_names)) + { + ROS_ERROR("No 'joints' parameter in controller. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + if(joint_names.getType() != XmlRpc::XmlRpcValue::TypeArray) + { + ROS_ERROR("The 'joints' parameter is not a struct. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + for(int i=0; i < joint_names.size();i++) + { + XmlRpc::XmlRpcValue &name_value=joint_names[i]; + if(name_value.getType() != XmlRpc::XmlRpcValue::TypeString) + { + ROS_ERROR("Array of joint names should contain only strings. (namespace: %s)",node_.getNamespace().c_str()); + return false; + } + + hardware_interface::JointHandle j=robot->getHandle((std::string)name_value); + joints_.push_back(j); + } + + VelocitySub = node_.subscribe("cmd_vel",1,&TwistPIDController::commandCB,this); + +#ifdef URDF + std::string robot_desc_string; + if(!node_.getParam("/robot_description",robot_desc_string)) + { + ROS_ERROR("Could not find '/robot_description'."); + return false; + } + + KDL::Tree tree; + if (!kdl_parser::treeFromString(robot_desc_string,tree)) + { + ROS_ERROR("Failed to construct KDL tree."); + return false; + } + + // get wheelBase from URDF (actually from KDL tree) + KDL::SegmentMap::const_iterator segmentMapIter=tree.getSegment("left_wheel_support"); + KDL::Frame leftSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("right_wheel_support"); + KDL::Frame rightSupportFrame=segmentMapIter->second.segment.getFrameToTip(); + + WheelRadius.resize(joints_.size()); + WheelBase=leftSupportFrame(1,3)-rightSupportFrame(1,3); + + // get wheelRadius from URDF (actually from KDL tree) + segmentMapIter=tree.getSegment("chassis"); + KDL::Frame chassisFrame=segmentMapIter->second.segment.getFrameToTip(); + + segmentMapIter=tree.getSegment("left_wheel"); + KDL::Joint leftWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[0]=chassisFrame(2,3)+leftSupportFrame(2,3)+leftWheelJoint.JointOrigin().z(); + + segmentMapIter=tree.getSegment("right_wheel"); + KDL::Joint rightWheelJoint=segmentMapIter->second.segment.getJoint(); + WheelRadius[1]=chassisFrame(2,3)+rightSupportFrame(2,3)+rightWheelJoint.JointOrigin().z(); + + std::cout << "Wheel Radius: " << WheelRadius[0] << " - " << WheelRadius[1] << std::endl; + std::cout << "Wheel base: " << WheelBase << std::endl; + +#else + if (node_.getParam("/"+robot_ns+"/robot_baseline",WheelBase)) + ROS_INFO("Robot baseline: %f", WheelBase); + else ROS_ERROR("Failed to get param 'robot_baseline'"); + + if (node_.getParam("/" + robot_ns + "/wheel_radius",WheelRadius[0])){ + WheelRadius[1] = WheelRadius[0]; + ROS_INFO("Wheel Radius: %f", WheelRadius[1]); + } else ROS_ERROR("Failed to get param 'wheel_radius'"); +#endif + + /* + * Twist PID Controller Parameters + * --------------------------------------------------------------------------------------------------------------------- + */ + + if (!PID[0].init(ros::NodeHandle(node_, "left_wheel_joint_pid_parameters"))){ + ROS_ERROR("MyController could not construct PID controller for joint left_wheel_pid"); + return false; + } + + if (!PID[1].init(ros::NodeHandle(node_, "right_wheel_joint_pid_parameters"))){ + ROS_ERROR("MyController could not construct PID controller for joint right_wheel_pid"); + return false; + } + + double p, i, d, imin, imax; + bool awdup; + + PID[0].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Left PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + PID[1].getGains(p,i,d,imax,imin,awdup); + ROS_INFO("Right PID: {p: %f, i: %f, d: %f, imax: %f, imin: %f, awdup: %d", p, i, d, imin, imax, awdup); + + if (!node_.getParam("/log_date",log_date)){ + ROS_ERROR("Parameter '/log_date' not found! The log will be disabled..."); + log_date=""; + } + +#ifdef TWIST_PID_DEBUG + if (!node_.getParam("take",take)){ + ROS_ERROR("Execution take '%s/take' not found! The parameter will be assumed as '0'",node_.getNamespace().c_str()); + take = 0; + } +#endif + + return true; +} + +void TwistPIDController::starting(const ros::Time &time) +{ + dphi_ref.setZero(); + dphi.setZero(); + Effort.setZero(); + u_ref.setZero(); + +#ifdef TWIST_PID_DEBUG + if (makeLog == false) + { + std::string filename = "none"; + + if (robot_ns == "mini_twil") + { + filename = "/home/talves/Dropbox/Mini_Twil/ros/exp/" + log_date + "/twist_pid_0" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + else if (robot_ns == "twil") + { + filename = "/home/talves/Dropbox/Twil/ros/exp/" + log_date + "/twist_pid_01.txt" + std::to_string(take) + ".txt"; + ROS_INFO("Output File: %s", filename.c_str()); + fd.open(filename); + makeLog = true; + } + } +#endif +} + +void TwistPIDController::update(const ros::Time &time, const ros::Duration &duration) +{ +#ifdef TWIST_PID_DEBUG + static int k = 0; + if (makeLog==true){ + if (this->fd.is_open()){ + if (k==0) + { + ROS_INFO("Starting the LOG for the '%s_robot'...",robot_ns.c_str()); + fd << "seq," << "dur," << "u_ref1," <<"u_ref2," << "nu_ref1," <<"nu_ref2,"<< "u1," << "u2," << "eff1," << "eff2," << "dphi1," << "dphi2" << std::endl; + } + k++; + } + } +#endif + + /* --------------------------------------------------------------------------------------------------------------------- + * Velocity Controller + * --------------------------------------------------------------------------------------------------------------------- + */ + Eigen::Vector2d error, joint_ang_vel; + + // Compute Velocities + for(int i=0; i < joints_.size(); i++) joint_ang_vel[i]=joints_[i].getVelocity(); + + /* + * dphi[0] equals to right joint velocity and + * dphi[1] equals to left joint velocity (as in the formulation). + * In ros the left joint is defined as 0 and right joint as 1 + * to correct the mismatch, a conversion denoted by dphi=[joint_ang_vel[1], joint_ang_vel[0]] is defined + */ + dphi << joint_ang_vel[1], joint_ang_vel[0]; + + error[1] = dphi_ref[1]-dphi[1]; // Here will be computed left velocity error + error[0] = dphi_ref[0]-dphi[0]; // Here will be computed right velocity error + + /* + * To return to ros space joint numbers, the efforts are calculated as + * effort[0] equals to left joint effort and + * effort[1] equals to right joint effort + */ + + Effort[0] = PID[0].computeCommand(error[1],duration); // Here will be generated left wheel control effort + Effort[1] = PID[1].computeCommand(error[0],duration); // Here will be generated right wheel control effort + + joints_[0].setCommand(Effort[0]); // Here wil be applied the left control effort + joints_[1].setCommand(Effort[1]); // Here wil be applied the right control effort + + Eigen::Vector2d u = VelocityTransformation::WheelToBase(dphi,WheelBase,WheelRadius[0]); + +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("uref[0]: %f; u[0]: %f",u_ref[0],u[0]); + ROS_INFO("uref[1]: %f; u[1]: %f",u_ref[1],u[1]); +#endif + + +#ifdef TWIST_PID_DEBUG + if (makeLog==true){ + if (k>0){ + fd << k << ","<< duration.toSec() << "," << u_ref[0] << "," << u_ref[1] << "," << 0 << "," << 0 << "," << u[0] << "," << u[1] << "," + << Effort[0] << "," << Effort[1] << "," << dphi[1] << "," << dphi[0] << std::endl; + } + } +#endif +} + +void TwistPIDController::stopping() +{ +#ifdef TWIST_PID_DEBUG + fd.close(); +#endif + VelocitySub.shutdown(); +} + +void TwistPIDController::commandCB(const geometry_msgs::TwistConstPtr &CommandVel) +{ + u_ref.setZero(); + u_ref[0] = CommandVel->linear.x; + u_ref[1] = CommandVel->angular.z; + + dphi_ref = VelocityTransformation::BaseToWheel(u_ref,WheelBase,WheelRadius[0]); +#ifdef CONTROLLER_OUTPUT_SCREEN + ROS_INFO("u_ref: {%f, %f}", u_ref[0], u_ref[1]); +#endif +} +} + +PLUGINLIB_EXPORT_CLASS(twil_controllers::TwistPIDController, controller_interface::ControllerBase) diff --git a/twil_controllers/twil_controllers_plugins.xml b/twil_controllers/twil_controllers_plugins.xml new file mode 100644 index 0000000..836f348 --- /dev/null +++ b/twil_controllers/twil_controllers_plugins.xml @@ -0,0 +1,39 @@ + + + + + Blá-blá-blá... + + + + + + Blá-blá-blá... + + + + + + Blá-blá-blá... + + + + + + Blá-blá-blá... + + + + + + Blá-blá-blá... + + + + + + Blá-blá-blá... + + + + diff --git a/twil_description/CMakeLists.txt b/twil_description/CMakeLists.txt new file mode 100644 index 0000000..b28a957 --- /dev/null +++ b/twil_description/CMakeLists.txt @@ -0,0 +1,156 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil_description) + +## 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) + +## 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 and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependencies might have been +## pulled in transitively but can be declared for certainty nonetheless: +## * add a build_depend tag for "message_generation" +## * 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 +# 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 # Or other packages containing msgs +# ) + +################################### +## 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 twil_description +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) + +## Declare a cpp library +# add_library(twil_description +# src/${PROJECT_NAME}/twil_description.cpp +# ) + +## Declare a cpp executable +# add_executable(twil_description_node src/twil_description_node.cpp) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +# add_dependencies(twil_description_node twil_description_generate_messages_cpp) + +## Specify libraries to link a library or executable target against +# target_link_libraries(twil_description_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 twil_description twil_description_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_twil_description.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/twil_description/bkp/twil_description.tar.gz b/twil_description/bkp/twil_description.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9ec1b75bb1399097f185aa0a0b9c2fb39a8c220c GIT binary patch literal 154801 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 r(sdB<@TkWN0$;Kj##; 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 Qz^InzP+Fp=St7>#AHS$EdH?_b literal 0 HcmV?d00001 diff --git a/twil_description/meshes/castor_base.stl b/twil_description/meshes/castor_base.stl new file mode 100644 index 0000000000000000000000000000000000000000..d7cc923055212587bcbb32c4ece5c1cf7b6a04d1 GIT binary patch literal 17484 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 literal 0 HcmV?d00001 diff --git a/twil_description/meshes/castor_wheel.stl b/twil_description/meshes/castor_wheel.stl new file mode 100644 index 0000000000000000000000000000000000000000..718450c9dca0929770a5f40380d1d502624754ff GIT binary patch literal 40184 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 literal 0 HcmV?d00001 diff --git a/twil_description/meshes/chassis.stl b/twil_description/meshes/chassis.stl new file mode 100644 index 0000000000000000000000000000000000000000..57c9257cde5ca392205079e83748351ce5c9e928 GIT binary patch literal 153284 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 literal 0 HcmV?d00001 diff --git a/twil_description/meshes/fixed_wheel_support.stl b/twil_description/meshes/fixed_wheel_support.stl new file mode 100644 index 0000000000000000000000000000000000000000..e9500ca6bdcf300362004bec4f782ad0de4209e1 GIT binary patch literal 76584 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 literal 0 HcmV?d00001 diff --git a/twil_description/package.xml b/twil_description/package.xml new file mode 100644 index 0000000..ae98f35 --- /dev/null +++ b/twil_description/package.xml @@ -0,0 +1,54 @@ + + + twil_description + 2.0.0 + The twil_description package + + + + + Walter Fetter Lages + + + + + + GPLv3 + + + + + + + + + + + + + Walter Fetter Lages + + + + + + + + + + + + + + catkin + + + + + + + + + + + diff --git a/twil_description/xacro/battery_bosch_12v.urdf.xacro b/twil_description/xacro/battery_bosch_12v.urdf.xacro new file mode 100644 index 0000000..289089b --- /dev/null +++ b/twil_description/xacro/battery_bosch_12v.urdf.xacro @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/FlatBlack + + + + + diff --git a/twil_description/xacro/castor_base.urdf.xacro b/twil_description/xacro/castor_base.urdf.xacro new file mode 100644 index 0000000..9271976 --- /dev/null +++ b/twil_description/xacro/castor_base.urdf.xacro @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/White + + + + + + diff --git a/twil_description/xacro/castor_support.urdf.xacro b/twil_description/xacro/castor_support.urdf.xacro new file mode 100644 index 0000000..b5c86d0 --- /dev/null +++ b/twil_description/xacro/castor_support.urdf.xacro @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Grey + + + + + diff --git a/twil_description/xacro/castor_wheel.urdf.xacro b/twil_description/xacro/castor_wheel.urdf.xacro new file mode 100644 index 0000000..21172a2 --- /dev/null +++ b/twil_description/xacro/castor_wheel.urdf.xacro @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Grey + + + + + diff --git a/twil_description/xacro/chassis.urdf.xacro b/twil_description/xacro/chassis.urdf.xacro new file mode 100644 index 0000000..dc9e36c --- /dev/null +++ b/twil_description/xacro/chassis.urdf.xacro @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Gold + + + + + diff --git a/twil_description/xacro/cpu.urdf.xacro b/twil_description/xacro/cpu.urdf.xacro new file mode 100644 index 0000000..dcc4a58 --- /dev/null +++ b/twil_description/xacro/cpu.urdf.xacro @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Grey + + + + + diff --git a/twil_description/xacro/eurocard.urdf.xacro b/twil_description/xacro/eurocard.urdf.xacro new file mode 100644 index 0000000..b28b461 --- /dev/null +++ b/twil_description/xacro/eurocard.urdf.xacro @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Green + + + + + diff --git a/twil_description/xacro/fixed_wheel.urdf.xacro b/twil_description/xacro/fixed_wheel.urdf.xacro new file mode 100644 index 0000000..91bd915 --- /dev/null +++ b/twil_description/xacro/fixed_wheel.urdf.xacro @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transmission_interface/SimpleTransmission" + + EffortJointInterface + + EffortJointInterface + 1 + + + + Gazebo/FlatBlack + + + + + diff --git a/twil_description/xacro/fixed_wheel_support.urdf.xacro b/twil_description/xacro/fixed_wheel_support.urdf.xacro new file mode 100644 index 0000000..1346e56 --- /dev/null +++ b/twil_description/xacro/fixed_wheel_support.urdf.xacro @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + /> + + + + + + + + + + + + + + + + + + Gazebo/White + + + + + diff --git a/twil_description/xacro/twil.urdf.xacro b/twil_description/xacro/twil.urdf.xacro new file mode 100644 index 0000000..ebc8381 --- /dev/null +++ b/twil_description/xacro/twil.urdf.xacro @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /twil + + + + + + + + 0.001 + + + + + diff --git a/twil_description/xacro/twil_real.urdf.xacro b/twil_description/xacro/twil_real.urdf.xacro new file mode 100644 index 0000000..97e9bb7 --- /dev/null +++ b/twil_description/xacro/twil_real.urdf.xacro @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/twil_hw/CMakeLists.txt b/twil_hw/CMakeLists.txt new file mode 100644 index 0000000..5f616dc --- /dev/null +++ b/twil_hw/CMakeLists.txt @@ -0,0 +1,85 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil_hw) + +add_definitions(-std=c++11) + +find_package(catkin REQUIRED COMPONENTS + controller_interface + controller_manager + std_msgs + hardware_interface + joint_state_controller + roscpp + rospy +) +find_package(cmake_modules REQUIRED) + + +catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME}_lib + CATKIN_DEPENDS controller_interface controller_manager hardware_interface joint_state_controller roscpp rospy + DEPENDS aic_lib +) + +########### +## Build ## +########### + + +SET (AIC_LIB_ROOT_DIR $ENV{HOME}/twil_ws/src/ufrgs_aic/aic_lib) + + +# header files +include_directories( + ${AIC_LIB_ROOT_DIR}/include +) + +# Find source files +file(GLOB SOURCES ${AIC_LIB_ROOT_DIR}/src/*.cpp) + +# Create shared library +add_library(aic_lib ${SOURCES}) + + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) +include_directories( + include + ${catkin_INCLUDE_DIRS} + include/${PROJECT_NAME} + ${AIC_LIB_ROOT_DIR}/include +) + +add_library(${PROJECT_NAME}_lib + src/twil_hw.cpp + ) + +# add_executable(${PROJECT_NAME}_node src/twil_hw.cpp) + target_link_libraries(${PROJECT_NAME}_lib + ${catkin_LIBRARIES} + aic_lib + ) + +add_executable(${PROJECT_NAME}_node src/${PROJECT_NAME}_node.cpp) +target_link_libraries(twil_hw_node ${catkin_LIBRARIES} aic_lib twil_hw_lib) + + +############# +## Install ## +############# + +## Mark executables and/or libraries for installation +install(TARGETS twil_hw_lib aic_lib twil_hw_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}/ ${AIC_LIB_ROOT_DIR}/include + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE +) diff --git a/twil_hw/include/twil_hw/twil_hw.h b/twil_hw/include/twil_hw/twil_hw.h new file mode 100644 index 0000000..0a3ad93 --- /dev/null +++ b/twil_hw/include/twil_hw/twil_hw.h @@ -0,0 +1,47 @@ +#ifndef TWIL_HW_H +#define TWIL_HW_H + +#include +#include +#include +#include +#include + +#include "aic.h" +#include + +namespace twil_hw +{ + +class twil_hw : public hardware_interface::RobotHW +{ +public: + twil_hw(); + ~twil_hw(); + bool init(ros::NodeHandle &root_nh, ros::NodeHandle &robot_hw_nh); + void read(const ros::Time& time, const ros::Duration& period); + void write(const ros::Time& time, const ros::Duration& period); + + +private: + hardware_interface::JointStateInterface jnt_state_interface; + hardware_interface::EffortJointInterface effort_joint_interface; + + double cmd[2]; + double prev_cmd[2]; + double pos[2]; + double vel[2]; + double eff[2]; + double pos_dead_zone[2]; + double neg_dead_zone[2]; + bool dead_zone_compensation[2]; + + aic *wheel_joint[2]; + aic_displacement_msg_t displacement_status[2]; + aic_comm_config_t connection_parameters[2]; + ros::NodeHandle nh; + + +}; +} +#endif // TWIL_HW_H diff --git a/twil_hw/package.xml b/twil_hw/package.xml new file mode 100644 index 0000000..ebe47c4 --- /dev/null +++ b/twil_hw/package.xml @@ -0,0 +1,62 @@ + + + twil_hw + 0.0.0 + The twil_hw package + + + + + talves + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + controller_interface + controller_manager + hardware_interface + joint_state_controller + roscpp + rospy + controller_interface + controller_manager + hardware_interface + joint_state_controller + roscpp + rospy + + + + + + + + diff --git a/twil_hw/scripts/export_motor_test.sh b/twil_hw/scripts/export_motor_test.sh new file mode 100755 index 0000000..bbc13b5 --- /dev/null +++ b/twil_hw/scripts/export_motor_test.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +echo "USAGE: ./export_motor_test -f file.bag -t topic_root -o output_root" + +while getopts f:t:o: option +do + case "${option}" + in + f) FILE=${OPTARG};; + t) TOPIC_ROOT=${OPTARG};; + o) OUTPUT=${OPTARG};; + esac +done + +set -x +echo "Joint_States_File:" $OUTPUT"_joint_states.dat" +rostopic echo -b $FILE -p /$TOPIC_ROOT/joint_states > $OUTPUT"_joint_states.dat" +echo "Left_Motor_CMD_File:" $OUTPUT"_left_wheel.dat" +rostopic echo -b $FILE -p /$TOPIC_ROOT/left_wheel_joint_effort_controller/command > $OUTPUT"_left_wheel.dat" +echo "Right_Motor_CMD_File:" $OUTPUT"_right_wheel.dat" +rostopic echo -b $FILE -p /$TOPIC_ROOT/right_wheel_joint_effort_controller/command > $OUTPUT"_right_wheel.dat" diff --git a/twil_hw/src/twil_hw.cpp b/twil_hw/src/twil_hw.cpp new file mode 100644 index 0000000..8d6273b --- /dev/null +++ b/twil_hw/src/twil_hw.cpp @@ -0,0 +1,181 @@ +#include "twil_hw.h" + +//#define AIC_HW_DEBUG +//#define NULL_HW + +namespace twil_hw +{ + +twil_hw::twil_hw() +{ + cmd[0] = 0; + cmd[1] = 0; + prev_cmd[0] = -1000; + prev_cmd[1] = -1000; + // prev_cmd[0] = 0; + // prev_cmd[1] = 0; + eff[0] = 0; + eff[1] = 0; + pos[0] = 0; + pos[1] = 0; + vel[0] = 0; + vel[1] = 0; + dead_zone_compensation[0] = 0; + dead_zone_compensation[1] = 0; +} + +twil_hw::~twil_hw() +{ + effort_joint_interface.~HardwareInterface(); + jnt_state_interface.~HardwareInterface(); + +#ifndef NULL_HW +#ifdef AIC_HW_DEBUG + for (int i = 0; i < 1; i++) +#else + for (int i = 0; i < 2; i++) +#endif + { + wheel_joint[i]->~aic(); + } +#endif +} + +bool twil_hw::init(ros::NodeHandle &root_nh, ros::NodeHandle &robot_hw_nh) { + + + nh = robot_hw_nh; + std::string joint_side[] = {"left_wheel_joint/","right_wheel_joint/"}; + +#ifdef AIC_HW_DEBUG + for (int i = 0; i < 1; i++) +#else + for (int i = 0; i < 2; i++) +#endif + { + if (nh.getParam(joint_side[i]+"aic_com_device",connection_parameters[i].aic_comm_device)) + { + ROS_INFO("%scom_device: %d", joint_side[i].c_str(), (connection_parameters[i].aic_comm_device)); + if (connection_parameters[i].aic_comm_device == rs232) + { + // ROS_INFO("SERIAL CONNECTION!\n"); + if (nh.getParam(joint_side[i]+"serial_port",connection_parameters[i].aic_serial_port)) + ROS_INFO("%sserial_port: %s", joint_side[i].c_str(), (connection_parameters[i].aic_serial_port).c_str()); + else ROS_ERROR("Failed to get param '%sserial_port'", joint_side[i].c_str()); + + } else if (connection_parameters[i].aic_comm_device == socketcan) + { + // if (nh.getParam(joint_side[i]+"can_iface",connection_parameters[i].aic_can_iface)) + // ROS_INFO("%scan_iface: %d", joint_side[i].c_str(), (connection_parameters[i].aic_can_iface)); + // else ROS_ERROR("Failed to get param '%scan_iface'", joint_side[i].c_str()); + + if (nh.getParam(joint_side[i]+"can_id_number",connection_parameters[i].aic_can_id_number)) + ROS_INFO("%s_canid_number: %d", joint_side[i].c_str(), (connection_parameters[i].aic_can_id_number)); + else ROS_ERROR("Failed to get param '%scan_id_number'", joint_side[i].c_str()); + } + else ROS_ERROR("ERROR IN CONNECTION PARAMETERS for '%s'!", joint_side[i].c_str()); +#ifndef NULL_HW + wheel_joint[i] = new aic(connection_parameters[i]); + usleep(500); +#endif + + } + else ROS_ERROR("Failed to get param '%saic_com_device'", joint_side[i].c_str()); + + if (nh.getParam(joint_side[i]+"dead_zone_compensation",dead_zone_compensation[i])) + { + ROS_INFO("Dead Zone Comp. for '%s': '%i'", joint_side[i].c_str(), dead_zone_compensation[i]); + if (dead_zone_compensation[i] == true) + { + if (nh.getParam(joint_side[i]+"neg_dead_zone",neg_dead_zone[i])) + ROS_INFO("%snegative_dead_zone: %f", joint_side[i].c_str(), (neg_dead_zone[i])); + else ROS_ERROR("Failed to get param '%snegative_dead_zone'", joint_side[i].c_str()); + + if (nh.getParam(joint_side[i]+"pos_dead_zone",pos_dead_zone[i])) + ROS_INFO("%spositive_dead_zone: %f", joint_side[i].c_str(), (pos_dead_zone[i])); + else ROS_ERROR("Failed to get param '%spositive_dead_zone'", joint_side[i].c_str()); + } + + } + else ROS_ERROR("Failed to get param '%sdead_zone_compensation'", joint_side[i].c_str()); +#ifndef NULL_HW + if (wheel_joint[i]->status_ok() == false) { + ROS_ERROR("AIC %d NOT CONNECTED!", i+1); + return false; + } +#endif + } + + // connect and register the joint state interface + hardware_interface::JointStateHandle state_handle_left("left_wheel_joint", &pos[0], &vel[0], &eff[0]); + jnt_state_interface.registerHandle(state_handle_left); + hardware_interface::JointStateHandle state_handle_right("right_wheel_joint", &pos[1], &vel[1], &eff[1]); + jnt_state_interface.registerHandle(state_handle_right); + registerInterface(&jnt_state_interface); + + + // connect and register the joint position interface + hardware_interface::JointHandle eff_handle_left(jnt_state_interface.getHandle("left_wheel_joint"), &cmd[0]); + effort_joint_interface.registerHandle(eff_handle_left); + hardware_interface::JointHandle eff_handle_right(jnt_state_interface.getHandle("right_wheel_joint"), &cmd[1]); + effort_joint_interface.registerHandle(eff_handle_right); + registerInterface(&effort_joint_interface); + return true; +} + +void twil_hw::read(const ros::Time &time, const ros::Duration &period) +{ +#ifndef NULL_HW + displacement_status[0] = wheel_joint[0]->read_displacement_sensors(); +#ifndef AIC_HW_DEBUG + displacement_status[1] = wheel_joint[1]->read_displacement_sensors(); +#endif + pos[0] += displacement_status[0].joint_displacement; + pos[1] += displacement_status[1].joint_displacement; + vel[0] = displacement_status[0].joint_displacement/period.toSec(); + vel[1] = displacement_status[1].joint_displacement/period.toSec(); +#endif +} + +void twil_hw::write(const ros::Time &time, const ros::Duration &period) +{ + double Va[2]; // Armature Voltage Without dead zone compensation + double Vmotor[2]; // Armature Voltage after dead zone compensation + double Vref = 12.00; // Voltage Reference for duty cycle + double Vbat = 12.00; // + + Va[0] = cmd[0]*(Vbat/Vref); + Va[1] = cmd[1]*(Vbat/Vref); + +#ifndef NULL_HW + +#ifdef AIC_HW_DEBUG + for (int i = 0; i < 1; i++) { +#else + for (int i = 0; i < 2; i++) { +#endif + + if(dead_zone_compensation[i] == true) + { + if (cmd[i] > 0){ + Vmotor[i] = (Va[i]+pos_dead_zone[i])*(Vref/(Vref+abs(pos_dead_zone[i]))); + } else if (cmd[i] < 0) { + Vmotor[i] = (Va[i]+neg_dead_zone[i])*(Vref/(Vref+abs(neg_dead_zone[i]))); + } else Vmotor[i] = 0; + + if (abs(Vmotor[i]) < 0.2) Vmotor[i] = 0; // Used to reduce jerk motion near 0V. + + } else Vmotor[i] = Va[i]; + + if (Vmotor[i] > Vref) Vmotor[i] = Vref; + else if (Vmotor[i] < -Vref) Vmotor[i] = -Vref; + + wheel_joint[i]->set_motor_voltage(Vmotor[i]); +#endif + } + + eff[0] = cmd[0]; + eff[1] = cmd[1]; +} + +} diff --git a/twil_hw/src/twil_hw_node.cpp b/twil_hw/src/twil_hw_node.cpp new file mode 100644 index 0000000..f2642c2 --- /dev/null +++ b/twil_hw/src/twil_hw_node.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include "twil_hw/twil_hw.h" + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "twil_hw_node"); + ros::NodeHandle nh; + std::string robot_ns; + + if(!nh.getParam("/robot_config",robot_ns)) + { + ROS_ERROR("Could not find Robot namespace in '/robot_config'."); + return false; + } else ROS_INFO("->\nRobot namespace: %s\n->", robot_ns.c_str()); + + double control_rate = 0.0; + if(nh.getParam("control_loop_rate", control_rate)) { + ROS_INFO("Twil_Control Frequency: %fHz", control_rate); + } else { + ROS_ERROR("Failed to get param '/%s/control_loop_rate'!\n Used default value = 10Hz", robot_ns.c_str()); + control_rate = 10.0; + } + + ros::Duration dt; + std_msgs::Duration msg; + boost::scoped_ptr< realtime_tools::RealtimePublisher >ts_pub; + ts_pub.reset(new realtime_tools::RealtimePublisher(nh,"sample_time",1)); + + twil_hw::twil_hw robot; + robot.init(nh, nh); + ROS_INFO("Starting the Hardware and Control Loop Manager!"); + controller_manager::ControllerManager cm(&robot); + ros::AsyncSpinner spinner(1); spinner.start(); + + ros::Rate loop_rate(control_rate); + + ros::Time last_time = ros::Time::now(), current_time; + while (ros::ok()) + { + // Updates Sample Time informations + current_time = ros::Time::now(); + dt = current_time - last_time; + last_time = current_time; + + // ros::Time read_tick = ros::Time::now(); + robot.read(current_time,dt); + // ros::Duration toc_read = ros::Time::now() - read_tick; + cm.update(current_time, dt); + robot.write(current_time,dt); + // msg.data = toc_read; + + if (ts_pub->trylock()) { + ts_pub->msg_.data = dt; + ts_pub->unlockAndPublish(); + } + loop_rate.sleep(); + } + + spinner.stop(); + robot.~twil_hw(); + + return 0; +} diff --git a/twil_trajectories/CMakeLists.txt b/twil_trajectories/CMakeLists.txt new file mode 100644 index 0000000..3c2670f --- /dev/null +++ b/twil_trajectories/CMakeLists.txt @@ -0,0 +1,184 @@ +cmake_minimum_required(VERSION 2.8.3) +project(twil_trajectories) + +## 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) + +find_package(cmake_modules REQUIRED) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) +find_package(Eigen REQUIRED) + + +## 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 and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependencies might have been +## pulled in transitively but can be declared for certainty nonetheless: +## * add a build_depend tag for "message_generation" +## * 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 +# 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 # Or other packages containing msgs +# ) + +################################### +## 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 ${PROJECT_NAME} +# CATKIN_DEPENDS other_catkin_pkg + DEPENDS eigen +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) +# TODO: Check names of system library include directories (eigen) +include_directories( + include ${catkin_INCLUDE_DIRS} + ${Eigen_INCLUDE_DIRS} +) + +## Declare a cpp library +add_library(${PROJECT_NAME} + src/circle_path.cpp + src/eight_path.cpp +) + +## Declare a cpp executable +add_executable(eight_trajectory src/eight_trajectory.cpp) +add_executable(circle_trajectory src/circle_trajectory.cpp) +add_executable(pose2d_stamp src/pose2d_stamp.cpp) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +# add_dependencies(twil_trajectories_node twil_trajectories_generate_messages_cpp) + +## Specify libraries to link a library or executable target against +target_link_libraries(${PROJECT_NAME} + ${catkin_LIBRARIES} + ${eigen_LIBRARIES} +) + +target_link_libraries(eight_trajectory + ${catkin_LIBRARIES} + ${eigen_LIBRARIES} + ${PROJECT_NAME} +) + +target_link_libraries(circle_trajectory + ${catkin_LIBRARIES} + ${eigen_LIBRARIES} + ${PROJECT_NAME} +) + +target_link_libraries(pose2d_stamp + ${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 ${PROJECT_NAME} + 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_twil_trajectories.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/twil_trajectories/include/twil_trajectories/circle_path.h b/twil_trajectories/include/twil_trajectories/circle_path.h new file mode 100644 index 0000000..4c16412 --- /dev/null +++ b/twil_trajectories/include/twil_trajectories/circle_path.h @@ -0,0 +1,56 @@ +#ifndef CIRCLE_PATH_H +#define CIRCLE_PATH_H + +#include + +/** Circle path +* @author Walter Fetter Lages +*/ +class CirclePath +{ + Eigen::Vector2d pc_; + double phi0_; + double r_; + double w_; + + public: + + /** Build a circle path. + * @param pc circle center point. + * @param phi0 initial phase. + * @param r circle radius. + * @param w angular velocity. + */ + CirclePath(const Eigen::Vector2d &pc,double phi0,double r,double w); + + /** Build a circle path. + * @param p0 starting pose. + * @param r circle radius. + * @param w angular velocity. + */ + CirclePath(const Eigen::Vector3d &p0,double r,double w); + + /** Build a circle path. + * @param pc circle center point. + * @param p0 starting point. + * @param w angular velocity. + */ + CirclePath(const Eigen::Vector2d &pc,Eigen::Vector2d &p0,double w); + + /** Destroy a circle path. + */ + ~CirclePath(void) { }; + + /** Get path point. + * @param t path time. + * @return path point. + */ + Eigen::Vector3d point(double t) const; + + /** Get path steering controls. + * @param t path time. + * @return steering controls. + */ + Eigen::Vector2d steering(double t) const; +}; +#endif diff --git a/twil_trajectories/include/twil_trajectories/eight_path.h b/twil_trajectories/include/twil_trajectories/eight_path.h new file mode 100644 index 0000000..b3f5af2 --- /dev/null +++ b/twil_trajectories/include/twil_trajectories/eight_path.h @@ -0,0 +1,40 @@ +#ifndef EIGHT_PATH_H +#define EIGHT_PATH_H + +#include + +/** 8 path +* @author Walter Fetter Lages +*/ +class EightPath +{ + CirclePath c1_; + CirclePath c2_; + double period_; + + public: + + /** Build an 8 path. + * @param pc center point. + * @param r radius. + * @param w angular velocity. + */ + EightPath(const Eigen::Vector2d &pc,double r,double w); + + /** Destroy an 8 path. + */ + ~EightPath(void) { }; + + /** Get path point. + * @param t path time. + * @return path point. + */ + Eigen::Vector3d point(double t) const; + + /** Get path steering controls. + * @param t path time. + * @return steering controls. + */ + Eigen::Vector2d steering(double t) const; +}; +#endif diff --git a/twil_trajectories/package.xml b/twil_trajectories/package.xml new file mode 100644 index 0000000..8545852 --- /dev/null +++ b/twil_trajectories/package.xml @@ -0,0 +1,58 @@ + + + twil_trajectories + 2.0.0 + The twil_trajectories package + + + + + Walter Fetter Lages + + + + + + GPLv3 + + + + + + + + + + + + + Walter Fetter Lages + + + + + + + + + + + + + + catkin + eigen + geometry_msgs + + eigen + geometry_msgs + + + + + + + + + + diff --git a/twil_trajectories/src/circle_path.cpp b/twil_trajectories/src/circle_path.cpp new file mode 100644 index 0000000..8c7c805 --- /dev/null +++ b/twil_trajectories/src/circle_path.cpp @@ -0,0 +1,51 @@ +#include + +#define sqr(x) (x*x) +#define sgn(x) ((x == 0.0)? 0.0:(x/fabs(x))) + +CirclePath::CirclePath(const Eigen::Vector2d &pc,double phi0,double r,double w) +{ + pc_=pc; + phi0_=phi0; + r_=r; + w_=w; +} + +CirclePath::CirclePath(const Eigen::Vector3d &p0,double r,double w) +{ + phi0_=p0[2]-sgn(w)*M_PI_2; + pc_[0]=p0[0]-r*cos(phi0_); + pc_[1]=p0[1]-r*sin(phi0_); + r_=r; + w_=w; +} + +CirclePath::CirclePath(const Eigen::Vector2d &pc,Eigen::Vector2d &p0,double w) +{ + pc_=pc; + w_=w; + phi0_=atan2(p0[1]-pc[1],p0[0]-pc[0]); + r_=sqrt(sqr(p0[1]-pc[1])+sqr(p0[0]-pc[0])); +} + +Eigen::Vector3d CirclePath::point(double t) const +{ + double wt=w_*t; + Eigen::Vector3d p; + + p[0]=pc_[0]+r_*cos(wt+phi0_); + p[1]=pc_[1]+r_*sin(wt+phi0_); + p[2]=wt+phi0_+sgn(w_)*M_PI_2; + + return p; +} + +Eigen::Vector2d CirclePath::steering(double t) const +{ + Eigen::Vector2d e(2); + + e[0]=w_*r_; + e[1]=w_; + + return e; +} diff --git a/twil_trajectories/src/circle_trajectory.cpp b/twil_trajectories/src/circle_trajectory.cpp new file mode 100644 index 0000000..1c42f8f --- /dev/null +++ b/twil_trajectories/src/circle_trajectory.cpp @@ -0,0 +1,100 @@ +#include +#include + +#include + + +double rate; +class CircleTrajectory +{ +public: + CircleTrajectory(ros::NodeHandle node); + ~CircleTrajectory(void); + void setCommand(ros::Duration t); + double loop_rate; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + private: + ros::NodeHandle node_; + const CirclePath *path; + + ros::Publisher commandPublisher,commandPublisher2; +}; + + +CircleTrajectory::CircleTrajectory(ros::NodeHandle node) +{ + + node_=node; + Eigen::Vector2d pc; + double w; + double r; + double phi0; + + std::string robot_config; + + if (node_.getParam("/robot_config", robot_config)) ROS_INFO("Got param 'robot_config': %s", robot_config.c_str()); + else ROS_ERROR("Failed to get param '/robot_config'"); + + if (node_.getParam("robot_trajectory_path/pc_x", pc[0])) ROS_INFO("Got param 'pc_x': %f", pc[0]); + else ROS_ERROR("Failed to get param '%s/pc_x'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/pc_y", pc[1])) ROS_INFO("Got param 'pc_y': %f", pc[1]); + else ROS_ERROR("Failed to get param '%s/pc_y'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/phi0", phi0)) ROS_INFO("Got param 'phi0': %f", phi0); + else ROS_ERROR("Failed to get param '%s/phi0'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/r", r)) ROS_INFO("Got param 'r': %f", r); + else ROS_ERROR("Failed to get param '%s/r'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/w", w)) ROS_INFO("Got param 'w': %f", w); + else ROS_ERROR("Failed to get param '%s/w'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/loop_rate", loop_rate)) ROS_INFO("Got param 'loop_rate': %f", loop_rate); + else ROS_ERROR("Failed to get param '%s/loop_rate'",node_.getNamespace().c_str()); + + commandPublisher=node_.advertise("/"+robot_config+"/twist_pid_backstepping_controller/cmd_pos2d",1); + commandPublisher2=node_.advertise("/"+robot_config+"/dynamics_pid_backstepping_controller/cmd_pos2d",1); + + path=new CirclePath(pc,phi0,r,w); +} + +CircleTrajectory::~CircleTrajectory(void) +{ + commandPublisher.shutdown(); + delete path; +} + +void CircleTrajectory::setCommand(ros::Duration t) +{ + Eigen::Vector3d p=path->point(t.toSec()); + + geometry_msgs::Pose2D command; + command.x=p[0]; + command.y=p[1]; + command.theta=p[2]; + commandPublisher.publish(command); + commandPublisher2.publish(command); +} + +int main(int argc,char* argv[]) +{ + + ros::init(argc,argv,"circle_trajectory"); + ros::NodeHandle node; + + CircleTrajectory CircleTrajectory(node); + + ros::Rate loop(CircleTrajectory.loop_rate); + + ros::Time t0=ros::Time::now(); + while(ros::ok()) + { + CircleTrajectory.setCommand(ros::Time::now()-t0); + + ros::spinOnce(); + loop.sleep(); + } + return 0; +} diff --git a/twil_trajectories/src/eight_path.cpp b/twil_trajectories/src/eight_path.cpp new file mode 100644 index 0000000..3a7603f --- /dev/null +++ b/twil_trajectories/src/eight_path.cpp @@ -0,0 +1,26 @@ +#include + +#define sgn(x) ((x == 0.0)? 0.0:(x/fabs(x))) + +EightPath::EightPath(const Eigen::Vector2d &pc,double r,double w): +c1_(Eigen::Vector2d(pc[0],pc[1]+r),-M_PI_2*sgn(w),r,w), +c2_(Eigen::Vector2d(pc[0],pc[1]-r),2.5*M_PI*sgn(w),r,-w) +{ + period_=4*M_PI/w; +}; + +Eigen::Vector3d EightPath::point(double t) const +{ + double tc=fmod(t,period_/2.0); + + if(int(t/(period_/2.0)) % 2 == 0) return c1_.point(tc); + else return c2_.point(tc); +} + +Eigen::Vector2d EightPath::steering(double t) const +{ + double tc=fmod(t,period_/2.0); + + if(int(t/(period_/2.0)) % 2 == 0) return c1_.steering(tc); + else return c2_.steering(tc); +} diff --git a/twil_trajectories/src/eight_trajectory.cpp b/twil_trajectories/src/eight_trajectory.cpp new file mode 100644 index 0000000..1be794f --- /dev/null +++ b/twil_trajectories/src/eight_trajectory.cpp @@ -0,0 +1,94 @@ +#include +#include + +#include + + +double rate; +class EightTrajectory +{ + public: + EightTrajectory(ros::NodeHandle node); + ~EightTrajectory(void); + void setCommand(ros::Duration t); + double loop_rate; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + private: + ros::NodeHandle node_; + const EightPath *path; + + ros::Publisher commandPublisher,commandPublisher2; +}; + + +EightTrajectory::EightTrajectory(ros::NodeHandle node) +{ + node_=node; + Eigen::Vector2d pc; + double w; + double r; + std::string robot_config; + + if (node_.getParam("/robot_config", robot_config)) ROS_INFO("Got param 'robot_config': %s", robot_config.c_str()); + else ROS_ERROR("Failed to get param '/robot_config'"); + + if (node_.getParam("robot_trajectory_path/pc_x", pc[0])) ROS_INFO("Got param 'pc_x': %f", pc[0]); + else ROS_ERROR("Failed to get param '%s/pc_x'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/pc_y", pc[1])) ROS_INFO("Got param 'pc_y': %f", pc[1]); + else ROS_ERROR("Failed to get param '%s/pc_y'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/r", r)) ROS_INFO("Got param 'r': %f", r); + else ROS_ERROR("Failed to get param '%s/r'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/w", w)) ROS_INFO("Got param 'w': %f", w); + else ROS_ERROR("Failed to get param '%s/w'",node_.getNamespace().c_str()); + + if (node_.getParam("robot_trajectory_path/loop_rate", loop_rate)) ROS_INFO("Got param 'loop_rate': %f", loop_rate); + else ROS_ERROR("Failed to get param '%s/loop_rate'",node_.getNamespace().c_str()); + + commandPublisher=node_.advertise("/"+robot_config+"/twist_pid_backstepping_controller/cmd_pos2d",1); + commandPublisher2=node_.advertise("/"+robot_config+"/dynamics_pid_backstepping_controller/cmd_pos2d",1); + + path=new EightPath(pc,r,w); +} + +EightTrajectory::~EightTrajectory(void) +{ + commandPublisher.shutdown(); + delete path; +} + +void EightTrajectory::setCommand(ros::Duration t) +{ + Eigen::Vector3d p=path->point(t.toSec()); + + geometry_msgs::Pose2D command; + command.x=p[0]; + command.y=p[1]; + command.theta=p[2]; + commandPublisher.publish(command); + commandPublisher2.publish(command); +} + +int main(int argc,char* argv[]) +{ + + ros::init(argc,argv,"eight_trajectory"); + ros::NodeHandle node; + + EightTrajectory eightTrajectory(node); + + ros::Rate loop(eightTrajectory.loop_rate); + + ros::Time t0=ros::Time::now(); + while(ros::ok()) + { + eightTrajectory.setCommand(ros::Time::now()-t0); + + ros::spinOnce(); + loop.sleep(); + } + return 0; +} diff --git a/twil_trajectories/src/pose2d_stamp.cpp b/twil_trajectories/src/pose2d_stamp.cpp new file mode 100644 index 0000000..84e0164 --- /dev/null +++ b/twil_trajectories/src/pose2d_stamp.cpp @@ -0,0 +1,75 @@ +#include + +#include + +#include +#include + +class Pose2DStamp +{ + public: + Pose2DStamp(ros::NodeHandle node); + ~Pose2DStamp(void); + + private: + ros::NodeHandle node_; + + ros::Subscriber poseSubscriber; + ros::Publisher posePublisher; + + int seq; + std::string frame_id; + + void poseCB(const geometry_msgs::Pose2D::ConstPtr &pose); +}; + + +Pose2DStamp::Pose2DStamp(ros::NodeHandle node) +{ + node_=node; + + poseSubscriber=node_.subscribe("command",1000,&Pose2DStamp::poseCB,this); + posePublisher=node_.advertise("command_stamped",1000); + + seq=0; + + ros::param::get("~frame_id",frame_id); +} + +Pose2DStamp::~Pose2DStamp(void) +{ + poseSubscriber.shutdown(); + posePublisher.shutdown(); +} + +void Pose2DStamp::poseCB(const geometry_msgs::Pose2D::ConstPtr &pose) +{ + geometry_msgs::PoseStamped stamped; + stamped.header.stamp=ros::Time::now(); + stamped.header.frame_id=frame_id; + stamped.pose.position.x=pose->x; + stamped.pose.position.y=pose->y; + stamped.pose.position.z=0; + stamped.pose.orientation.x=0; + stamped.pose.orientation.y=0; + stamped.pose.orientation.z=sin(pose->theta/2.0); + stamped.pose.orientation.w=cos(pose->theta/2.0); + posePublisher.publish(stamped); +} + +int main(int argc,char* argv[]) +{ + ros::init(argc,argv,"pose2d_stamp"); + ros::NodeHandle node; + + Pose2DStamp pose2DStamp(node); + + ros::Rate loop(100); + ros::Time t0=ros::Time::now(); + while(ros::ok()) + { + ros::spinOnce(); + loop.sleep(); + } + return 0; +} -- 2.12.0