-
Notifications
You must be signed in to change notification settings - Fork 416
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Why does I get an error #535
Comments
Hi @albinbiju You should modify the source code as below in order to run the AX-12 with DYNAMIXEL Protocol 1.0 #include <ros/ros.h>
#include "std_msgs/String.h"
#include "dynamixel_sdk_examples/GetPosition.h"
#include "dynamixel_sdk_examples/SetPosition.h"
#include "dynamixel_sdk/dynamixel_sdk.h"
using namespace dynamixel;
// Control table address
#define ADDR_TORQUE_ENABLE 24
#define ADDR_GOAL_POSITION 30
#define ADDR_PRESENT_POSITION 36
// Protocol version
#define PROTOCOL_VERSION 1.0 // Default Protocol version of DYNAMIXEL AX series.
// Default setting
#define DXL1_ID 1 // DXL1 ID
#define DXL2_ID 2 // DXL2 ID
#define BAUDRATE 1000000 // Default Baudrate of DYNAMIXEL AX series
#define DEVICE_NAME "/dev/ttyUSB0" // [Linux] To find assigned port, use "$ ls /dev/ttyUSB*" command
PortHandler * portHandler;
PacketHandler * packetHandler;
bool getPresentPositionCallback(
dynamixel_sdk_examples::GetPosition::Request & req,
dynamixel_sdk_examples::GetPosition::Response & res)
{
uint8_t dxl_error = 0;
int dxl_comm_result = COMM_TX_FAIL;
// Position Value of X series is 4 byte data. For AX & MX(1.0) use 2 byte data(int16_t) for the Position Value.
int32_t position = 0;
// Read Present Position (length : 4 bytes) and Convert uint32 -> int32
// When reading 2 byte data from AX / MX(1.0), use read2ByteTxRx() instead.
dxl_comm_result = packetHandler->read2ByteTxRx(
portHandler, (uint8_t)req.id, ADDR_PRESENT_POSITION, (uint32_t *)&position, &dxl_error);
if (dxl_comm_result == COMM_SUCCESS) {
ROS_INFO("getPosition : [ID:%d] -> [POSITION:%d]", req.id, position);
res.position = position;
return true;
} else {
ROS_INFO("Failed to get position! Result: %d", dxl_comm_result);
return false;
}
}
void setPositionCallback(const dynamixel_sdk_examples::SetPosition::ConstPtr & msg)
{
uint8_t dxl_error = 0;
int dxl_comm_result = COMM_TX_FAIL;
// Position Value of X series is 4 byte data. For AX & MX(1.0) use 2 byte data(uint16_t) for the Position Value.
uint32_t position = (unsigned int)msg->position; // Convert int32 -> uint32
// Write Goal Position (length : 4 bytes)
// When writing 2 byte data to AX / MX(1.0), use write2ByteTxRx() instead.
dxl_comm_result = packetHandler->write2ByteTxRx(
portHandler, (uint8_t)msg->id, ADDR_GOAL_POSITION, position, &dxl_error);
if (dxl_comm_result == COMM_SUCCESS) {
ROS_INFO("setPosition : [ID:%d] [POSITION:%d]", msg->id, msg->position);
} else {
ROS_ERROR("Failed to set position! Result: %d", dxl_comm_result);
}
}
int main(int argc, char ** argv)
{
uint8_t dxl_error = 0;
int dxl_comm_result = COMM_TX_FAIL;
portHandler = PortHandler::getPortHandler(DEVICE_NAME);
packetHandler = PacketHandler::getPacketHandler(PROTOCOL_VERSION);
if (!portHandler->openPort()) {
ROS_ERROR("Failed to open the port!");
return -1;
}
if (!portHandler->setBaudRate(BAUDRATE)) {
ROS_ERROR("Failed to set the baudrate!");
return -1;
}
dxl_comm_result = packetHandler->write1ByteTxRx(
portHandler, DXL1_ID, ADDR_TORQUE_ENABLE, 1, &dxl_error);
if (dxl_comm_result != COMM_SUCCESS) {
ROS_ERROR("Failed to enable torque for Dynamixel ID %d", DXL1_ID);
return -1;
}
dxl_comm_result = packetHandler->write1ByteTxRx(
portHandler, DXL2_ID, ADDR_TORQUE_ENABLE, 1, &dxl_error);
if (dxl_comm_result != COMM_SUCCESS) {
ROS_ERROR("Failed to enable torque for Dynamixel ID %d", DXL2_ID);
return -1;
}
ros::init(argc, argv, "read_write_node");
ros::NodeHandle nh;
ros::ServiceServer get_position_srv = nh.advertiseService("/get_position", getPresentPositionCallback);
ros::Subscriber set_position_sub = nh.subscribe("/set_position", 10, setPositionCallback);
ros::spin();
portHandler->closePort();
return 0;
}
|
Thank you sir |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ISSUE TEMPLATE ver. 1.2.0
Please fill this template for more accurate and prompt support.
ROS
Yes
When try to run the read_write_node it tell that Failed to enable torque for dynmaixel ID 1.
I try running the read_write_node from the dynamixel_sdk_examples.
The text was updated successfully, but these errors were encountered: