10 if (!
nh_->getParam(
"time_step", time_step))
12 ROS_INFO(
"[%s] Could not find the 'time_step' parameter in Parameter Server. Setting it to minimum sampling rate.",
15 int minimumft_sampling_rate = std::numeric_limits<int>::max();
21 rokubimini->getForceTorqueSamplingRate(ft_sampling_rate);
24 minimumft_sampling_rate = std::min(minimumft_sampling_rate, ft_sampling_rate);
26 time_step = 1.0 /
static_cast<float>(minimumft_sampling_rate);
31 <<
" Hz, based on time step.");
37 auto rokubimini = std::make_shared<RokubiminiEthercat>(rokubiminiName,
nh_);
42 bus_ = std::unique_ptr<rokubimini::soem_interface::EthercatBusBase>(bus);
53 std::string ethercat_bus_string =
"ethercat_bus";
54 if (
nh_->hasParam(ethercat_bus_string))
60 ROS_ERROR(
"[%s] Could not find ethercat bus in Parameter Server: %s",
name_.c_str(), ethercat_bus_string.c_str());
69 std::string ethercat_address_string =
"rokubiminis/" + rokubimini->getName() +
"/ethercat_address";
71 if (
nh_->hasParam(ethercat_address_string))
74 nh_->getParam(ethercat_address_string, ethercat_address);
75 if (ethercat_address <= 0)
77 throw ros::Exception(
"The EtherCAT address is not a positive number");
79 ethercat_addr =
static_cast<uint32_t>(ethercat_address);
83 ROS_ERROR(
"Could not find ethercat address in Parameter Server: %s", ethercat_address_string.c_str());
87 auto slave = std::make_shared<RokubiminiEthercatSlave>(rokubimini->getName(), bus, ethercat_addr, ethercat_pdo_enum);
88 slave->setProductName(rokubimini->getProductName());
94 rokubimini->setSlavePointer(
slave);
102 std::this_thread::sleep_for(std::chrono::milliseconds(500));
119 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
126 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
133 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
139 const unsigned int maxRetries,
const double retrySleep)
141 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
142 bus_->waitForState(state, slave, maxRetries, retrySleep);
147 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
148 if (!
bus_->startup())
158 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
164 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
170 std::lock_guard<std::recursive_mutex> lock(
busMutex_);
void setConfigMode() override
bool createRokubimini(const std::string &rokubiminiName) override
Creates an RokubiminiEthercat instance.
The Rokubimini Ethercat class.
std::recursive_mutex busMutex_
Mutex prohibiting simultaneous access to EtherCAT bus manager.
void setRunsAsync(bool runsAsync)
bool addSlave(const EthercatSlaveBasePtr &slave)
void setRunMode() override
void shutdownBus() override
Calls shutdown on the bus.
void setBusSafeOperational()
Sets bus to safe operational state.
std::string ethercatBusName_
The name of the Ethercat bus.
void waitForState(const uint16_t state, const uint16_t slave=0, const unsigned int maxRetries=40, const double retrySleep=0.001)
Waits for the slave to reach a state.
bool loadBusParameters() override
Loads ethercat bus parameters from parameter server.
bool startupBus()
Starts up the bus and puts them in operational mode.
std::unique_ptr< rokubimini::soem_interface::EthercatBusBase > bus_
The Ethercat bus instance.
void setBusPreOperational()
Sets bus to pre operational state.
bool startupCommunication() override
Starts up the bus.
void readBus() override
Calls update read on the bus.
bool addRokubiminiToBus(const std::shared_ptr< RokubiminiEthercat > &rokubimini, rokubimini::soem_interface::EthercatBusBase *bus) const
Adds a Rokubimini to Bus.
#define ROS_WARN_STREAM(args)
void writeToBus() override
Calls update write on the bus.
std::vector< std::shared_ptr< Rokubimini > > rokubiminis_
Class for managing an ethercat bus containing one or multiple slaves.
void setBusOperational()
Sets bus to operational state.
double loadTimeStep() override
Loads the time_step from the Parameter Server.