diff --git a/franka_control/include/franka_control/franka_state_controller.h b/franka_control/include/franka_control/franka_state_controller.h index acb24f3c5115b49b4a56dbe2c2c9278859c0a465..b2c8fd49ea13453b92454ab1bf936572504facf4 100644 --- a/franka_control/include/franka_control/franka_state_controller.h +++ b/franka_control/include/franka_control/franka_state_controller.h @@ -61,6 +61,7 @@ class FrankaStateController realtime_tools::RealtimePublisher<tf2_msgs::TFMessage> publisher_transforms_; realtime_tools::RealtimePublisher<franka_msgs::FrankaState> publisher_franka_states_; realtime_tools::RealtimePublisher<sensor_msgs::JointState> publisher_joint_states_; + realtime_tools::RealtimePublisher<sensor_msgs::JointState> publisher_joint_states_desired_; realtime_tools::RealtimePublisher<geometry_msgs::WrenchStamped> publisher_external_wrench_; franka_hw::TriggerRate trigger_publish_; franka::RobotState robot_state_; diff --git a/franka_control/launch/franka_control.launch b/franka_control/launch/franka_control.launch index e88161d6de9c796ffec13b4cf02cfbd4861b1188..1d308e71854deb203b0b4215966215c89c0d927b 100644 --- a/franka_control/launch/franka_control.launch +++ b/franka_control/launch/franka_control.launch @@ -2,6 +2,7 @@ <launch> <arg name="robot_ip" /> <arg name="load_gripper" default="true" /> + <arg name="publish_desired_values" default="false" /> <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find franka_description)/robots/panda_arm_hand.urdf.xacro'" if="$(arg load_gripper)" /> <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find franka_description)/robots/panda_arm.urdf.xacro'" unless="$(arg load_gripper)" /> @@ -15,8 +16,10 @@ <node name="state_controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="franka_state_controller"/> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/> <node name="joint_state_publisher" type="joint_state_publisher" pkg="joint_state_publisher" output="screen"> - <rosparam if="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states, franka_gripper/joint_states] </rosparam> - <rosparam unless="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states] </rosparam> + <rosparam if="$(eval load_gripper and publish_desired_values)" param="source_list">[franka_state_controller/joint_states_desired, franka_gripper/joint_states] </rosparam> + <rosparam if="$(eval load_gripper and not publish_desired_values)" param="source_list">[franka_state_controller/joint_states, franka_gripper/joint_states] </rosparam> + <rosparam if="$(eval not load_gripper and publish_desired_values)" param="source_list">[franka_state_controller/joint_states_desired] </rosparam> + <rosparam if="$(eval not load_gripper and not publish_desired_values)" param="source_list">[franka_state_controller/joint_states] </rosparam> <param name="rate" value="30"/> </node> </launch> diff --git a/franka_control/src/franka_state_controller.cpp b/franka_control/src/franka_state_controller.cpp index f7af454c738370112b3e2c8adea005f62b1666ab..457e2adce3d0a5afa2e676e32ea78b3a4e1efceb 100644 --- a/franka_control/src/franka_state_controller.cpp +++ b/franka_control/src/franka_state_controller.cpp @@ -140,6 +140,7 @@ FrankaStateController::FrankaStateController() publisher_transforms_(), publisher_franka_states_(), publisher_joint_states_(), + publisher_joint_states_desired_(), publisher_external_wrench_(), trigger_publish_(30.0) {} @@ -182,6 +183,7 @@ bool FrankaStateController::init(hardware_interface::RobotHW* robot_hardware, publisher_transforms_.init(root_node_handle, "/tf", 1); publisher_franka_states_.init(controller_node_handle, "franka_states", 1); publisher_joint_states_.init(controller_node_handle, "joint_states", 1); + publisher_joint_states_desired_.init(controller_node_handle, "joint_states_desired", 1); publisher_external_wrench_.init(controller_node_handle, "F_ext", 1); { @@ -192,6 +194,14 @@ bool FrankaStateController::init(hardware_interface::RobotHW* robot_hardware, publisher_joint_states_.msg_.velocity.resize(robot_state_.dq.size()); publisher_joint_states_.msg_.effort.resize(robot_state_.tau_J.size()); } + { + std::lock_guard<realtime_tools::RealtimePublisher<sensor_msgs::JointState> > lock( + publisher_joint_states_desired_); + publisher_joint_states_desired_.msg_.name.resize(joint_names_.size()); + publisher_joint_states_desired_.msg_.position.resize(robot_state_.q_d.size()); + publisher_joint_states_desired_.msg_.velocity.resize(robot_state_.dq_d.size()); + publisher_joint_states_desired_.msg_.effort.resize(robot_state_.tau_J_d.size()); + } { std::lock_guard<realtime_tools::RealtimePublisher<tf2_msgs::TFMessage> > lock( publisher_transforms_); @@ -352,6 +362,21 @@ void FrankaStateController::publishJointStates(const ros::Time& time) { publisher_joint_states_.msg_.header.seq = sequence_number_; publisher_joint_states_.unlockAndPublish(); } + if (publisher_joint_states_desired_.trylock()) { + static_assert(sizeof(robot_state_.q_d) == sizeof(robot_state_.dq_d), + "Robot state joint members do not have same size"); + static_assert(sizeof(robot_state_.q_d) == sizeof(robot_state_.tau_J_d), + "Robot state joint members do not have same size"); + for (size_t i = 0; i < robot_state_.q_d.size(); i++) { + publisher_joint_states_desired_.msg_.name[i] = joint_names_[i]; + publisher_joint_states_desired_.msg_.position[i] = robot_state_.q_d[i]; + publisher_joint_states_desired_.msg_.velocity[i] = robot_state_.dq_d[i]; + publisher_joint_states_desired_.msg_.effort[i] = robot_state_.tau_J_d[i]; + } + publisher_joint_states_desired_.msg_.header.stamp = time; + publisher_joint_states_desired_.msg_.header.seq = sequence_number_; + publisher_joint_states_desired_.unlockAndPublish(); + } } void FrankaStateController::publishTransforms(const ros::Time& time) { diff --git a/franka_example_controllers/launch/move_to_start.launch b/franka_example_controllers/launch/move_to_start.launch index d27edf44a0803fad7310c5d7046007e66413d831..a33d162cb68a1fd4b72482bc2799358cb1ad7415 100644 --- a/franka_example_controllers/launch/move_to_start.launch +++ b/franka_example_controllers/launch/move_to_start.launch @@ -5,6 +5,7 @@ <include file="$(find franka_control)/launch/franka_control.launch"> <arg name="robot_ip" value="$(arg robot_ip)" /> <arg name="load_gripper" value="false" /> + <arg name="publish_desired_values" value="true" /> </include> <include file="$(find panda_moveit_config)/launch/panda_moveit.launch"> <arg name="load_gripper" value="false" />