本人菜鸟老男人,以前做过一些PLC的项目,也做过一些单片机的简单项目,经验和资质少的可怜,今年7月份,接触到了ROS操作系统,很受鼓舞,想来自己也已经到了不让霍霍的年龄了,于是决定用未来的课余时间学习一下该系统,希望能看到我这些文章的朋友多扔板砖。
废话说太多,但是还要罗嗦几句,这些东西都是自己的一些调试随笔,可能也不会去鼓捣设计版式什么的,也就是调试到哪里,写到哪里,主要还是给自己这个老家伙留一点记录,等到那天痴呆了,可以翻过来看看曾经走过的一些零碎,所以还是上面那段话的最后一句,欢迎大家的板砖。
说了不说废话了,还是要说一些废话,本人工科出身,没有任何机器人的经验,yabhoom的小周老师声音很好听。。。不是,是yabhoom的很多资料都是python语言做的源代码,无奈我曾经所有的项目都是c代码和类C的代码,所以咬了咬牙,决定自己重新安装了树梅派的系统,自己从底层开始,边学边记录,看自己学不动的时候能积累多少东西吧。
废话真是越说越多了。。。看来真的是老了。。。
树梅派不知道啥版本的,以后的项目肯定是用工控机,所以也不纠结他了,外观上来看4个usb正好,一个游戏手柄,一个深度相机,一个激光雷达,一个对底层驱动板子的接口,当然,他们的USB扩展板上还有一些,但是我还是尽量的把设备直接插在了树梅派上,全无道理,纯粹是老了,怕他们分开了寂寞。
今天分享的内容非常简单,就是树梅派上如何固定USB当做一个串口,给别的设备发消息,这显然很重要,毕竟后面不论轮子的驱动方式是个板子还是PLC总得对外有个接口,以太网啥的固然好,但是我老了。。。想弄的简单点。
我参考的视频是这个
大神讲的非常非常的好,要不我就不说了。。。算了还是说两句吧,如果侵权了,请大神不要告我。。。
首先先安装一下ROS的依赖包,至于啥是依赖包我也不知道,我总是感觉是一些底层的驱动,和一些中间层的东西,然后以最灵活的方式呈现给应用层中所需要的一些东西吧,先这么理解吧,反正就算错了,我也不管。。。
sudo apt-get install ros-noetic-serial
安装完成后,可以像视频程序里面说的用roscd命令检查一下,就下面这个
roscd serial
安装好了,就开始操作,调试串口最基本的就是接一个USB转232的线弄到别的电脑上,树梅派发,电脑收。我用的是深圳宇泰科技的UT-890好像插上,自己就识别了。但是我自己电脑上的ubuntu就识别不了,还是问官方要了一个包,这个包拷贝进去就能用了,大家想要的可以私信我。
然后就是开始绑定USB口。按视频流程来:
cd /etc/udev/rules.d
sudo touch usb.rules
sudo nano usb.rules
然后就可以进入一个嘿嘿界面,当然这个嘿嘿的界面不能用vim的一些指令。不管三七二十八,复制下面这个进去:
KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a86",ATTRS{idProduct}=="7523",MODE:="0777",SYMLINK+="PISerial"
对了,这里有个问题,就是必须要有一个设备带CH340芯片,并且可以发送数据(我就是用驱动板连接到我们树梅派上的,因为它会返回当前板子上的一些数据)。idVendor 和 idProduct 都是lsusb这个指令查询出来的。
绑定好了可以用这个指令看一眼
ls -l /dev |grep ttyUSB
然后两个USB转232线,中间一个DB9交叉线,就可以发送数据了。
测试程序下面这一堆:
#include <ros/ros.h>
#include <serial/serial.h>
using namespace std;
string port = "/dev/PIserial";
//string port = "/dev/ttyUSB1";
unsigned int baudrate = 115200;
serial::Serial ser;
unsigned char send_lamp_data[9] = {0xff,0xfc,0x07,0x05,0xff,0,0x00,0,0xff};
unsigned char recv_data[100];
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"usbserial_node");
ros::NodeHandle nh("~");
try
{
ser.setPort(port);
ser.setBaudrate(baudrate);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
ser.open();
}
catch(const std::exception& e)
{
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
if(ser.isOpen()){
ROS_INFO("usb serial port initialized");
}
else{
return -1;
}
ros::Rate loop_rate(10);
while(ros::ok())
{
if(ser.available()){
#if 0
ROS_INFO("reading from serial port");
ser.read(recv_data,ser.available());
for(int i=0;i<sizeof(recv_data);i++)
cout<<std::hex <<(recv_data[i] & 0xff)<<" ";
cout<<endl;
cout<<endl;
#endif
}
#if 1
ROS_INFO("发送%ld个字节.",sizeof(send_lamp_data));
unsigned int temp = 0;
for(int i= 2;i<sizeof(send_lamp_data)-1;i++)
{
temp += send_lamp_data[i];
}
ROS_INFO("Send data sum = %x.",temp);
send_lamp_data[sizeof(send_lamp_data)-1]=temp;
ser.write(send_lamp_data, sizeof(send_lamp_data));
#endif
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
是的,使用了rosrun后,他能用了。。。。
哦对了,建功能包的依赖项是这些:
roscpp
rospy
serial
std_msgs
明天再记录无线游戏手柄的吧。。。