Skip to content

Commit 8917578

Browse files
committed
CORE-36182: [puma_motor_driver] Port to can_hardware socketcan driver
1 parent 75dfe07 commit 8917578

File tree

6 files changed

+78
-54
lines changed

6 files changed

+78
-54
lines changed

clearpath_motor_drivers/puma_motor_driver/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ endif()
77

88
# find dependencies
99
find_package(ament_cmake REQUIRED)
10-
find_package(can_msgs REQUIRED)
10+
find_package(can_hardware REQUIRED)
1111
find_package(clearpath_motor_msgs REQUIRED)
12-
find_package(clearpath_ros2_socketcan_interface REQUIRED)
1312
find_package(diagnostic_updater REQUIRED)
1413
find_package(rclcpp REQUIRED)
1514
find_package(std_msgs REQUIRED)
@@ -18,9 +17,8 @@ find_package(sensor_msgs REQUIRED)
1817

1918
set(DEPENDENCIES
2019
ament_cmake
21-
can_msgs
20+
can_hardware
2221
clearpath_motor_msgs
23-
clearpath_ros2_socketcan_interface
2422
diagnostic_updater
2523
rclcpp
2624
std_msgs

clearpath_motor_drivers/puma_motor_driver/include/puma_motor_driver/driver.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI
2727
#include <stdint.h>
2828
#include <string>
2929

30-
#include "can_msgs/msg/frame.hpp"
31-
#include "clearpath_ros2_socketcan_interface/socketcan_interface.hpp"
30+
#include <rclcpp/rclcpp.hpp>
31+
32+
#include "can_hardware/common/types.hpp"
33+
#include "can_hardware/drivers/socketcan_driver.hpp"
3234

3335
#include "clearpath_motor_msgs/msg/puma_status.hpp"
3436

@@ -43,12 +45,12 @@ class Driver
4345
{
4446
public:
4547
Driver(
46-
const std::shared_ptr<clearpath_ros2_socketcan_interface::SocketCANInterface> interface,
48+
const std::shared_ptr<can_hardware::drivers::SocketCanDriver> interface,
4749
std::shared_ptr<rclcpp::Node> nh,
4850
const uint8_t & device_number,
4951
const std::string & device_name);
5052

51-
void processMessage(const can_msgs::msg::Frame::SharedPtr received_msg);
53+
void processMessage(const can_hardware::Frame & frame);
5254

5355
double radPerSecToRpm() const;
5456

@@ -467,7 +469,7 @@ class Driver
467469
void driverUpdateDiagnostics(diagnostic_updater::DiagnosticStatusWrapper & stat, bool updating);
468470

469471
private:
470-
std::shared_ptr<clearpath_ros2_socketcan_interface::SocketCANInterface> interface_;
472+
std::shared_ptr<can_hardware::drivers::SocketCanDriver> interface_;
471473
std::shared_ptr<rclcpp::Node> nh_;
472474
uint8_t device_number_;
473475
std::string device_name_;
@@ -486,15 +488,14 @@ class Driver
486488
/**
487489
* Helpers to generate data for CAN messages.
488490
*/
489-
can_msgs::msg::Frame::SharedPtr can_msg_;
490491
void sendId(const uint32_t id);
491492
void sendUint8(const uint32_t id, const uint8_t value);
492493
void sendUint16(const uint32_t id, const uint16_t value);
493494
void sendFixed8x8(const uint32_t id, const float value);
494495
void sendFixed16x16(const uint32_t id, const double value);
495-
can_msgs::msg::Frame getMsg(const uint32_t id);
496-
uint32_t getApi(const can_msgs::msg::Frame msg);
497-
uint32_t getDeviceNumber(const can_msgs::msg::Frame msg);
496+
can_hardware::Frame getMsg(const uint32_t id);
497+
uint32_t getApi(const can_hardware::Frame & msg);
498+
uint32_t getDeviceNumber(const can_hardware::Frame & msg);
498499

499500
/**
500501
* Comparing the raw bytes of the 16x16 fixed-point numbers

clearpath_motor_drivers/puma_motor_driver/include/puma_motor_driver/multi_puma_node.hpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI
2525
#define PUMA_MOTOR_DRIVER_MULTI_PUMA_NODE_H
2626

2727
#include <map>
28+
#include <mutex>
29+
#include <queue>
2830

2931
#include "rclcpp/rclcpp.hpp"
3032
#include "std_msgs/msg/float64.hpp"
@@ -35,7 +37,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI
3537
#include "clearpath_motor_msgs/msg/puma_multi_feedback.hpp"
3638
#include "clearpath_motor_msgs/msg/puma_feedback.hpp"
3739

38-
#include "clearpath_ros2_socketcan_interface/socketcan_interface.hpp"
40+
#include "can_hardware/common/types.hpp"
41+
#include "can_hardware/drivers/socketcan_driver.hpp"
3942

4043
#include "diagnostic_updater/diagnostic_updater.hpp"
4144

@@ -116,6 +119,13 @@ class MultiPumaNode
116119
*/
117120
bool connectIfNotConnected();
118121

122+
/**
123+
* @brief Callback function for processing incoming CAN frames.
124+
*
125+
* @param frame The received CAN frame.
126+
*/
127+
void frameCallback(const can_hardware::Frame& frame);
128+
119129
/**
120130
* Main control loop that checks and maintains the socket gateway, resets
121131
* and reconfigures drivers that have disconnected, verifies parameters
@@ -128,7 +138,8 @@ class MultiPumaNode
128138
using DiagnosticStatusWrapper = diagnostic_updater::DiagnosticStatusWrapper;
129139
using PumaStatus = clearpath_motor_msgs::msg::PumaStatus;
130140

131-
std::shared_ptr<clearpath_ros2_socketcan_interface::SocketCANInterface> interface_;
141+
// std::shared_ptr<clearpath_ros2_socketcan_interface::SocketCANInterface> interface_;
142+
std::shared_ptr<can_hardware::drivers::SocketCanDriver> interface_;
132143
std::vector<puma_motor_driver::Driver> drivers_;
133144

134145
bool active_;
@@ -142,7 +153,9 @@ class MultiPumaNode
142153
std::vector<int64_t> joint_can_ids_;
143154
std::vector<int64_t> joint_directions_;
144155

145-
can_msgs::msg::Frame::SharedPtr recv_msg_;
156+
std::queue<can_hardware::Frame> recv_msg_queue_;
157+
std::mutex recv_msg_mutex_;
158+
146159
clearpath_motor_msgs::msg::PumaMultiStatus status_msg_;
147160
clearpath_motor_msgs::msg::PumaMultiFeedback feedback_msg_;
148161

clearpath_motor_drivers/puma_motor_driver/package.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010

1111
<buildtool_depend>ament_cmake</buildtool_depend>
1212

13-
<depend>can_msgs</depend>
13+
<depend>can_hardware</depend>
1414
<depend version_gte="2.4.0">clearpath_motor_msgs</depend>
15-
<depend version_gte="2.1.1">clearpath_ros2_socketcan_interface</depend>
1615
<depend>diagnostic_updater</depend>
1716
<depend>rclcpp</depend>
1817
<depend>sensor_msgs</depend>

clearpath_motor_drivers/puma_motor_driver/src/driver.cpp

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCL
2222
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2323
*/
2424
#include "clearpath_motor_msgs/msg/puma_status.hpp"
25-
#include "clearpath_ros2_socketcan_interface/socketcan_interface.hpp"
2625

2726
#include "puma_motor_driver/driver.hpp"
2827

@@ -59,7 +58,7 @@ enum ConfigurationState
5958
typedef ConfigurationStates::ConfigurationState ConfigurationState;
6059

6160
Driver::Driver(
62-
const std::shared_ptr<clearpath_ros2_socketcan_interface::SocketCANInterface> interface,
61+
const std::shared_ptr<can_hardware::drivers::SocketCanDriver> interface,
6362
std::shared_ptr<rclcpp::Node> nh,
6463
const uint8_t & device_number,
6564
const std::string & device_name)
@@ -88,20 +87,20 @@ Driver::Driver(
8887
);
8988
}
9089

91-
void Driver::processMessage(const can_msgs::msg::Frame::SharedPtr received_msg)
90+
void Driver::processMessage(const can_hardware::Frame & received_msg)
9291
{
9392
// If it's not our message, jump out.
94-
if (getDeviceNumber(*received_msg) != device_number_) {
93+
if (getDeviceNumber(received_msg) != device_number_) {
9594
return;
9695
}
9796

9897
// If there's no data then this is a request message, jump out.
99-
if (received_msg->dlc == 0) {
98+
if (received_msg.dlc == 0) {
10099
return;
101100
}
102101

103102
Field * field = nullptr;
104-
uint32_t received_api = getApi(*received_msg);
103+
uint32_t received_api = getApi(received_msg);
105104
if ((received_api & CAN_MSGID_API_M & CAN_API_MC_CFG) == CAN_API_MC_CFG) {
106105
field = cfgFieldForMessage(received_api);
107106
} else if ((received_api & CAN_MSGID_API_M & CAN_API_MC_STATUS) == CAN_API_MC_STATUS) {
@@ -128,7 +127,7 @@ void Driver::processMessage(const can_msgs::msg::Frame::SharedPtr received_msg)
128127
}
129128

130129
// Copy the received data and mark that field as received.
131-
std::copy_n(std::begin(received_msg->data), Field::FIELD_STRUCT_DATA_SIZE,
130+
std::copy_n(std::begin(received_msg.data), Field::FIELD_STRUCT_DATA_SIZE,
132131
std::begin(field->data));
133132
field->received = true;
134133
}
@@ -140,75 +139,75 @@ double Driver::radPerSecToRpm() const
140139

141140
void Driver::sendId(const uint32_t id)
142141
{
143-
can_msgs::msg::Frame msg = getMsg(id);
144-
interface_->send(msg);
142+
auto msg = getMsg(id);
143+
interface_->sendFrame(msg);
145144
}
146145

147146
void Driver::sendUint8(const uint32_t id, const uint8_t value)
148147
{
149-
can_msgs::msg::Frame msg = getMsg(id);
148+
auto msg = getMsg(id);
150149
msg.dlc = sizeof(uint8_t);
151150
uint8_t data[8] = {0};
152151
std::memcpy(data, &value, sizeof(uint8_t));
153152
std::copy(std::begin(data), std::end(data), std::begin(msg.data));
154153

155-
interface_->send(msg);
154+
interface_->sendFrame(msg);
156155
}
157156

158157
void Driver::sendUint16(const uint32_t id, const uint16_t value)
159158
{
160-
can_msgs::msg::Frame msg = getMsg(id);
159+
auto msg = getMsg(id);
161160
msg.dlc = sizeof(uint16_t);
162161
uint8_t data[8] = {0};
163162
std::memcpy(data, &value, sizeof(uint16_t));
164163
std::copy(std::begin(data), std::end(data), std::begin(msg.data));
165164

166-
interface_->send(msg);
165+
interface_->sendFrame(msg);
167166
}
168167

169168
void Driver::sendFixed8x8(const uint32_t id, const float value)
170169
{
171-
can_msgs::msg::Frame msg = getMsg(id);
170+
auto msg = getMsg(id);
172171
msg.dlc = sizeof(int16_t);
173172
int16_t output_value = static_cast<int16_t>(static_cast<float>(1 << 8) * value);
174173

175174
uint8_t data[8] = {0};
176175
std::memcpy(data, &output_value, sizeof(int16_t));
177176
std::copy(std::begin(data), std::end(data), std::begin(msg.data));
178177

179-
interface_->send(msg);
178+
interface_->sendFrame(msg);
180179
}
181180

182181
void Driver::sendFixed16x16(const uint32_t id, const double value)
183182
{
184-
can_msgs::msg::Frame msg = getMsg(id);
183+
auto msg = getMsg(id);
185184
msg.dlc = sizeof(int32_t);
186185
int32_t output_value = static_cast<int32_t>(static_cast<double>((1 << 16) * value));
187186

188187
uint8_t data[8] = {0};
189188
std::memcpy(data, &output_value, sizeof(int32_t));
190189
std::copy(std::begin(data), std::end(data), std::begin(msg.data));
191190

192-
interface_->send(msg);
191+
interface_->sendFrame(msg);
193192
}
194193

195-
can_msgs::msg::Frame Driver::getMsg(const uint32_t id)
194+
can_hardware::Frame Driver::getMsg(const uint32_t id)
196195
{
197-
can_msgs::msg::Frame msg;
196+
can_hardware::Frame msg;
198197
msg.id = id;
199198
msg.dlc = 0;
200199
msg.is_extended = true;
201-
msg.header.stamp = nh_->get_clock()->now();
202-
msg.header.frame_id = "base_link";
200+
// msg.header.stamp = nh_->get_clock()->now();
201+
// msg.header.frame_id = "base_link";
203202
return msg;
204203
}
205204

206-
uint32_t Driver::getApi(const can_msgs::msg::Frame msg)
205+
uint32_t Driver::getApi(const can_hardware::Frame & msg)
207206
{
208207
return msg.id & (CAN_MSGID_FULL_M ^ CAN_MSGID_DEVNO_M);
209208
}
210209

211-
uint32_t Driver::getDeviceNumber(const can_msgs::msg::Frame msg)
210+
uint32_t Driver::getDeviceNumber(const can_hardware::Frame & msg)
212211
{
213212
return msg.id & CAN_MSGID_DEVNO_M;
214213
}
@@ -901,7 +900,7 @@ uint16_t Driver::encoderCounts()
901900

902901
double Driver::getP()
903902
{
904-
Field * field;
903+
Field * field = nullptr;
905904
switch (control_mode_) {
906905
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
907906
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_PC)));
@@ -918,7 +917,7 @@ double Driver::getP()
918917

919918
double Driver::getI()
920919
{
921-
Field * field;
920+
Field * field = nullptr;
922921
switch (control_mode_) {
923922
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
924923
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_IC)));
@@ -935,7 +934,7 @@ double Driver::getI()
935934

936935
double Driver::getD()
937936
{
938-
Field * field;
937+
Field * field = nullptr;
939938
switch (control_mode_) {
940939
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
941940
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_DC)));
@@ -952,7 +951,7 @@ double Driver::getD()
952951

953952
uint8_t * Driver::getRawP()
954953
{
955-
Field * field;
954+
Field * field = nullptr;
956955
switch (control_mode_) {
957956
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
958957
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_PC)));
@@ -969,7 +968,7 @@ uint8_t * Driver::getRawP()
969968

970969
uint8_t * Driver::getRawI()
971970
{
972-
Field * field;
971+
Field * field = nullptr;
973972
switch (control_mode_) {
974973
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
975974
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_IC)));
@@ -986,7 +985,7 @@ uint8_t * Driver::getRawI()
986985

987986
uint8_t * Driver::getRawD()
988987
{
989-
Field * field;
988+
Field * field = nullptr;
990989
switch (control_mode_) {
991990
case clearpath_motor_msgs::msg::PumaStatus::MODE_CURRENT:
992991
field = ictrlFieldForMessage(getApi(getMsg(LM_API_ICTRL_DC)));

clearpath_motor_drivers/puma_motor_driver/src/multi_puma_node.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ MultiPumaNode::MultiPumaNode(const std::string node_name)
9393

9494
node_handle_ = std::shared_ptr<rclcpp::Node>(this, [](rclcpp::Node *){});
9595

96-
// Socket
97-
interface_.reset(new clearpath_ros2_socketcan_interface::SocketCANInterface(
98-
canbus_dev_, node_handle_));
96+
// SocketCAN Interface
97+
interface_ = std::make_shared<can_hardware::drivers::SocketCanDriver>(canbus_dev_);
98+
interface_->registerFrameCallback(
99+
std::bind(&MultiPumaNode::frameCallback, this, std::placeholders::_1));
99100

100101
for (uint8_t i = 0; i < joint_names_.size(); i++) {
101102
drivers_.push_back(puma_motor_driver::Driver(
@@ -106,7 +107,6 @@ MultiPumaNode::MultiPumaNode(const std::string node_name)
106107
));
107108
}
108109

109-
recv_msg_.reset(new can_msgs::msg::Frame());
110110
feedback_msg_.drivers_feedback.resize(drivers_.size());
111111
status_msg_.drivers.resize(drivers_.size());
112112

@@ -284,8 +284,17 @@ bool MultiPumaNode::areAllActive()
284284
return true;
285285
}
286286

287+
void MultiPumaNode::frameCallback(const can_hardware::Frame& frame)
288+
{
289+
std::lock_guard<std::mutex> lock(recv_msg_mutex_);
290+
recv_msg_queue_.push(frame);
291+
}
292+
287293
void MultiPumaNode::run()
288294
{
295+
RCLCPP_INFO_THROTTLE(this->get_logger(), *this->get_clock(), 5000,
296+
"[HAL-y Code]: MultiPumaNode Run Cycle %d", status_count_);
297+
289298
if (active_) {
290299
// Checks to see if power flag has been reset for each driver
291300
for (auto & driver : drivers_) {
@@ -311,10 +320,15 @@ void MultiPumaNode::run()
311320
}
312321
}
313322

314-
// Process all received messages through the connected driver instances.
315-
while (interface_->recv(recv_msg_)) {
323+
while (!recv_msg_queue_.empty()) {
324+
can_hardware::Frame frame;
325+
{
326+
std::lock_guard<std::mutex> lock(recv_msg_mutex_);
327+
frame = std::move(recv_msg_queue_.front());
328+
recv_msg_queue_.pop();
329+
}
316330
for (auto & driver : drivers_) {
317-
driver.processMessage(recv_msg_);
331+
driver.processMessage(frame);
318332
}
319333
}
320334

0 commit comments

Comments
 (0)