我是C ++的新手,并尝试使用ROSserial_stm32框架通过UART从ARM芯片组发布传感器数据。 原始资源来自一个用C语言编写的演示代码,该代码收集数据并通过UART以“字符串格式”发送数据。我的目标是将这些字符串发送替换为 ROS sensor_msgs 帧格式。
为此,我创建了以下头文件:
false
及其关联的 C ++源文件:
import numpy as np
import time
import sortedcontainers
def John(x): #x is 1D array
n=len(x)
rr=[]
for i in range(n):
rr.append(np.sum(x[i]>=x[:i+1]))
return np.array(rr)
def John_2D(rv): #rv is 2d numpy array. rank it along axis 1!
nr,nc=rv.shape
rr=[]
for i in range(nc):
rr.append(np.sum((rv[:,:i+1]<=rv[:,i:i+1]),axis=1))
return np.array(rr).T
def Matvei(x): #x is 1D array
return [sorted(x[:i+1]).index(v)+1 for i, v in enumerate(x)]
def Divarkar1(x):#x is 1D array
n = len(x)
rr=np.ones(n,dtype=int)
m1 = x[1:,None]>=x
m2 = np.tri(n-1,n,k=1, dtype=bool)
rr[1:] = (m1 & m2).sum(1)
return rr
def Divarkar2(x):#x is 1D array
n = len(x)
rr=np.ones(n,dtype=int)
m1 = x[1:,None]>=x
m2 = np.tri(n-1,n,k=1, dtype=bool)
(m1.astype(np.float32)[:,None,:] @ m2[:,:,None])[:,0,0]
rr[1:]=np.einsum('ij,ij->i',m1.astype(np.float32),m2)
return rr
def Monica1(nums): #nums is 1D array
sortednums = sortedcontainers.SortedList()
ranks = []
for num in nums:
ranks.append(sortednums.bisect_left(num))
sortednums.add(num)
return np.array(ranks)+1
def Monica2(nums): #nums is 1D array
_, indexes, ranks = _augmented_mergesort(nums)
result = [None]*len(nums)
for i, rank_ in zip(indexes, ranks):
result[i] = rank_
return np.array(result)+1
def _augmented_mergesort(nums): #nums is 1D array
# returns sorted nums, indexes of sorted nums in original nums, and corresponding ranks
if len(nums) == 1:
return nums, [0], [0]
left, right = nums[:len(nums)//2], nums[len(nums)//2:] #split the array by half
return _merge(*_augmented_mergesort(left), *_augmented_mergesort(right))
def _merge(lnums, lindexes, lranks, rnums, rindexes, rranks):
nums, indexes, ranks = [], [], []
i_left = i_right = 0
def add_from_left():
nonlocal i_left
nums.append(lnums[i_left])
indexes.append(lindexes[i_left])
ranks.append(lranks[i_left])
i_left += 1
def add_from_right():
nonlocal i_right
nums.append(rnums[i_right])
indexes.append(rindexes[i_right] + len(lnums))
ranks.append(rranks[i_right] + i_left)
i_right += 1
while i_left < len(lnums) and i_right < len(rnums):
if lnums[i_left] < rnums[i_right]:
add_from_left()
elif lnums[i_left] > rnums[i_right]:
add_from_right()
else:
raise ValueError("Tie detected")
if i_left < len(lnums):
while i_left < len(lnums):
add_from_left()
#nums += lnums[i_left:]
#indexes += lindexes[i_left:]
#ranks += lranks[i_left:]
else:
while i_right < len(rnums):
add_from_right()
return nums, indexes, ranks
def rank_2D(f,nums): #f is method, nums is 2D numpy array
result=[]
for x in nums:
result.append(f(x))
return np.array(result)
x=np.random.rand(6000)
for f in [John, Matvei, Divarkar1, Divarkar2, Monica1, Monica2]:
t1=time.time()
rr=f(x)
t2=time.time()
print(f'{f.__name__+"_1D: ":16} {(t2-t1):.3f}')
print()
x=np.random.rand(380,900)
t1=time.time()
rr=John_2D(x)
t2=time.time()
print(f'{"John_2D:":16} {(t2-t1):.3f}')
#print(rr)
for f in [Matvei, Divarkar1, Divarkar2, Monica1, Monica2]:
t1=time.time()
rr=rank_2D(f,x)
t2=time.time()
print(f'{f.__name__+"_2D: ":16} {(t2-t1):.3f}')
#print(rr)
但是,我遇到以下错误:
问题1
John_1D: 0.069
Matvei_1D: 7.208
Divarkar1_1D: 0.163
Divarkar2_1D: 0.488
Monica1_1D: 0.032
Monica2_1D: 0.082
John_2D: 0.409
Matvei_2D: 49.044
Divarkar1_2D: 1.276
Divarkar2_2D: 4.065
Monica1_2D: 1.090
Monica2_2D: 3.571
问题2
/*
* ROSserial.h
*
* Created on: May 3, 2020
* Author: fofolevrai
*/
#ifndef INC_ROSSERIAL_H_
#define INC_ROSSERIAL_H_
#include <ros.h>
#include <geometry_msgs/Vector3.h>
#include <sensor_msgs/FluidPressure.h>
#include <sensor_msgs/Temperature.h>
#include <sensor_msgs/RelativeHumidity.h>
class ROSserial
{
private:
// Node handler
ros::NodeHandle nh;
// Temperature data
sensor_msgs::Temperature *lps22hb_air_temperature_t_;
public:
// Temperature publisher/topic
ros::Publisher lps22hb_air_temperature_publisher_t;
// Class constructor
ROSserial(void);
// Methods
void Init(void);
};
#endif /* INC_ROSSERIAL_H_ */
我已经上网了(1) (2)(3)几天了,循环并重新操作代码,但仍然无法理解问题所在?我真的很感谢编译器输出的帮助吗?
感谢您的帮助,
答案 0 :(得分:0)
当您不使用构造函数中的初始化器列表初始化成员变量(和基类)时,它们将被默认初始化。即
ROSserial::ROSserial(void)
{
this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}
等同于
ROSserial::ROSserial(void) : nh(),
lps22hb_air_temperature_t_(),
lps22hb_air_temperature_publisher_t()
{
this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}
来自编译器的错误消息表明lps22hb_air_temperature_publisher_t
无法默认初始化。因此,需要对其进行适当的初始化。
this->lps22hb_air_temperature_publisher_t("LPS22HB_Temperature", this->lps22hb_air_temperature_t_);
该语法在构造函数的初始化列表中对初始化成员有效,但这不是设置对象值的正确语法。您可以使用
this->lps22hb_air_temperature_publisher_t = ros::Publisher("LPS22HB_Temperature", this->lps22hb_air_temperature_t_));
设置lps22hb_air_temperature_publisher_t
的值。
您可以通过以下方式解决这两个问题:
Init
成员函数和class ROSserial
{
private:
// Node handler
ros::NodeHandle nh;
// Temperature data
sensor_msgs::Temperature *lps22hb_air_temperature_t_;
// Constructor, for private usage.
ROSserial(std::string const& desc,
sensor_msgs::Temperature* temp);
public:
// Temperature publisher/topic
ros::Publisher lps22hb_air_temperature_publisher_t;
// Class constructor
ROSserial();
};
ROSserial::ROSserial(std::string const& desc,
sensor_msgs::Temperature* temp) :
lps22hb_air_temperature_t_(temp),
lps22hb_air_temperature_publisher_t(desc, temp)
{
// Initialize ROS node
this->nh.initNode();
this->nh.advertise(lps22hb_air_temperature_publisher_t);
}
// Use delegating constructor.
ROSserial::ROSserial() : ROSserial("LPS22HB_Temperature", new sensor_msgs::Temperature())
{
}