我这边需要使用ROS控制一个AGV上的升降平台,于是在花费了几天的时间作出了这个方法
电机:24V直流电机, 通电即转
驱动器:BTS7960大电流电机驱动器,H桥原理,下图这种
板子:Arduino UNO
在这里我使用的时Arduino端作为Subscriber,ubuntu端作为publisher
Arduino端代码:
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int8.h>
ros::NodeHandle nh;
int E1 = 5; //M1 正
int E2 = 6; //M1 反
std_msgs::String str_msg;
void stop_move(void)
{
analogWrite(E1,0);
analogWrite(E2,0);
}
void advance(void)
{
analogWrite (E1,255);
analogWrite (E2,0);
}
void back_off (void)
{
analogWrite (E1,0);
analogWrite (E2,255);
}
void ModelCb(const std_msgs::Int8& model){ //定义回调函数为ModelCb,订阅String消息里的model
if(model.data==-1){
back_off();
}
else if(model.data==1){
advance();
}
else if(model.data==0){
stop_move();
}
}
ros::Subscriber<std_msgs::Int8> sub("model", ModelCb );
void setup(void)
{
nh.initNode();
nh.subscribe(sub);
}
void loop(void)
{
nh.spinOnce();
delay(1);
}
这个代码中的引脚5接的是L_PWM,引脚6接的是R_PWM,L_EN跟R_EN我直接接的5V供电
ubuntu端python代码:
#!/usr/bin/env python
# coding=utf-8
import rospy
import geometry_msgs.msg
from std_msgs.msg import Int8
import sys, select, termios, tty
count =0
model=0
#键值对应移动方向
moveBindings = {
'w':(1),
's':(0),
'x':(-1),
}
#获取键值函数
def getKey():
tty.setraw(sys.stdin.fileno())
rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
if rlist:
key = sys.stdin.read(1)
else:
key = ''
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
return key
#主函数
if __name__=="__main__":
settings = termios.tcgetattr(sys.stdin) #获取键值初始化,读取终端相关属性
rospy.init_node('up_down_plat') #创建ROS节点,节点名称为“up_down_plat"
pub = rospy.Publisher('model',Int8,queue_size=5) #创建话题发布者,发布"model"为话题的消息
try:
while(1):
key = getKey() #获取键值
#判断键值是否在移动方向键值内
if key in moveBindings.keys():
model = moveBindings[key]
count = 0
if(model==1):
print("上升")
elif(model==0):
print("停止")
elif(model==-1):
print("下降")
#空键值/'k',相关变量置0
elif key == ' ' or key == 'k' :
model=0
#长期识别到不明键值,相关变量置0
else:
count = count + 1
if count > 4:
model= 0
if (key == '\x03'):
break
pub.publish(model)
#运行出现问题则程序终止并打印相关错误信息
except Exception as e:
print(e)
#程序结束前发布速度为0的速度话题
finally:
model =0
pub.publish(model)
#程序结束前设置终端相关属性
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
可以实现按w上升,s下降,松开即停