0
$\begingroup$

Rosanswers logo

For those of you who are brave enough to try to help me solve this problem, I will grant you 3 wishes. Here we go.

I'm using an arm called the ClamArm

Seen here

http://www.roadnarrows-store.com/clam-arm-servo-kit.html

I just got done building the arm. All motors are powered up. I plugged in both Dynamixel2USB cables from the arm into my computer's USB ports and I run the lowlevel launch file to connect to the arm. (7 motors on the arm total, 3 motors to 1 USB, 4 motors to the other).

Seen here (lowlevel.launch)

<!-- -*- mode: XML -*- --> <launch> <!-- debug capability --> <arg name="debug" default="false" /> <arg unless="$(arg debug)" name="launch_prefix" value="" /> <arg if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" /> <!-- chmod the usb ports --> <node name="change_usb_port_permissions" pkg="clam_bringup" type="change_usb_port_permissions.sh" /> <!-- Startup the arm controller, dynamixel manager, hardware interface, etc --> <include file="$(find clam_controller)/launch/clam_controller.launch"> <arg name="debug" value="$(arg debug)" /> </include> <!-- Send robot XML description to param server --> <param name="robot_description" command="cat $(find clam_description)/urdf/clam.urdf" /> <!-- Publish the robot state --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /> </launch> 

I get this error. Apparently, no motors are found!

setting /run_id to 389151fa-13fb-11e3-ae2c-20c9d0bd73cd process[rosout-1]: started with pid [4772] started core service [/rosout] process[change_usb_port_permissions-2]: started with pid [4784] process[dynamixel_manager-3]: started with pid [4790] [ INFO] [1378145546.539716442]: port_rs485: Pinging motor IDs 0 through 7... [change_usb_port_permissions-2] process has finished cleanly log file: /home/lucid/.ros/log/389151fa-13fb-11e3-ae2c-20c9d0bd73cd/change_usb_port_permissions-2*.log process[clam_controller_spawner_ttl-4]: started with pid [4820] process[clam_controller_spawner_rs485-5]: started with pid [4821] process[arm_trajectory_controller_spawner-6]: started with pid [4824] process[joint_state_aggregator-7]: started with pid [4827] **[ WARN] [1378145546.941467380]: port_rs485: No motors found.** process[clam_gripper_controller-8]: started with pid [4854] [ INFO] [1378145547.037642567]: ClamGripperCommand action server ready [dynamixel_manager-3] process has died [pid 4790, exit code -11, cmd /home/lucid/ros/clam/devel/lib/dynamixel_hardware_interface/controller_manager __name:=dynamixel_manager __log:=/home/lucid/.ros/log/389151fa-13fb-11e3-ae2c-20c9d0bd73cd/dynamixel_manager-3.log]. log file: /home/lucid/.ros/log/389151fa-13fb-11e3-ae2c-20c9d0bd73cd/dynamixel_manager-3*.log [INFO] [WallTime: 1378145547.097725] clam_controller_spawner_ttl: waiting for controller_manager clam_controller_manager to startup in / namespace... process[robot_state_publisher-9]: started with pid [4887] [INFO] [WallTime: 1378145547.140146] clam_controller_spawner_rs485: waiting for controller_manager clam_controller_manager to startup in / namespace... [INFO] [WallTime: 1378145547.173755] arm_trajectory_controller_spawner: waiting for controller_manager clam_controller_manager to startup in / namespace... 

No Motors found on port_rs485. I look at the launch file and see that it has an embedded launch file called clam_controller.launch that is actually responsible for connecting to the motors.

Seen here (clam_controller.launch)

<!-- -*- mode: XML -*- --> <launch> <!-- Debug Info --> <arg name="debug" default="false" /> <arg unless="$(arg debug)" name="launch_prefix" value="" /> <arg if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" /> <!-- Start the Dynamixel motor manager to control all clam servos --> <node name="dynamixel_manager" pkg="dynamixel_hardware_interface" type="controller_manager" launch-prefix="$(arg launch_prefix)" output="screen" > <!-- Load all the servo properties --> <rosparam file="$(find clam_controller)/config/dynamixel_ports.yaml" command="load"/> </node> <!-- Load joint controller configuration from YAML file to parameter server --> <rosparam file="$(find clam_controller)/config/clam_controller_configuration.yaml" command="load"/> <!-- Start all ClamArm joint controllers --> <node name="clam_controller_spawner_ttl" pkg="dynamixel_hardware_interface" type="controller_spawner.py" args="--manager=clam_controller_manager --port=port_ttl shoulder_pan_controller gripper_roll_controller gripper_finger_controller" output="screen"/> <node name="clam_controller_spawner_rs485" pkg="dynamixel_hardware_interface" type="controller_spawner.py" args="--manager=clam_controller_manager --port=port_rs485 shoulder_pitch_controller elbow_roll_controller elbow_pitch_controller wrist_roll_controller wrist_pitch_controller" output="screen"/> <!-- Start arm trajectory action controller. *Not sure what multi_joint_dummy_port implies... --> <rosparam file="$(find clam_controller)/config/clam_trajectory_controller.yaml" command="load"/> <node name="arm_trajectory_controller_spawner" pkg="dynamixel_hardware_interface" type="controller_spawner.py" args="--manager=clam_controller_manager --port=multi_joint_dummy_port clam_trajectory_controller" output="screen"/> <!-- Publish combined joint info --> <include file="$(find clam_controller)/launch/joint_state_aggregator.launch" /> <!-- Launch fake joint state publisher --> <!--node name="joint_state_publisher" pkg="clam_controller" type="joint_state_publisher.py" output="screen"> <rosparam param="source_list">[joint_states]</rosparam> <rosparam param="use_gui">FALSE</rosparam> </node--> <!--node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" output="screen"> <rosparam param="source_list">[joint_states]</rosparam> <rosparam param="use_gui">FALSE</rosparam> </node--> <!-- Start the Clam Gripper Server to control the end effector --> <node name="clam_gripper_controller" pkg="clam_controller" type="clam_gripper_controller" output="screen" args="_simulate:=false" /> </launch> 

According to that launch file, I see that it's getting the port name (port_rs485) from dynamixel_ports.yaml.

Seen here (dynamixel_ports.yaml)

namespace: clam_controller_manager diagnostics_rate: 2 serial_ports: port_ttl: port_name: /dev/dynamixel_ttl baud_rate: 1000000 min_motor_id: 0 max_motor_id: 7 update_rate: 50 diagnostics: error_level_temp: 70 warn_level_temp: 65 port_rs485: port_name: /dev/dynamixel_rs485 baud_rate: 1000000 min_motor_id: 0 max_motor_id: 7 update_rate: 50 diagnostics: error_level_temp: 70 warn_level_temp: 65 

Ok, so were are we renaming the ttyUSB0 and ttyUSB1 ports to dynamixel_rs485 and dynamixel_ttl? Apparently in the included udev rules file called 50-usb-serial.rules

Seen here (50-usb-serial.rules)

# A copy of this file goes into /etc/udev/rules.d/ # So that the usb to serial drivers are mapped reliably SUBSYSTEMS=="usb",DRIVERS=="ftdi_sio",ATTRS{interface}=="FT232R USB UART",SYMLI$ SUBSYSTEMS=="usb",DRIVERS=="ftdi_sio",ATTRS{interface}=="AX12",SYMLINK+="dynami$ 

I used the required command to set it with the system and then reboot

Seen here

sudo cp 50-usb-serial.rules /etc/udev/rules.d/ 

Curiously, when i go to /etc/dev, only dynamixel_rs485 shows up! Even though both USBs are detected as ttyUSB0 and ttyUSB1 in /etc/dev.

Ok so I've got 2 problems.

  1. No motors are detected
  2. Dynamixel_ttl is not created by the provided dev rule, even thought it is connected and detected as ttyUSB1.

Anyone have any ideas at all what I could do?


Originally posted by llSourcell on ROS Answers with karma: 236 on 2013-09-03

Post score: 1


Original comments

Comment by dylanvaughn on 2014-12-31:
Sorry for the off-topic comment but I'm building the clamarm and the road narrows kit doesn't exist anymore:

http://www.roadnarrows-store.com/clam-arm-servo-kit.html

I think I have found all the servos but am unsure on the brackets - if you have a chance could you let me know what you ordered?

Comment by Dave Coleman on 2015-01-09:
Hey there, I'm the creator the ClamArm website. I don't have time to maintain the project anymore, but if any of you guys figured out problems or made improvements, I'd be happy to improve the documentation.

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

I've bought CLAM arm too, but you've gotten further along than me in assembly.

My understanding is that the motors don't have the ID numbers programmed in already, and you have to manually set them. There were a couple of scripts in ROS stacks for dynamixel maintenance, setting ID numbers, what's on the bus, etc. I believe it's a matter of plugging each motor in individually, setting its ID, then powering down and moving onto the next. https://github.com/arebgun/dynamixel_motor/tree/master/dynamixel_driver/scripts

Once all the motors are programmed, ROS might be able to see them.

Hope this helps, Gav


Originally posted by Gav with karma: 478 on 2013-09-03

This answer was ACCEPTED on the original site

Post score: 1


Original comments

Comment by llSourcell on 2013-09-03:
Thanks Gav! It seems all of those scripts change the Motor ID of the servo based on it's previous ID as a parameter. I don't know my motors IDs. Is there one that lets you set a motor ID?

Comment by Gav on 2013-09-03:
I think the 'info_dump' script might be able to tell you something, but I haven't got that far myself. Although I quickly tried running the script and didn't get any info previously. At the time I figured that my motors weren't powered up right.

$\endgroup$