ROS小车应用:控制机器人做圆周运动
利用python编写ros发布器让机器人做圆周运动
·
一、首先创建一个功能包
跳转到src目录下
catkin_create_pkg 功能包名字
进入目录,创建一个script目录(主要使用py来写)
然后创建一个py文件,取名draw_circle.py 默认是没有可执行权限的,要手动加上
二、控制机器人做圆周运动
思路:通过给机器人持续发布一个含有角速度和线速度的运动指令,让机器人实现一个圆周运动
开始写代码
#!/usr/bin/python 这个必写的啦
import rospy 这个也是必写的啦
from geometry_msg.msg import Twist
(我们要发布一个速度指令,之前在执行机器人例程中,启动的键盘发布节点,发布的消息名是cmd_vel,消息类型则是Twist,所以我们import Twist这个消息)
先创建一个发布器
def cmd_vel_pub():
rospy.init_node(‘draw_circle’,anonymous=False) 初始化一个节点,取名draw_circle,anonymous为false让节点名保持不变
再创建一个发布器,消息名取cmd_vel,消息类型是Twist,设置一个缓存队列queue_size=10,这样最多可以缓存10条消息
cmd_pub = rospy.Publisher(‘cmd_vel’,Twist,queue_size=10)
设置一个发布频率,设置为10赫兹,一秒钟发布10次消息
rate = rospy.Rate(10)
然后创建一个Twist类型的消息
twist = Twist()
这时可以输出一条消息,比如“开始控制机器人”
rospy.loginfo(‘Start Control Robot Draw a Circle’)
然后进入一个循环,并设置,只要节点没有结束,就一直循环
while not rospy.is.shutdown():
然后我们在这里循环发布消息,要给twist里面进行赋值
我们先查看twist消息中包含哪些内容,可以打开终端,用rosmsg show geometry_msgs/Twist查看
可以看到包含了linear的向量,里面有xyz(线速度),以及角速度的xyz
先给线速度赋值
twist.linear.x = 0.2 咱沿着x方向运动,设定以0.2米每秒的速度
twist.angular.z = 0.4 角速度我们赋值给z,我们是绕着z轴旋转,0.4弧度每秒
根据v(线速度)=Ω(角速度)*r(半径)可以算出,r=0.5米(0.2 = 0.4*0.5)
赋值完之后,我们发布出去
cmd_pub.publish(twist)
发布完成后,我们把剩余的时间用sleep消耗掉
rate.sleep()
然后写主函数
if __name__ == '__main__':
try:
cmd_vel_pub()
except rospy.ROSInternalException:
pass
写完了,完整代码:
#!/usr/bin/python
import rospy
from geometry_msgs.msg import Twist
def cmd_vel_pub():
rospy.init_node('draw_circle',anonymous=False)
cmd_pub = rospy.Publisher('cmd_vel',Twist,queue_size=10)
rate = rospy.Rate(10)
twist = Twist()
rospy.loginfo('Start Control Robot Draw a Circle')
while not rospy.is_shutdown():
twist.linear.x = 0.2
twist.angular.z = 0.4
cmd_pub.publish(twist)
rate.sleep()
if __name__ == '__main__':
try: cmd_vel_pub()
except rospy.ROSInternalException: pass
总结步骤:
1、初始化一个节点
2、创建发布器
3、设置一个发布频率
4、创建消息类型
5、发布消息(可循环发布,也可指定发布次数)
1、为消息赋值
2、发布消息
6、主函数调用
可以在我们的仿真器中运行一下看看
查看我们的pc中master节点是机器人还是我们pc自己,如果是机器人,就改成我们自己为master
在.bashrc 中修改
输入指令
roslaunch robot_simulation simulation_one_robot.launch 启动仿真器
编译工作空间,然后再新开窗口,启动我们编写的节点
rosrun yjc_application_test draw_circle.py
小车开始画圆了
查看一下速度发布器的信息
仿真器作为订阅者,画圆的程序作为发布者
然后在真的机器人上试试
先启动机器人底盘节点
pc端配置分布式通讯,把master节点设置回机器人ip
然后启动程序,机器人开始画圆~
以上。
更多推荐
已为社区贡献1条内容
所有评论(0)