目录
- 串口通信 ros-serial 包的使用
- ROS分布式多机通信 ssh的使用
-
串口通信 ros-serial 包的使用
sudo apt-get install ros-melodic-serial
下载完查看以下 重启终端,输入以下命令可以检测到serial包的路径说明已经安装好:(路径为 opt/ros/indigo/share/serial)
roscd serial
#include "ros/ros.h"
#include <serial/serial.h>
#include <std_msgs/String.h>
#include "ros2stm32/data.h"
#include <sstream>
unsigned char speed_data[22]={0};
serial::Serial ros_ser;
void chatterCallback(const ros2stm32::data::ConstPtr& msg)
{
speed_data[0] = 0x55;
……
speed_data[21]=0x55;
ros_ser.flush ();
ros_ser.write(speed_data,22);
ROS_INFO_STREAM("\nSend date finished!\n");
if(ros_ser.available()){
ROS_INFO_STREAM("Reading from serial port: ");
std_msgs::String result;
result.data = ros_ser.read(ros_ser.available());
ROS_INFO_STREAM("Read: " << result.data);
}
}
int main (int argc, char** argv){
ros::init(argc, argv, "data_listener");
ros::NodeHandle n;
try
{
ros_ser.setPort("/dev/ttyUSB0");
ros_ser.setBaudrate(9600);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ros_ser.setTimeout(to);
ros_ser.open();
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
if(ros_ser.isOpen()){
ROS_INFO_STREAM("Serial Port opened");
}else{
return -1;
}
ROS_INFO_STREAM("Init Finished!");
ros::Subscriber sub = n.subscribe("data_chatter", 1000, chatterCallback);
ros::spin();
}
- 权限
如果提示Unable to open port,是由于权限不够引起的,进行如下操作
sudo chmod 666 /dev/ttyUSB0
ROS分布式多机通信 ssh的使用
1、目的
实现一个:笔记本发送topic,树莓派(树莓派3B+)订阅topic,接收数据,控制机械臂,达成笔记本远程控制机械臂运动的效果。
2、关于SSR
SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。
SSH是目前可靠的,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。利用SSH协议可以有效防止远程管理过程中的信息泄露问题
使用SSH服务,则两个机器都需要安装SSR
3、实现
- 前提
二者处于同一个局域网 - 安装
两台机子都需要安装openssh,直接
sudo apt-get install openssh
- 设置 ip 和 ~/.bashrc 文件
1、先找两台机子的IP地址:
zyf@zyf-TM1707:~/chuankou$ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 7252 bytes 789872 (789.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7252 bytes 789872 (789.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.104 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::def0:b93b:962f:9b9c prefixlen 64 scopeid 0x20<link>
ether c0:b6:f9:8a:64:d9 txqueuelen 1000 (以太网)
RX packets 32666 bytes 29085588 (29.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23644 bytes 4418820 (4.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
无线网下的ip就是在wlp3s0下的inet
2、分别了解了之后,需要在两台机子上的/etc/hosts文件加入对方的IP地址和对应的计算机名字
举例如下:
zyf@zyf-TM1707:~$ sudo gedit /etc/hosts
格式: 工控机的局域网地址 工控机的用户名
笔记本这里放工控机的地址和用户名192.168.1.105 ahong-desktop
工控机那边放笔记本的地址和用户名192.168.1.104 zyf.TM1707
示例如下:(笔记本里)
127.0.0.1 localhost
127.0.1.1 zyf-TM1707
192.168.1.105 ahong-desktop
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
这时候可以 ping 一下看通信是否正常
zyf@zyf-TM1707:~$ ping 192.168.1.105
PING 192.168.1.105 (192.168.1.105) 56(84) bytes of data.
64 bytes from 192.168.1.105: icmp_seq=1 ttl=64 time=19.1 ms
64 bytes from 192.168.1.105: icmp_seq=2 ttl=64 time=7.32 ms
64 bytes from 192.168.1.105: icmp_seq=3 ttl=64 time=4.81 ms
64 bytes from 192.168.1.105: icmp_seq=4 ttl=64 time=4.28 ms
64 bytes from 192.168.1.105: icmp_seq=5 ttl=64 time=4.38 ms
64 bytes from 192.168.1.105: icmp_seq=6 ttl=64 time=4.23 ms
^C
--- 192.168.1.105 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5009ms
rtt min/avg/max/mdev = 4.237/7.357/19.103/5.362 ms
3、设置~/.bashrc 文件
从 机——笔记本
export ROS_HOSTNAME=zyf-TM1707
export ROS_MASTER_URI=http://ahong-desktop:11311
工控机——树莓派
export ROS_HOSTNAME=ahong-desktop
export ROS_MASTER_URI=http://ahong-desktop:11311
这里就是把ROS_MASTER_URI设置为工控机那边,如果笔记本要使用roscore需要将那两句话注释掉,否则运行会出现以下问题:
NODES
WARNING: ROS_MASTER_URI [http://ahong-desktop:11311] host is not set to this machine
设置好IP后,最好 source ~/.bashrc 刷新一下,就可以通信了。
zyf@zyf-TM1707:~$ ssh ahong@192.168.1.105
The authenticity of host '192.168.1.105 (192.168.1.105)' cant be established.
ECDSA key fingerprint is SHA256:l5GPEMvAgqONnXRdXRk5fBCMefOlyc0+PQRANqkiGo0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.105' (ECDSA) to the list of known hosts.
ahong@192.168.1.105's password:
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.9.80-v7+ armv7l)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
583 packages can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
4、问题
(1)openssh没装好
zyf@zyf-TM1707:~$ ssh ahong@192.168.1.105
ssh: connect to host 192.168.1.105 port 22: Connection refused
- 安装ssh服务:sudo apt-get install openssh
- 启动ssh服务:service sshd start
- 重新运行:ssh 用户名@ip 即可
(2)启动失败
sudo service ssh start
报错
Failed to start ssh.service: Unit ssh.service not found.
解决
sudo systemctl enable ssh.service
sudo systemctl start ssh.service
sudo systemctl status ssh.service
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)