我对 ROS 和嵌入式 C++ 编程非常非常陌生。我讨厌 Python,我希望将最初用 Python 编写的节点转换为 C++。我不会详细介绍这种转换,我对我采用的 OOP 方法很满意(将订阅者回调放入类中,将发布者作为类成员),但主要问题是 python 中处理所需字节数组的一段代码用于与 Arduino 进行通信。我从未在 C++ 中使用过字节和位,事实证明人们使用 Python 是因为其友好的 Pyserial 库,而 C++ 中的等效方法非常黑暗,特别是在 Linux 操作系统上。Python代码是:def function_callback(my_data):global packetmy_array=my_data.dataprint(my_array)packet = bytearray()for byte in my_array: packet.append(byte+48)packet.append(0x0A)packet.append(0x0D)我知道这需要 ROS std_msgs/ByteMultiArray 类型的 my_data,将实际数据从该消息传递到数组 my_array,现在该数组中的元素被读取为 ASCI 而不是位,因此 for 循环将 48 添加到中的每个元素为了得到他们的十进制值。最后两个附加是 Arduino 中需要的一些特殊字节。在 C++ 中我不知道如何做到这一点。我在这里找到了说明并创建了一个 SerialComm 类,它本质上模仿了该代码,该类中最重要的方法应该是:void SerialComm::write_port(unsigned char* msg){ int i=write(serial_port, msg, sizeof(msg));}我不确定参数是否应该具有 unsigned char* 数据类型,但似乎 unistd.h 中的 write 函数支持这一点。总的来说,我如何准备“数据包”并将其发送到端口?更具体地说,我需要写入的数据是ROS中的std_msgs/ByteMultiArray类型,我检查了它,实际数据是std::vector<signed char>类型,我尝试将此作为解决方案: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 变量的地址,没有其他任何东西,但我主要试图以某种方式将 unsigned char* 传递给该 write 函数以将数据写入端口。当然,主要问题是如何将从 std_msgs/ByteMultiArray 获得的 std::vector 数组转换为写入 arduino 端口所需的任何内容,并本质上模仿 Python 解决方案中发送的数据包。我想我在这里主要是在理解字符数据类型方面遇到困难,因为我从未真正使用过它们,我只记得它们很重要,因为具有单位位内存大小。
1 回答
30秒到达战场
TA贡献1828条经验 获得超6个赞
最直接的解决办法:
std::vector<signed char> make_byte_array(std::vector<signed char> array) const
{
array.push_back('\n');
array.push_back('\r');
return array;
}
发生了什么:array按值传递,因此会自动复制。我们利用此复制来消除在函数内部手动复制的需要。然后我们附加换行符和回车符并返回结果vector。
要获取存储在向量内的数组,请使用 vector的data方法
signed char * data = result_vector.data();
或者在 c++11 之前的世界中,我从未见过这个技巧不起作用:
signed char * data = &result_vector[0];
那么……出了什么问题?在 C++ 中返回数组很困难。与 C++ 中的其他所有内容不同,由于Array Decay ,数组默认通过引用传递。retval衰减为一个指针,该指针被返回,并retval超出范围并被销毁,留下一个指向无效内存的指针。
添加回答
举报
0/150
提交
取消