ros publisherでcmd_をリリースします。レベル命令(python)

3827 ワード

ros wikiのリンクを参照してください。https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwja9rnUjPPPAhXGI5QKHZgxDnsQFggcMAA&url=http%3A%2F%2Fwiki.ros.org%2FROS%2FTutorials%2FWritingPublisherSubscriber(c%252 B%252 B)&usg=AFQj CNGExFyKLatoS 0 PpIZyoWJvAqa 62 sQ&bvm=bv.36593572、d.cGw&cad=rja
ここで実現されるのは、ローカルに生成された一連の制御命令をcsvファイルから読み出し、ロボットに一定の周波数で発信することである。まずcmd_を紹介しますレベルのデータタイプhttp://docs.ros.org/api/geometry_msgs/html/msg/Twists.
 #This expresses velocity in free space broken into its linear and angular parts.
Vector3  linear
Vector3  angular
三次元の速度制御コマンドと三次元の角度制御コマンドで構成されています。普通はラインar.xとangglar.zを取ればいいです。私達は下記のコードを書く必要があります。このデータの種類を正常に使うことができます。
from geometry_msgs.msg import Twist
次にcsvファイルを読み込むので、csv.readerで簡単に実現できます。
read=csv.reader(csvfile)
for row in read:
            xxx=','.join(row)
            para =xxx.split(',') 
            vel=para[0]
            ang=para[1]
xxxはcsvファイルの各行の2つのデータを返しました。カンマ区切りで、paraはカンマ区切りで二つのデータをそれぞれ抽出して配列に保存します。次はvel、ang二つの変数でそれぞれ保存します。
データがあったら、もう一歩必要です。
msg = Twist() #   
msg.linear.x=float(vel)
msg.angular.z=float(ang)
最後に私達はpub.publish(msg)を発表することができます。
完全コードは以下の通りです
#!/usr/bin/env python
import rospy
import csv
from geometry_msgs.msg import Twist


csvfile=file('your/csv/file.csv','r')
read=csv.reader(csvfile)

def talker():
    pub = rospy.Publisher('/jackal_velocity_controller/cmd_vel', Twist,queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(50) 
    msg = Twist()
    while not rospy.is_shutdown():
    for row in read:
            xxx=','.join(row)
            para =xxx.split(',') 
            vel=para[0]
            ang=para[1]
            msg.linear.x=float(vel)
            msg.angular.z=float(ang)
            pub.publish(msg)
            rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass