添加了moveoros仿真的下位机测试代码。
parent
be9db77942
commit
737b3ce532
|
@ -0,0 +1,154 @@
|
|||
/* Purpose: This sketch uses ROS as well as MultiStepper, AccelStepper, and Servo libraries to control the
|
||||
* BCN3D Moveo robotic arm. In this setup, a Ramps 1.4 shield is used on top of an Arduino Mega 2560.
|
||||
* Subscribing to the following ROS topics: 1) joint_steps, 2) gripper_angle
|
||||
* 1) joint_steps is computed from the simulation in PC and sent Arduino via rosserial. It contains
|
||||
* the steps (relative to the starting position) necessary for each motor to move to reach the goal position.
|
||||
* 2) gripper_angle contains the necessary gripper angle to grasp the object when the goal state is reached
|
||||
*
|
||||
* Publishing to the following ROS topics: joint_steps_feedback
|
||||
* 1) joint_steps_feedback is a topic used for debugging to make sure the Arduino is receiving the joint_steps data
|
||||
* accurately
|
||||
*
|
||||
* Author: Jesse Weisberg
|
||||
*/
|
||||
#if (ARDUINO >= 100)
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
#include <ros.h>
|
||||
|
||||
#include <moveo_moveit/ArmJointState.h>
|
||||
#include <Servo.h>
|
||||
#include <std_msgs/Bool.h>
|
||||
#include <std_msgs/String.h>
|
||||
#include <math.h>
|
||||
#include <std_msgs/Int16.h>
|
||||
#include <std_msgs/UInt16.h>
|
||||
#include <AccelStepper.h>
|
||||
#include <MultiStepper.h>
|
||||
|
||||
// Joint 1
|
||||
#define E1_STEP_PIN 53
|
||||
#define E1_DIR_PIN 51
|
||||
#define E1_ENABLE_PIN 31
|
||||
|
||||
// Joint 2
|
||||
#define Z_STEP_PIN 32
|
||||
#define Z_DIR_PIN 30
|
||||
#define Z_ENABLE_PIN 62
|
||||
#define Z_MIN_PIN 18
|
||||
#define Z_MAX_PIN 19
|
||||
|
||||
// Joint 3
|
||||
#define Y_STEP_PIN 48
|
||||
#define Y_DIR_PIN 46
|
||||
#define Y_ENABLE_PIN 56
|
||||
#define Y_MIN_PIN 14
|
||||
#define Y_MAX_PIN 15
|
||||
|
||||
// Joint 4
|
||||
#define X_STEP_PIN 40
|
||||
#define X_DIR_PIN 42
|
||||
#define X_ENABLE_PIN 38
|
||||
|
||||
// Joint 5
|
||||
#define E0_STEP_PIN 43
|
||||
#define E0_DIR_PIN 41
|
||||
#define E0_ENABLE_PIN 24
|
||||
|
||||
|
||||
AccelStepper joint1(1,E1_STEP_PIN, E1_DIR_PIN);
|
||||
AccelStepper joint2(1,Z_STEP_PIN, Z_DIR_PIN);
|
||||
AccelStepper joint3(1,Y_STEP_PIN, Y_DIR_PIN);
|
||||
AccelStepper joint4(1,X_STEP_PIN, X_DIR_PIN);
|
||||
AccelStepper joint5(1, E0_STEP_PIN, E0_DIR_PIN);
|
||||
|
||||
Servo gripper;
|
||||
MultiStepper steppers;
|
||||
|
||||
int joint_step[6];
|
||||
int joint_status = 0;
|
||||
|
||||
ros::NodeHandle nh;
|
||||
std_msgs::Int16 msg;
|
||||
|
||||
//instantiate publisher (for debugging purposes)
|
||||
//ros::Publisher steps("joint_steps_feedback",&msg);
|
||||
|
||||
void arm_cb(const moveo_moveit::ArmJointState& arm_steps){
|
||||
joint_status = 1;
|
||||
joint_step[0] = arm_steps.position1;
|
||||
joint_step[1] = arm_steps.position2;
|
||||
joint_step[2] = arm_steps.position3;
|
||||
joint_step[3] = arm_steps.position4;
|
||||
joint_step[4] = arm_steps.position5;
|
||||
joint_step[5] = arm_steps.position6; //gripper position <0-180>
|
||||
}
|
||||
|
||||
void gripper_cb( const std_msgs::UInt16& cmd_msg){
|
||||
gripper.write(cmd_msg.data); // Set servo angle, should be from 0-180
|
||||
digitalWrite(13, HIGH-digitalRead(13)); // Toggle led
|
||||
}
|
||||
|
||||
//instantiate subscribers
|
||||
ros::Subscriber<moveo_moveit::ArmJointState> arm_sub("joint_steps",arm_cb); //subscribes to joint_steps on arm
|
||||
ros::Subscriber<std_msgs::UInt16> gripper_sub("gripper_angle", gripper_cb); //subscribes to gripper position
|
||||
//to publish from terminal: rostopic pub gripper_angle std_msgs/UInt16 <0-180>
|
||||
|
||||
void setup() {
|
||||
//put your setup code here, to run once:
|
||||
//Serial.begin(57600);
|
||||
pinMode(13,OUTPUT);
|
||||
joint_status = 1;
|
||||
|
||||
nh.initNode();
|
||||
nh.subscribe(arm_sub);
|
||||
nh.subscribe(gripper_sub);
|
||||
//nh.advertise(steps);
|
||||
|
||||
// Configure each stepper
|
||||
joint1.setMaxSpeed(1500);
|
||||
joint2.setMaxSpeed(750);
|
||||
joint3.setMaxSpeed(2000);
|
||||
joint4.setMaxSpeed(500);
|
||||
joint5.setMaxSpeed(1000);
|
||||
|
||||
// Then give them to MultiStepper to manage
|
||||
steppers.addStepper(joint1);
|
||||
steppers.addStepper(joint2);
|
||||
steppers.addStepper(joint3);
|
||||
steppers.addStepper(joint4);
|
||||
steppers.addStepper(joint5);
|
||||
|
||||
// Configure gripper servo
|
||||
gripper.attach(11);
|
||||
|
||||
digitalWrite(13, 1); //toggle led
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (joint_status == 1) // If command callback (arm_cb) is being called, execute stepper command
|
||||
{
|
||||
long positions[5]; // Array of desired stepper positions must be long
|
||||
positions[0] = joint_step[0]; // negated since the real robot rotates in the opposite direction as ROS
|
||||
positions[1] = -joint_step[1];
|
||||
positions[2] = joint_step[2];
|
||||
positions[3] = joint_step[3];
|
||||
positions[4] = -joint_step[4];
|
||||
|
||||
// Publish back to ros to check if everything's correct
|
||||
//msg.data=positions[4];
|
||||
//steps.publish(&msg);
|
||||
|
||||
steppers.moveTo(positions);
|
||||
nh.spinOnce();
|
||||
steppers.runSpeedToPosition(); // Blocks until all are in position
|
||||
gripper.write(joint_step[5]); // move gripper after manipulator reaches goal
|
||||
}
|
||||
digitalWrite(13, HIGH-digitalRead(13)); //toggle led
|
||||
joint_status = 0;
|
||||
|
||||
nh.spinOnce();
|
||||
delay(1);
|
||||
}
|
Loading…
Reference in New Issue