我有以下代码:
#include <ros.h>
#include <ros/time.h>
#include <sensor_msgs/Range.h>
#define sensNumber 3
#define firstTrigPin 3
#define firstEchoPin 9
ros::NodeHandle nh;
sensor_msgs::Range range_msg;
ros::Publisher pub_range( "/ultrasound", &range_msg);
char frameid[] = "/ultrasound";
int trigPin=firstTrigPin;
int echoPin=firstEchoPin;
void increasepins(){
trigPin++;
echoPin++;
if(trigPin>firstTrigPin+sensNumber){
trigPin=firstTrigPin;
}
if(echoPin>firstEchoPin+sensNumber){
echoPin=firstEchoPin;
}
}
void setup(){
nh.initNode();
nh.advertise(pub_range);
for(int i=0;i<sensNumber;i++){
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
increasepins();
}
range_msg.radiation_type = sensor_msgs::Range::ULTRASOUND;
range_msg.header.frame_id = frameid;
range_msg.field_of_view = 0.1;
range_msg.min_range = 0.0;
range_msg.max_range = 6.47;
}
long range_time;
void loop()
{
increasepins();
//publish the adc value every 50 milliseconds
//since it takes that long for the sensor to stablize
long duration, distance;
digitalWrite(trigPin, LOW); // should be high?
delayMicroseconds(2); // make this 20
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // reset value?
digitalWrite(trigPin, LOW);
distance = pulseIn(echoPin, HIGH)/ 58,2; //sensor constant is 3.4
range_msg.range = distance;
range_msg.header.stamp = nh.now();
range_time = millis() + 50;
range_msg.field_of_view = trigPin;
range_msg.min_range = echoPin;
pub_range.publish(&range_msg);
nh.spinOnce();
}
上面的代码在我的Funduino上以大约每秒2次的速度在整个循环中运行。但是,如果我删除
increasePins
方法,它将以每秒约100次的速度运行。为什么机会很大?看起来如此微不足道的代码(只需增加2个变量,然后将它们进行比较)会有如此大的不同?作为参考,我们正在讨论此功能:
void increasepins(){
trigPin++;
echoPin++;
if(trigPin>firstTrigPin+sensNumber){
trigPin=firstTrigPin;
}
if(echoPin>firstEchoPin+sensNumber){
echoPin=firstEchoPin;
}
}
与必须等待回波返回并获得时间以及其余代码所需的东西相比,对我来说,这看起来非常简单。
最佳答案
我相信问题之一是,如果您在循环中注释增量inst 函数,则编译器将决定在循环外采用一些逻辑。为此,您需要查看@汇编代码,并查看循环中正在执行的操作。
另一个问题可能与引脚行为有关。例如,我读到“ pulseIn ”函数向该引脚发送脉冲并测量其持续时间。您可以用它来脉冲“echoPin”。我怀疑如果不更改echoPin,则持续时间会相当恒定。但是,更改echoPin可能会导致另一引脚的脉冲持续时间更长的情况。要对此进行测试,您可以尝试在未注释增加引脚函数的情况下,使用带有超时参数的pulsePin(echoPin, HIGH, timeout)
。我希望循环运行得更快。
因此,我认为增加引脚不是瓶颈。我建议将其内联(但是,如果编译器尚未这样做,则可以提高速度)。