Python代码是:
def function_callback(my_data):
global packet
my_array=my_data.data
print(my_array)
packet = bytearray()
for byte in my_array:
packet.append(byte+48)
packet.append(0x0A)
packet.append(0x0D)
我知道这会获取ROS std_msgs/BYTEMULITARRAY类型的my_数据,将该消息中的实际数据传递到数组my_数组,现在该数组中的元素将被读取为ASCI而不是位,因此for循环将48添加到每个元素,以获得其十进制值。最后两个附录是Arduino中需要的一些特殊字节
C++中我不知道如何做这个。我找到了指令here并创建了一个类SerialComm,该类本质上模仿了该代码,该类中最重要的方法应该是:void SerialComm::write_port(unsigned char* msg)
{
int i=write(serial_port, msg, sizeof(msg));
}
我不确定参数是否应该具有unsigned char*数据类型,但unistd.h中的write函数似乎支持这一点
总的来说,如何准备“数据包”并将其发送到端口
更具体地说,我需要在ROS中写入的数据是std_msgs/bytemultirray类型,我检查了它,实际数据是std::vector<;签名字符>;类型,我尝试将此作为解决方案:
unsigned char* make_byte_array(std::vector<signed char> array) const
{
unsigned char retval[array.size()+2];
int i=0;
while (i<array.size())
{
retval[i]=array[i];
i++;
}
retval[i+1]=0x0A;
retval[i+2]=0x0D;
return retval;
}
这个函数显然是无意义的,但它是编译的,它自然不起作用,因为返回的是retval变量的地址,其他什么都没有,但我主要是试图以某种方式将无符号字符*传递给该写函数,以便将数据写入端口。当然,主要的问题是如何将从std_msgs/bytemultirray获得的std::vector数组转换为写入arduino端口所需的任何内容,并从本质上模拟Python解决方案中发送的数据包。我想我在这里主要是在理解chars数据类型方面遇到了困难,因为我从未真正使用过它们,我记得它们很重要,因为它们具有单位位内存大小
最直接的解决方案:
发生的情况:
array
通过值传递,因此会自动复制它。我们利用此拷贝消除了在函数内部手动拷贝的需要。然后我们附加换行符和回车符,并返回结果vector
要获取存储在向量中的数组,请使用
vector
的data
方法或者在c++11之前的世界中,我从未见过这种技巧不起作用:
所以。。。出了什么问题?在C++中返回数组是困难的。不同于C++中的其他任何东西,一个数组默认通过引用通过Array Decay。{}衰减为指针,指针返回,
retval
超出范围并被销毁,留下指向无效内存的指针相关问题 更多 >
编程相关推荐