0

我有以下 Thread.cpp:

   while (1) 
    {
       rplidar_response_measurement_node_t nodes[8192];
       size_t   count = _countof(nodes);

       op_result = drv->grabScanData(nodes, count);

       if (IS_OK(op_result)) 
        {
           drv->ascendScanData(nodes, count);

           for (int pos = 0; pos < (int)count ; ++pos) 
            {

               nodes[pos].sync_quality & RPLIDAR_RESP_MEASUREMENT_SYNCBIT;
               nodes[pos].angle_q6_checkbit >> RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT/64.0f;
               nodes[pos].distance_q2/4.0f;
               nodes[pos].sync_quality >> RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT;
            }
        }
    }
  return ;
}

运动线程.cpp

void Motion::Synchronization(QString motiontype)
{
      if(motiontype == START)
       {

   if(269<Thread::angle_q6_checkbit && Thread::angle_q6_checkbit <271)
    {
        if(Thread::distance_q2>1200)
        {
            dist_left=1200;
        }
     else
      {
           dist_left=Thread::distance_q2;
      }
                cout<<"Motion +Stuff+="<< endl;
    }
  }
}

这不是我的确切代码,这是我将获取数据并将数据存储到变量中的部分。distance_q2, angle_q6_checkbit等不是原子变量,因此从不同的线程读取和写入它们是不一致的!在同一个线程中,如果我尝试打印数据,我会得到正确的读数。输出如下。

来自 Thread.cpp 的正确数据

现在,我试图将数据用于处理或其他我的东西。存储距离、角度质量数据等Thread::sync_quality, Thread::angle_q6_checkbit, Thread::distance

从激光数据中获取数据Thread.cppmotion.cpp线程(运动线程中的 cout 数据):

cout << "distance "<< Thread::distance_q2 << endl;
cout << "angle "<< Thread::angle_q6_checkbit << endl;
cout << "quality level "<< int(Thread::sync_qualitylevel) << endl;

我得到了不正确的输出(只有 359 度,这也是不正确的)。我无法得出结论。现在上面的输出是:

另一个线程motion.coo的数据不正确

我试图将 then 声明为原子,但我看不到任何改进。帮助将不胜感激。

4

0 回答 0