
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.
- No motors are detected
- 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.