ros_arduino_bridge功能包集的使用錯誤及解決方法總結
歡迎廣大網友批評指正,如需轉載請註明出處。
未能啟動arduino_node節點
在你使用roslaunch ros_arduino_python arduino.launch
啟動該節點之後,可能會遇到下面的錯誤:
ERROR: cannot launch node of type [ros_arduino_python/arduino_node.py]: can’t locate node [arduino_node.py] in package [ros_arduino_python].
產生這個錯誤的主要原因有兩種:
- 你的電腦並未連線Arduino板,或者沒有連線好,這時你就需要檢查一下連線了;
- 如果連線完好,那麼很可能就是你對檔案arduino_node.py沒有可執行的許可權,所以只要使用命令
chomd a+x arduino_node.py
給它加上可執行許可權就行了.
未能確定Arduino的波特率
你也許遇到過這樣的錯誤:
Connecting to Arduino on port /dev/ttyACM0 …
Failed to determine baud rate of Arduino so aborting!
這個問題其實比較棘手。其實在啟動之前你應該使用串列埠監視器對這個Arduino sketch進行測試的,如果沒有問題的話在進行下一步的配置。筆者曾使用預設的baud rate(57600),但是並不能從串列埠監視器讀出正確的值,甚至什麼也輸不出來。我曾今嘗試過修改程式碼中預設的波特率,但是程式碼的原作者卻堅持認為不應該修改它,但是我將其修改成9600卻成功地從串列埠監視器得到了預期的值。
可是我再次執行這個節點的時候,還是會出現這樣的錯誤。最後該功能包的原作者給了我一個這樣的答案:你用的那個分支(master)還在開發中,可能會存在問題,你可以嘗試使用indigo-devel。其實這個答案讓我很難接受,他並沒有告訴我具體什麼原因導致的這樣的問題,而是以這樣的一個理由來搪塞我。更好況,在github的慣例中,master分支應該是一個隨時可以使用的穩定版,倉庫管理者應該即時合併分支。不過,我也只好按照它的建議使用了另一個分支。果然,換了一個分支之後就不會出現這樣的錯誤了。
所以我這樣總結這個問題的解決方法:
- 首先測試Arduino sketch(即功能包裡的ros_arduino_firmware資料夾裡的程式碼)是否執行正常;
- 如果仍然出現這樣的錯誤,那麼就請檢查你是用的那個分支是否與你的板子或電腦相容.
之後我會繼續研究到底是什麼原因導致的這個錯誤。
命令執行錯誤
Connecting to Arduino on port /dev/ttyACM0 …
Serial Exception:
(<\class ‘serial.serialutil.SerialException’>, SerialException(), <\traceback object at 0x7fbc064c7c20)>
Traceback follows:
Traceback (most recent call last):
File “/home/bird/catkin_ws/src/ros_ab_indigo/ros_arduino_python/src/ros_arduino_python/arduino_driver.py”, line 75, in connect
raise SerialException
SerialException
Cannot connect to Arduino!
[arduino-1] process has died [pid 2849, exit code 1, cmd /home/bird/catkin_ws/src/ros_ab_indigo/ros_arduino_python/nodes/arduino_node.py __name:=arduino __log:=/home/bird/.ros/log/3945ca82-2e1e-11e6-abd3-00e04c7df3a3/arduino-1.log].
log file: /home/bird/.ros/log/3945ca82-2e1e-11e6-abd3-00e04c7df3a3/arduino-1*.log
all processes on machine have died, roslaunch will exit
shutting down processing monitor…
… shutting down processing monitor complete
done
如果你得到這樣的錯誤,很可能就是因為從serial獲取的輸出結果有問題。你在python指令碼檔案的相應位置輸出獲取的結果,你就會發現結果是錯誤的。但是究竟是什麼原因導致這樣的問題呢?直接原因就是串列埠的實際波特率與你所設定的波特率大小不一致。
這時你就需要檢查一下你給arduino所設定的波特率是否和你的配置檔案(my_arduino_params.yaml)中的波特率一致。筆者曾近犯過這樣一個愚蠢的錯誤:arduino板已經被其他人用過,而我忘記了重新向arduino上傳ros_arduino_firmware中的程式碼,結果就出現了上面的錯誤。
另外還有一個比較隱晦的原因,就是你同時啟動了Arduino IDE的串列埠監視器,導致它和這個節點爭奪serial,於是就造成了錯誤或者不完整的資訊。當然,類似多個程式使用同一個串列埠的原因也會導致這樣的錯誤。