資源簡(jiǎn)介
程序版本Ubuntu16.04+kinetic
該package利用訂閱控制小海龜運(yùn)動(dòng)的cmd_vel話題,讀取鍵盤方向鍵。
然后通過(guò)串口發(fā)送控制指令到電機(jī)控制器,控制電機(jī)前進(jìn)后退轉(zhuǎn)向。
是學(xué)習(xí)ROS控制機(jī)器人運(yùn)動(dòng)的一個(gè)基礎(chǔ)例程。
使用前需安裝ros的serial工具包
sudo apt-get install ros-kinetic-serial
關(guān)于串口:
程序使用的是電腦主板自帶的9針232串口,可以根據(jù)自己具體串口調(diào)整程序
查看設(shè)備dmesg,如果使用USB轉(zhuǎn)串口一般設(shè)備號(hào)是ttyUSB0
我用的是Ubuntu16.04實(shí)際測(cè)試USB轉(zhuǎn)串口芯片ch340和PL2302都可以直接識(shí)別
可以先安裝cutecom進(jìn)行串口調(diào)試,看看是否可用,該工具是窗口界面,比較方便
安裝sudo apt-get install cutecom
安裝完成運(yùn)行要root權(quán)限才能讀取串口
sudo cutecom
程序使用的是serial_example_node1節(jié)點(diǎn),另外一個(gè)節(jié)點(diǎn)listen1沒有用到
將代碼解壓到自己的工作空間后編譯
然后啟動(dòng)serial_example_node1節(jié)點(diǎn)和turtle_teleop_key節(jié)點(diǎn)
rosrun serial_msgs serial_example_node1
rosrun turtlesim turtle_teleop_key
保證當(dāng)前窗口在key讀取命令窗口,按鍵盤方向鍵,串口節(jié)點(diǎn)會(huì)收到數(shù)據(jù),并串口發(fā)送數(shù)據(jù)。
如果串口啟動(dòng)提示失敗,提示Unable to open port,可能是權(quán)限問(wèn)題需運(yùn)行命令
sudo chmod 666 /dev/ttyS0
節(jié)點(diǎn)讀取串口做了5個(gè)字節(jié)的測(cè)試
發(fā)多個(gè)字節(jié)需自己修改讀取字節(jié)數(shù)
代碼片段和文件信息
#include?“ros/ros.h“
#include?“std_msgs/String.h“
#include?“serial_msgs/serial.h“
#include?
#include?
#define?sBUFFERSIZE?????25
unsigned?char?s_buffer[sBUFFERSIZE];
unsigned?char?r_buffer[5];
serial::Serial?ser;
void?chatterCallback(const?serial_msgs::serial::ConstPtr&?msg)
{
?????ROS_INFO_STREAM(“Writing?to?serial?port“);
????for(int?i=0;iserial.size();++i)
???????{
?????ROS_INFO(“Writing:?[0x%02x]“?msg->serial[i]);
?????s_buffer[i]=msg->serial[i];
???????}
?????ser.write(s_buffersBUFFERSIZE);
}
int?main(int?argc?char?**argv)
{
????ros::init(argc?argv?“l(fā)isten1“);
????ros::NodeHandle?n;
????//訂閱read主題(即接受串口數(shù)據(jù))
?????try
????{
????????ser.setPort(“/dev/ttyS0“);
????????ser.setBaudrate(9600);
????????serial::Timeout?to?=?serial::Timeout::simpleTimeout(1000);
????????ser.setTimeout(to);
????????ser.open();
????}
????catch?(serial::IOException&?e)
????{
????????ROS_ERROR_STREAM(“Unable?to?open?port?“);
????????return?-1;
????}
????if(ser.isOpen()){
????????ROS_INFO_STREAM(“Serial?Port?initialized“);
????}else{
????????return?-1;
????}
????ros::Subscriber?sub?=?n.subscribe(“read1“?1000?chatterCallback);
????ros::spin();
????return?0;
}
評(píng)論
共有 條評(píng)論