This is the uarm ROS package designed by Joey Song ( joey@ufactory.cc / astainsong@gmail.com)
Three ways to control uArm movements
Connect uArm and get USB permission to access uArm
$ cd /etc/udev/rules.d
Creat a file ttyUSB.rules
and put the following line: KERNEL=="ttyUSB*", MODE="0666"
. Save the file and reconnect uArm USB to make it effective. (if you already have the permission to access USB, you can skip this step)
If your uArm is connected to ttyACM instead of ttyUSB (you can check using dmesg -c command after connecting your uArm), Creat a file
ttyACM.rules
and put the following line:KERNEL=="ttyACM*", MODE="0666"
. Save the file and reconnect uArm USB to make it effective. (if you already have the permission to access USB, you can skip this step)
For using this package, the pyUarm library SHOULD be installed at first.
$ pip install pyuarm
And check your uArms's VID:PID using lsusb after connecting uArm.
$ lsusb
Bus 001 Device 020: ID 1234:1234 Arduino SA Mega 2560 R3 (CDC ACM)
And you need to specify your device number by editing this file e.g. if you prefer nano as an editor)
$ sudo nano /usr/local/lib/python2.7/dist-packages/pyuarm/tools/list_uarms.py
In this file, you need to change this line, VID:PID with your own device.
UARM_HWID_KEYWORD = "USB VID:PID=1234:1234"
Connect uArm to computer and upgrade your uArmProtocol Firmware
$ uarm-firmware -u
or
$ python -m pyuarm.tools.firmware -d
Install ros package in your src folder of your Catkin workspace.
$ cd ~/catkin_ws/src
$ git clone https://github.com/uArm-Developer/UArmForROS.git
$ cd ~/catkin_ws
$ catkin_make
Before you use any packages in uarmForROS, source all setup.bash files which allow you to access uarm package
# System configure ROS environment variables automatically every time you open a shall
echo "source /opt/ros/[ROS_version]/setup.bash" >> ~/.bashrc
# For example, if you are using kinetic version of ROS
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
# Source setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
-
uarm_core.py
is the main node. Run this node before anything else. This node has two main modes: Control-Mode and Monitor-Mode. Control-Mode is used to control uarm directly in this node. Monitor-mode is to subscrib/listen to all topics which can be used to control uarm through these nodes. This node will automatically load Control-Mode first.Step 1: Connect uArm
Set up ROS enviroment at first
roscore
Open another shall to connect uArm before use.
rosrun uarm uarm_core.py connect // this will find uarm automatically
Step 2: Control-Mode
Once connect uArm, you can use commands to control. Input
h
to see all the commands# For example: attach uarm (use at in short for attach) Input Commands (Input h to see all commands): attach # or at # For example: read current x,y,z (use cc in short for currentCoords) Input Commands (Input h to see all commands): currentCoords # or cc # For example: move uarm x,y,z (use mt in short for moveTo) Input Commands (Input h to see all commands): moveTo 12 -12 12
Input
l
to exit control-mode and get into Monitor modeStep 3: Monitor-Mode
If you get the information as below, you can use both Topics-Pub and other ROS Nodes to control uarm through ROS.
Begin monitor mode - listening to all fucntional topics ======================================================= Use rqt_graph to check the connection =======================================================
-
uarm_status_node.py
is the node which can control the attach-status or detach-status of uArm.Open another shall, and use this node in the monitor-mode of
uarm_core.py
node# attach uarm rosrun uarm uarm_status_node.py attach # detach uarm rosrun uarm uarm_status_node.py detach
-
pump_node.py
is the node which can control the pump on or off.Use this node in the monitor-mode of
uarm_core.py
node# pump on rosrun uarm pump_node.py on # pump off rosrun uarm pump_node.py off
-
report_angles_node.py
is the node which will report current angles.Use this node in the monitor-mode of
uarm_core.py
node# report once rosrun uarm report_angles_node.py # report 10 times rosrun uarm report_angles_node.py 10 # report 10 times per 2 time_sec rosrun uarm report_angles_node.py 10 2
-
report_coords_node.py
is the node which will report current coords.Use this node in the monitor-mode of
uarm_core.py
node# report once rosrun uarm report_coords_node.py # report 10 times rosrun uarm report_coords_node.py 10 # report 10 times per 2 time_sec rosrun uarm report_coords_node.py 10 2
-
report_stopper_node.py
is the node which will report stoppper status.Use this node in the monitor-mode of
uarm_core.py
node# report once rosrun uarm report_stopper_node.py # report 10 times rosrun uarm report_stopper_node.py 10 # report 10 times per 2 time_sec rosrun uarm report_stopper_node.py 10 2
-
write_angles_node.py
is the node which will control 4 servo angles.Use this node in the monitor-mode of
uarm_core.py
node# write 4 servo angles rosrun uarm write_angles_node.py 90 50 50 10
-
move_to_node.py
is the node which will move to x,y,z position.Use this node in the monitor-mode of
uarm_core.py
node# move to x,y,z rosrun uarm move_to_node.py 12 -12 12 # move to x,y,z,time (point 12 -12 12 in 2 seconds) rosrun uarm move_to_node.py 12 -12 12 2 # move to x,y,z,time,servo_4 angle (servo_4 angle is 54) rosrun uarm move_to_node.py 12 -12 12 2 54
uarm_status
- control uarm status.Message_type: `std_msgs/String`. Data: attach / detach
pump_control
- control pump on or off.Message_type: `std_msgs/UInt8`. Data: 1 / 0
pump_str_control
- control pump on or off.Message_type: `std_msgs/String`. Data: high / low
read_coords
- report coords. Coords will also be written in parametersMessage_type: `std_msgs/Int32`. Data: int (read times). Set-param: 'current_x' 'current_y' 'current_z' ('write in ros-parameter and can be invoked')
read_angles
- report angles. Angles will also be written in parametersMessage_type: `std_msgs/Int32`. Data: int (read times). Set-param: 's1' 's2' 's3' 's4' ('will be written in ros_parameter for 4 `servo_angles')
stopper_status
- report stopper status. Status will also be written in parametersMessage_type: `std_msgs/Int32`. Data: int (read times). Set-param: 'stopper_status'
write_angles
- write 4 servo angles.Message_type: uarm/Angles Data: int int int int
move_to
- move to x,y,z position.Message_type: uarm/Coords Data: float float float
move_to_time
- move to with time.Message_type: uarm/CoordsWithTime Data: float float float int
move_to_time_s4
- move to with time and servo_4 angle.Message_type: uarm/CoordsWithTS4 Data: float float float int int
uarm/Angles
uint8: servo_1 uint8: servo_2 uint8: servo_3 uint8: servo_4
uarm/Angles
float32: x float32: y float32: z
uarm/Angles
float32: x float32: y float32: z uint8: time
uarm/Angles
float32: x float32: y float32: z uint8: time uint8: servo_4
- Display -- display.launch: This function will display robot movement in realtime when you manually move uArm
- Control -- control.launch: This function will allow you control the end-effector movement in 3 DOF along x,y,z axis.
-Step 1: Set up ROS enviroment in one shall
roscore
In the second shall, connect uArm and set the listen mode as shown above
rosrun uarm uarm_core.py connect // connect uArm
l // transfer to monitor mode
-Step 2: Launch
a) For visualization function, in the third shall, run
roslaunch uarm display.launch
b) Or for control function, in the third shall, run
roslaunch uarm control.launch
-Step 3: Display and control: Open rviz to view robot in the fourth shall
rosrun rviz rviz
For both functions, import robot model in "Displays" panel on the left:
Add -> RobotModel // click "add" and choose "RobotModel"
set Cell Size -> 0.1 // change "Cell Size" to 0.1 in "Grid"
set Fixed Frame -> base // change "Fixed Frame" to base in "Global Options"
a) For Display function, right now a robot will display in the main window
b) For Control function, stop Display function and set
Add -> InteractiveMarker // click "add" and choose "InteractiveMarkers"
Update Topic -> /uarm_controller/update // change "Update topic" in "InteractiveMarkers"
Drag 3 pairs of arrows to control uArm along x, y, z axis.