ros与arduino串口通信c++
- 写在最前
- 安装serial库
- 编写arduino串口通信程序
- 编写ros节点
- 端口号配置
- 配置CMakeLists.txt文件
- 编译整个ROS工程
- 运行节点
- 后记
写在最前
串口通信在嵌入式领域的重要性我也就不多说了, 这里的ros与arduino串口通信的方案, 同样适合于stm32, 51单片机等各种芯片. 这里与rosserial有区别, rosserial是基于某种类型的板子开发的.
安装serial库
首先当然是需要安装serial库啦, ros官方是提供了一个编译好的包给大家使用, 就不用大家去编译了. 直接输入下面的指令, 安装即可.
sudo apt-get install ros-kinetic-serial
编写arduino串口通信程序
arduino的串口通信程序很简单, 当arduino接受到数据之后, 原封不动的将数据进行返回, 也就不多解释了, 看注释就行:
#include <Arduino.h>
String readStr = "";
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available())
{
readStr = readStr + char(Serial.read());
delay(2);
}
if(readStr.length()>0)
{
Serial.print(readStr);
readStr = "";
}
delay(20);
}
博主这里使用的还是platformio, 使用arduino IDE也行.
编写ros节点
在ros_test文件夹下新建serial_test.cpp
文件. 说明一下: 如果你是第一次看我的博客, 可能不知道ros_test文件夹是什么, 这个是在ros工程下的自己创建的功能包, 具体请查看以往的文章.
#include <serial/serial.h>
#include <ros/ros.h>
#include <string>
int main(int argc, char **argv)
{
ros::init(argc, argv, "serial_test");
ros::NodeHandle nh;
serial::Serial ser;
setlocale(LC_ALL, "");
try
{
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(9600);
serial::Timeout tout = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(tout);
ser.open();
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("无法打开串口 ");
return -1;
}
if(ser.isOpen())
{
ROS_INFO_STREAM("串口初始化成功");
}
else
{
return -1;
}
while(ros::ok())
{
std::string result;
std::string msg = "hello";
ser.write(msg);
sleep(1);
while(ser.available()>0)
{
result = ser.read(ser.available());
std::cout<<result<<std::endl;
}
}
return 0;
}
端口号配置
注意, 这个ros程序中, 设置的端口号, 根据你的arduino所在的端口进行配置, 查看方法:
1, 插入arduino.
2, 打开platformio的主页, 方法在上一篇文章有说.
3, 点击devices, 即可查看arduino所在的端口.
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019092712594767.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01TTkgyMDEy,size_16,color_FFFFFF,t_70)
配置CMakeLists.txt文件
1, 修改find_package
, 新增serial包
find_package(catkin REQUIRED COMPONENTS
...
serial
)
2, 在文件的末尾, 加上:
add_executable(serial_test src/serial_test.cpp)
target_link_libraries(serial_test ${catkin_LIBRARIES})
add_dependencies(serial_test ${PROJECT_NAME}_generate_messages_cpp)
编译整个ROS工程
点击"终端"–>“新建终端”,在终端中输入"catkin_make".
运行节点
1, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入roscore
,启用整个ROS总节点。
2, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test serial_test
,启用serial_test节点。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190927130606650.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01TTkgyMDEy,size_16,color_FFFFFF,t_70)
可以看到ros与arduino通信成功. 如果提示"无法打开串口", 请确认串口权限已经配置好, 且没有被其他程序占用.
后记
更多机器人ROS相关,公-众-号搜索 ”机器人小站", 关注我们吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)