こんにちは、ROS1年生の学生です。
本日は、arduino_MegaとPC(python)での通信部分でどうしても解決できない問題が発生してしまったため、この場をお借りして質問させていただきます。
arduinoのスケッチの例にあるarray_testを試している時に発生した問題です。
結論としては、arduino側のコールバックがうまくかかりません
スケッチ例のarray_testは、PoseArray型をsubし、その要素のpositionを合計したものをPose型としてパブリッシュする、と言うものです。
これを試してみるため、pythonでPoseArray型をパブリッシュする簡単なプログラムを組み、実行して見たところ、
PC側でパブリッシュするPoseArrayの配列数が1の時は、arduino側のコールバックはほとんどうまく実行されます。(20回に一回程度反応しない)
PC側でパブリッシュするPoseArrayの配列数が2の時は、arduino側のコールバックはほとんど実行されません(50回に一回程度反応する)
と言う問題が発生しました。配列数1の時はいいとしても、配列数2のほとんどコールバックがかからないのはとても困ります。
配列数3以上も2の場合と同様でした。
この問題にあたって、バッファの溢れを疑ったのですが、ターミナルにはバッファ溢れのエラーは表示されませんでした。
また、ヘッダーを除いたバイト数は、配列数2の場合、112byte程度なので、arduino側が512byteのバッファ空間を所有していることを考えると溢れではないと思います。
JointState型やFloatMultiArray型といった配列を有した型でも、まったくの同じ条件ではありませんが、コールバックがかからないという似た問題が発生しました。
String型やint8型等の場合は、問題なく動作しました。
特殊なことをしていないため、私が基本的なことを怠っている可能性が高いのですが、解決することができません。お力をお貸しください。
ardino_IDEのバージョン: 1.6.12
使用arduino : arduino_Mega2560
rosのバージョン : indigo
Ubuntuのバージョン : Ubuntu 14.04.5 LTS
arduino側のプログラム
arduino_IDEにros_libを追加したときに、サンプルとして初期に追加されるものです。
PC(python)のパブリッシュ側のプログラム
#!/usr/bin/env python
#coding: utf-8
import rospy
from geometry_msgs.msg import PoseArray, Pose
if __name__ == '__main__':
rospy.init_node('test_pub')
pub_pa = rospy.Publisher("poses", PoseArray , queue_size=10)
aaa = PoseArray()
aaa.header.seq = 0
aaa.header.stamp = rospy.Time.now()
aaa.header.frame_id = "umaku_ike"
aaa.poses.append( Pose() )
aaa.poses[0].position.x=1.1
aaa.poses[0].position.y=1.2
aaa.poses[0].position.z=1.3
aaa.poses[0].orientation.x=1.4
aaa.poses[0].orientation.y=1.5
aaa.poses[0].orientation.z=1.6
aaa.poses[0].orientation.w=1.7
aaa.poses.append( Pose() )
aaa.poses[1].position.x=2.1
aaa.poses[1].position.y=2.2
aaa.poses[1].position.z=2.3
aaa.poses[1].orientation.x=2.4
aaa.poses[1].orientation.y=2.5
aaa.poses[1].orientation.z=2.6
aaa.poses[1].orientation.w=2.7
rate = rospy.Rate(1)
while not rospy.is_shutdown():
aaa.header.seq += 1
aaa.header.stamp = rospy.Time.now()
pub_pa.publish(aaa)
rate.sleep()