ROS_OP_open_manipulator_controller_pkg - 8BitsCoding/RobotMentor GitHub Wiki
전체코드
시작은 메인
int main(int argc, char **argv)
{
// 파라미터 설정 및 초기화는 생략(전체코드 참조)
OpenManipulatorController om_controller(usb_port, baud_rate);
om_controller.initPublisher();
om_controller.initSubscriber();
om_controller.initServer();
om_controller.startTimerThread();
ros::Timer publish_timer = node_handle.createTimer(ros::Duration(om_controller.getControlPeriod()), &OpenManipulatorController::publishCallback, &om_controller);
// ...
}
- Topic pub, Sub, Service 선언
- TimerThread생성
- publish Timer생성
publish_Timer생성
void OpenManipulatorController::publishCallback(const ros::TimerEvent&)
{
if (using_platform_ == true) publishJointStates();
else publishGazeboCommand();
publishOpenManipulatorStates();
publishKinematicsPose();
}
void OpenManipulatorController::publishGazeboCommand()
{
JointWaypoint joint_value = open_manipulator_.getAllActiveJointValue();
JointWaypoint tool_value = open_manipulator_.getAllToolValue();
for(uint8_t i = 0; i < joint_value.size(); i ++)
{
std_msgs::Float64 msg;
msg.data = joint_value.at(i).position;
gazebo_goal_joint_position_pub_.at(i).publish(msg);
}
for(uint8_t i = 0; i < tool_value.size(); i ++)
{
std_msgs::Float64 msg;
msg.data = tool_value.at(i).position;
gazebo_goal_joint_position_pub_.at(joint_value.size() + i).publish(msg);
}
}
void OpenManipulatorController::publishOpenManipulatorStates()
{
open_manipulator_msgs::OpenManipulatorState msg;
if(open_manipulator_.getMovingState())
msg.open_manipulator_moving_state = msg.IS_MOVING;
else
msg.open_manipulator_moving_state = msg.STOPPED;
if(open_manipulator_.getActuatorEnabledState(JOINT_DYNAMIXEL))
msg.open_manipulator_actuator_state = msg.ACTUATOR_ENABLED;
else
msg.open_manipulator_actuator_state = msg.ACTUATOR_DISABLED;
open_manipulator_states_pub_.publish(msg);
}
void OpenManipulatorController::publishKinematicsPose()
{
open_manipulator_msgs::KinematicsPose msg;
auto opm_tools_name = open_manipulator_.getManipulator()->getAllToolComponentName();
uint8_t index = 0;
for (auto const& tools:opm_tools_name)
{
KinematicPose pose = open_manipulator_.getKinematicPose(tools);
msg.pose.position.x = pose.position[0];
msg.pose.position.y = pose.position[1];
msg.pose.position.z = pose.position[2];
Eigen::Quaterniond orientation = math::convertRotationMatrixToQuaternion(pose.orientation);
msg.pose.orientation.w = orientation.w();
msg.pose.orientation.x = orientation.x();
msg.pose.orientation.y = orientation.y();
msg.pose.orientation.z = orientation.z();
open_manipulator_kinematics_pose_pub_.at(index).publish(msg);
index++;
}
}