我對 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
提交
取消