Skip to content

Commit 1065d14

Browse files
FlorianAumanndestogl
authored andcommitted
Added support for RS-485 communication (#11)
* Added support for RS-485 communication Adjusted the sensor handle to dynamically use CAN or RS-485 communication, depending on the plugin loaded. Also added a Configuration file for the RS485 interface. * Updated handles when testing RS485 communication * generated changelog * 0.0.1 * Publishing before merge
1 parent f30f957 commit 1065d14

9 files changed

Lines changed: 83 additions & 36 deletions

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Changelog for package force_torque_sensor
1717
* Update .travis.rosinstall
1818
* Added Melodic in overview
1919
* Added travis config for melodic
20+
0.0.1 (2018-12-12)
21+
------------------
2022
* Update CMakeLists.txt
2123
* Updated INSTALL paths
2224
* Update CMakeLists.txt

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ endif()
4242

4343
generate_ros_parameter_files(
4444
cfg/CoordinateSystemCalibration.params
45-
cfg/CanConfiguration.params
45+
cfg/HWCommunicationConfiguration.params
4646
cfg/FTSConfiguration.params
4747
cfg/NodeConfiguration.params
4848
cfg/PublishConfiguration.params

cfg/CanConfiguration.params

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
from rosparam_handler.parameter_generator_catkin import *
3+
gen = ParameterGenerator()
4+
5+
gen.add("type", paramtype="int", description="communication type; important for CAN", default=-1, configurable=False)
6+
gen.add("path", paramtype="std::string", description="path", default=" ", configurable=False)
7+
gen.add("baudrate", paramtype="int", description="baudrate", default=-1, configurable=False)
8+
9+
exit(gen.generate("force_torque_sensor", "ForceTorqueSensor", "HWCommunicationConfiguration"))

cfg/RS485Configuration.params

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env python
2+
from rosparam_handler.parameter_generator_catkin import *
3+
gen = ParameterGenerator()
4+
5+
gen.add("path", paramtype="std::string", description="path_rs", default=" ", configurable=False)
6+
gen.add("baudrate", paramtype="int", description="baudrate", default=-1, configurable=False)
7+
8+
exit(gen.generate("force_torque_sensor", "ForceTorqueSensor", "RS485Configuration"))

config/sensor_configuration.yaml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Node:
2+
sim: false
3+
sensor_hw: "force_torque_sensor/ForceTorqueSensorSim"
4+
ft_pub_freq: 200
5+
ft_pull_freq: 800
6+
sensor_frame: "fts_reference_link"
7+
transform_frame: "fts_base_link"
8+
9+
Calibration:
10+
Offset:
11+
n_measurements: 500
12+
T_between_meas: 0.01
13+
isStatic: false # true= use static offset Calibration, false=use calibrate Sensor to 0 in current State
14+
15+
ThresholdFilter:
16+
name: ThresholdFilter
17+
type: iirob_filters/ThresholdFilterWrench
18+
params: {linear_threshold: 2.5, angular_threshold: 0.3}
19+
20+
LowPassFilter:
21+
name: LowPassFilter
22+
type: iirob_filters/LowPassFilterWrench
23+
params: {SamplingFrequency: 200.0, DampingFrequency: 15.0, DampingIntensity: -6.0}
24+
25+
MovingMeanFilter:
26+
name: MovingMeanFilter
27+
type: filters/MovingMeanFilterWrench
28+
params: {divider: 4}
29+
30+
GravityCompensation:
31+
name: GravityCompensationWrench
32+
type: iirob_filters/GravityCompensator
33+
params: {world_frame: "base_link"}
34+
35+
Publish:
36+
sensor_data: true
37+
low_pass: true
38+
moving_mean: true
39+
transformed_data: true
40+
gravity_compensated: true
41+
threshold_filtered: true

config/socket_can.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CAN:
1+
HWComm:
22
type: 5 # CANITFTYPE_SOCKET_CAN
33
path: can0
44

include/force_torque_sensor/force_torque_sensor_handle.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ typedef unsigned char uint8_t;
7979

8080
#include <dynamic_reconfigure/server.h>
8181
#include <force_torque_sensor/CoordinateSystemCalibrationParameters.h>
82-
#include <force_torque_sensor/CanConfigurationParameters.h>
82+
#include <force_torque_sensor/HWCommunicationConfigurationParameters.h>
8383
#include <force_torque_sensor/FTSConfigurationParameters.h>
8484
#include <force_torque_sensor/PublishConfigurationParameters.h>
8585
#include <force_torque_sensor/NodeConfigurationParameters.h>
@@ -127,7 +127,7 @@ class ForceTorqueSensorHandle : public hardware_interface::ForceTorqueSensorHand
127127
double interface_torque_[3];
128128

129129
force_torque_sensor::CoordinateSystemCalibrationParameters CS_params_;
130-
force_torque_sensor::CanConfigurationParameters can_params_;
130+
force_torque_sensor::HWCommunicationConfigurationParameters HWComm_params_;
131131
force_torque_sensor::FTSConfigurationParameters FTS_params_;
132132
force_torque_sensor::PublishConfigurationParameters pub_params_;
133133
force_torque_sensor::NodeConfigurationParameters node_params_;
@@ -166,10 +166,10 @@ class ForceTorqueSensorHandle : public hardware_interface::ForceTorqueSensorHand
166166

167167
uint _num_transform_errors;
168168

169-
// CAN parameters
170-
int canType;
171-
std::string canPath;
172-
int canBaudrate;
169+
// HWComm parameters
170+
int HWCommType; // Only important if can is used
171+
std::string HWCommPath;
172+
int HWCommBaudrate;
173173
int ftsBaseID;
174174
double nodePubFreq, nodePullFreq;
175175
uint calibrationNMeasurements;

src/force_torque_sensor_handle.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@
4848
using namespace force_torque_sensor;
4949

5050
ForceTorqueSensorHandle::ForceTorqueSensorHandle(ros::NodeHandle& nh, hardware_interface::ForceTorqueSensorHW *sensor, std::string sensor_name, std::string output_frame) :
51-
hardware_interface::ForceTorqueSensorHandle(sensor_name, output_frame, interface_force_, interface_torque_), nh_(nh), calibration_params_{nh.getNamespace()+"/Calibration/Offset"}, CS_params_{nh.getNamespace()}, can_params_{nh.getNamespace()+"/CAN"}, FTS_params_{nh.getNamespace()+"/FTS"}, pub_params_{nh.getNamespace()+"/Publish"}, node_params_{nh.getNamespace()+"/Node"}, gravity_params_{nh.getNamespace()+"/GravityCompensation/params"}
51+
hardware_interface::ForceTorqueSensorHandle(sensor_name, output_frame, interface_force_, interface_torque_), nh_(nh), calibration_params_{nh.getNamespace()+"/Calibration/Offset"}, CS_params_{nh.getNamespace()}, HWComm_params_{nh.getNamespace()+"/HWComm"}, FTS_params_{nh.getNamespace()+"/FTS"}, pub_params_{nh.getNamespace()+"/Publish"}, node_params_{nh.getNamespace()+"/Node"}, gravity_params_{nh.getNamespace()+"/GravityCompensation/params"}
5252
{
5353
p_Ftc = sensor;
5454
prepareNode(output_frame);
5555
}
5656

5757
ForceTorqueSensorHandle::ForceTorqueSensorHandle(ros::NodeHandle& nh, std::string sensor_name, std::string output_frame) :
58-
hardware_interface::ForceTorqueSensorHandle(sensor_name, output_frame, interface_force_, interface_torque_), nh_(nh), calibration_params_{nh.getNamespace()+"/Calibration/Offset"}, CS_params_{nh.getNamespace()}, can_params_{nh.getNamespace()+"/CAN"}, FTS_params_{nh.getNamespace()+"/FTS"}, pub_params_{nh.getNamespace()+"/Publish"}, node_params_{nh.getNamespace()+"/Node"}, gravity_params_{nh.getNamespace()+"/GravityCompensation/params"}
58+
hardware_interface::ForceTorqueSensorHandle(sensor_name, output_frame, interface_force_, interface_torque_), nh_(nh), calibration_params_{nh.getNamespace()+"/Calibration/Offset"}, CS_params_{nh.getNamespace()}, HWComm_params_{nh.getNamespace()+"/HWComm"}, FTS_params_{nh.getNamespace()+"/FTS"}, pub_params_{nh.getNamespace()+"/Publish"}, node_params_{nh.getNamespace()+"/Node"}, gravity_params_{nh.getNamespace()+"/GravityCompensation/params"}
5959
{
6060
node_params_.fromParamServer();
6161

@@ -94,7 +94,7 @@ void ForceTorqueSensorHandle::prepareNode(std::string output_frame)
9494

9595
calibration_params_.fromParamServer();
9696
CS_params_.fromParamServer();
97-
can_params_.fromParamServer();
97+
HWComm_params_.fromParamServer();
9898
FTS_params_.fromParamServer();
9999
pub_params_.fromParamServer();
100100
node_params_.fromParamServer();
@@ -137,9 +137,9 @@ void ForceTorqueSensorHandle::prepareNode(std::string output_frame)
137137
srvServer_SetSensorOffset = nh_.advertiseService("SetSensorOffset", &ForceTorqueSensorHandle::srvCallback_setSensorOffset, this);
138138

139139
// Read data from parameter server
140-
canType = can_params_.type;
141-
canPath = can_params_.path;
142-
canBaudrate = can_params_.baudrate;
140+
HWCommType = HWComm_params_.type;
141+
HWCommPath = HWComm_params_.path;
142+
HWCommBaudrate = HWComm_params_.baudrate;
143143
ftsBaseID = FTS_params_.base_identifier;
144144
isAutoInit = FTS_params_.auto_init;
145145
nodePubFreq = node_params_.ft_pub_freq;
@@ -205,8 +205,8 @@ void ForceTorqueSensorHandle::prepareNode(std::string output_frame)
205205
useThresholdFilter = true;
206206
threshold_filter_->configure(nh_.getNamespace()+"/ThresholdFilter");
207207
}
208-
209-
p_Ftc->initCommunication(canType, canPath, canBaudrate, ftsBaseID);
208+
209+
p_Ftc->initCommunication(HWCommType, HWCommPath, HWCommBaudrate, ftsBaseID);
210210

211211
if (isAutoInit)
212212
{
@@ -493,11 +493,11 @@ bool ForceTorqueSensorHandle::srvReadDiagnosticVoltages(force_torque_sensor::Dia
493493

494494
void ForceTorqueSensorHandle::pullFTData(const ros::TimerEvent &event)
495495
{
496-
int status = 0;
497-
498-
bool bRet = p_Ftc->readFTData(status, sensor_data.wrench.force.x, sensor_data.wrench.force.y, sensor_data.wrench.force.z,
499-
sensor_data.wrench.torque.x, sensor_data.wrench.torque.y, sensor_data.wrench.torque.z);
500-
if (bRet != false)
496+
ros::Time timestamp = ros::Time::now();
497+
498+
if (p_Ftc->readFTData(0, sensor_data.wrench.force.x, sensor_data.wrench.force.y, sensor_data.wrench.force.z,
499+
sensor_data.wrench.torque.x, sensor_data.wrench.torque.y, sensor_data.wrench.torque.z)
500+
!= false)
501501
{
502502
sensor_data.header.stamp = ros::Time::now();
503503
sensor_data.header.frame_id = sensor_frame_;
@@ -513,19 +513,13 @@ void ForceTorqueSensorHandle::pullFTData(const ros::TimerEvent &event)
513513
//lowpass
514514
low_pass_filtered_data.header = sensor_data.header;
515515
if(useLowPassFilter){
516-
std::vector<double> in_data= {(double)sensor_data.wrench.force.x, double(sensor_data.wrench.force.y), (double)sensor_data.wrench.force.z,(double)sensor_data.wrench.torque.x,(double)sensor_data.wrench.torque.y,(double)sensor_data.wrench.torque.z};
517-
std::vector<double> out_data= {(double)low_pass_filtered_data.wrench.force.x, double(low_pass_filtered_data.wrench.force.y), (double)low_pass_filtered_data.wrench.force.z,(double)low_pass_filtered_data.wrench.torque.x,(double)low_pass_filtered_data.wrench.torque.y,(double)low_pass_filtered_data.wrench.torque.z};
518-
519516
low_pass_filter_->update(sensor_data,low_pass_filtered_data);
520517
}
521518
else low_pass_filtered_data = sensor_data;
522519

523520
//moving_mean
524521
moving_mean_filtered_wrench.header = low_pass_filtered_data.header;
525522
if(useMovingMean){
526-
std::vector<double> in_data= {(double)low_pass_filtered_data.wrench.force.x, double(low_pass_filtered_data.wrench.force.y), (double)low_pass_filtered_data.wrench.force.z,(double)low_pass_filtered_data.wrench.torque.x,(double)low_pass_filtered_data.wrench.torque.y,(double)low_pass_filtered_data.wrench.torque.z};
527-
std::vector<double> out_data = {(double)moving_mean_filtered_wrench.wrench.force.x, double(moving_mean_filtered_wrench.wrench.force.y), (double)moving_mean_filtered_wrench.wrench.force.z,(double)moving_mean_filtered_wrench.wrench.torque.x,(double)moving_mean_filtered_wrench.wrench.torque.y,(double)moving_mean_filtered_wrench.wrench.torque.z};
528-
529523
moving_mean_filter_->update(low_pass_filtered_data, moving_mean_filtered_wrench);
530524
}
531525
else moving_mean_filtered_wrench = low_pass_filtered_data;
@@ -548,6 +542,8 @@ void ForceTorqueSensorHandle::pullFTData(const ros::TimerEvent &event)
548542
moving_mean_pub_->unlockAndPublish();
549543
}
550544
}
545+
546+
// std::cout << (ros::Time::now() - timestamp).toNSec()/1000.0 << " ms" << std::endl;
551547
}
552548

553549
void ForceTorqueSensorHandle::filterFTData(){

0 commit comments

Comments
 (0)