紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
FishBotV1.0雷达转接板驱动(嵌入式)方案讨论
-
雷达驱动板:主要用于驱动雷达,实现usb转接雷达和wifi转接雷达。
- USB有线转雷达。直接采用串口芯片实现,无需开发
- wifi无线转雷达,目前小鱼有两个方案,需要讨论确定的。
方案1:
通过ESPRTOS开发的,通过串口读数据进行wifi转发。
方案2:
通过ESP8266支持的AT固件,进入透传模式进行转发。
优缺点对比:
方案1自定义程度较高,可以加入配网(多播)功能、和服务器IP配置等。但稳定性存在疑虑。
方案2稳定性应该较好,但是灵活性上需要通过外部才能完成网络配置和服务器IP配置工作。
请各位小伙伴根据以往经验提提建议,选择哪个方案更好些?
另外关于上位机(电脑端)的驱动,初步打算是做一个Socket2VUart(网络转虚拟串口)的程序,这样可以无缝兼容官方驱动。
-
AT固件版初步测试结果基本达到每秒5帧数据,偶尔四桢,具体测试需要上位机驱动编写完成后尝试
-
写了个socket2serial的程序,在ros2上已经跑起来了,帧率可以保持在7Hz。采用的方式是AT方法,经调研后发现AT也是开放源码的,所以可以直接在AT源码上进行修改来弥补其灵活性的缺失。
关于这个问题,个人觉得以当前人力,最小开发为原则,所以选择成熟稳定的AT版本最佳。
另外关于通过网络数据的延时需要进一步测量,准备最近搭建一个测试环境进行测试,给出相关报告。
-
@小鱼 uart2serial程序分享,利用linux的poll机制实现。
#!/usr/bin/env python3 import os import pty import socket import select import argparse parser = argparse.ArgumentParser(description='Creates a virtual pty for a remote tcp/udp socket') parser.add_argument('host', type=str) parser.add_argument('port', type=int) parser.add_argument('-u', '--udp', action='store_true') args = parser.parse_args() lhost = args.host lport = args.port def main(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM if args.udp else socket.SOCK_STREAM) s.bind((lhost, lport)) s.listen(5) client,client_address = s.accept() master, slave = pty.openpty() print(s.fileno(),client,master) # tty.setraw(master, termios.TCSANOW) print('PTY: Opened {} for {}:{}'.format(os.ttyname(slave), lhost, lport)) mypoll = select.poll() mypoll.register(client.fileno(), select.POLLIN) mypoll.register(master, select.POLLIN) try: while True: fdlist = mypoll.poll(256) for fd,event in fdlist: data = os.read(fd, 256) write_fd = client.fileno() if fd == master else master os.write(write_fd, data) finally: s.close() os.close(master) os.close(slave) if __name__ == "__main__": main()
-
@小鱼 相关资料收集
- https://github.com/espressif/esp-at/tree/release/v2.2.0.0_esp8266
- https://docs.espressif.com/projects/esp-at/zh_CN/release-v2.2.0.0_esp8266/
- https://docs.espressif.com/projects/esp8266-rtos-sdk/en/v3.4/get-started/index.html
- https://pypi.org/project/esptool
环境搭建
docker run -it -v d:/esp-at:/project -w /project xingrz/esp8266-rtos-builder:3.4 /bin/bash
-
@小鱼 走USB串口速率
average rate: 7.410 min: 0.134s max: 0.138s std dev: 0.00108s window: 9 average rate: 7.419 min: 0.134s max: 0.138s std dev: 0.00084s window: 17 average rate: 7.420 min: 0.134s max: 0.138s std dev: 0.00076s window: 25 average rate: 7.420 min: 0.134s max: 0.138s std dev: 0.00068s window: 33 average rate: 7.421 min: 0.134s max: 0.138s std dev: 0.00062s window: 41 average rate: 7.421 min: 0.134s max: 0.138s std dev: 0.00061s window: 49 average rate: 7.422 min: 0.134s max: 0.138s std dev: 0.00059s window: 57 average rate: 7.422 min: 0.134s max: 0.138s std dev: 0.00060s window: 65 average rate: 7.423 min: 0.134s max: 0.138s std dev: 0.00060s window: 73 average rate: 7.423 min: 0.134s max: 0.138s std dev: 0.00058s window: 81 average rate: 7.423 min: 0.134s max: 0.138s std dev: 0.00058s window: 89 average rate: 7.424 min: 0.134s max: 0.138s std dev: 0.00056s window: 97 average rate: 7.424 min: 0.134s max: 0.138s std dev: 0.00056s window: 105 average rate: 7.424 min: 0.134s max: 0.138s std dev: 0.00055s window: 113
socket
average rate: 6.297 min: 0.000s max: 0.437s std dev: 0.17967s window: 72 average rate: 6.294 min: 0.000s max: 0.437s std dev: 0.17973s window: 80 average rate: 6.295 min: 0.000s max: 0.437s std dev: 0.17976s window: 88 average rate: 6.359 min: 0.000s max: 0.437s std dev: 0.17850s window: 97 average rate: 6.415 min: 0.000s max: 0.437s std dev: 0.17745s window: 106 average rate: 6.401 min: 0.000s max: 0.439s std dev: 0.17790s window: 114 average rate: 6.451 min: 0.000s max: 0.439s std dev: 0.17686s window: 123 average rate: 6.492 min: 0.000s max: 0.439s std dev: 0.17608s window: 132 average rate: 6.478 min: 0.000s max: 0.439s std dev: 0.17641s window: 140 average rate: 6.468 min: 0.000s max: 0.439s std dev: 0.17663s window: 148 average rate: 6.458 min: 0.000s max: 0.439s std dev: 0.17684s window: 156
增大电机转速
average rate: 6.996 min: 0.001s max: 0.385s std dev: 0.16775s window: 9 average rate: 7.120 min: 0.001s max: 0.385s std dev: 0.16423s window: 18 average rate: 7.138 min: 0.001s max: 0.385s std dev: 0.16374s window: 27 average rate: 7.126 min: 0.001s max: 0.385s std dev: 0.16405s window: 36 average rate: 7.135 min: 0.001s max: 0.385s std dev: 0.16378s window: 45 average rate: 7.141 min: 0.001s max: 0.385s std dev: 0.16361s window: 54 average rate: 7.135 min: 0.001s max: 0.389s std dev: 0.16382s window: 63 average rate: 7.140 min: 0.001s max: 0.389s std dev: 0.16367s window: 72 average rate: 7.143 min: 0.000s max: 0.389s std dev: 0.16359s window: 81
-
@小鱼 uart2serial程序分享,利用linux的poll机制实现。
#!/usr/bin/env python3 import os import pty import socket import select import argparse parser = argparse.ArgumentParser(description='Creates a virtual pty for a remote tcp/udp socket') parser.add_argument('port', type=int) parser.add_argument('uart_name', type=str) args = parser.parse_args() lport = args.port luser_name = args.uart_name def restart_laser_driver_ros2(): """ Restart YdLaser Driver With Ros2! 1.LifeCycle 2.Restart Laser SubProcess """ pass def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('0.0.0.0', lport)) s.listen(5) master, slave = pty.openpty() if os.path.exists(luser_name): os.remove(luser_name) os.symlink(os.ttyname(slave),luser_name) print(f"UART2SOCKET:{lport}->{luser_name}") mypoll = select.poll() mypoll.register(master, select.POLLIN) try: while True: client,client_address = s.accept() mypoll.register(client.fileno(), select.POLLIN) print(s.fileno(),client,master) print('PTY: Opened {} for {}:{}'.format(os.ttyname(slave), '0.0.0.0', lport)) is_connect = True while is_connect: fdlist = mypoll.poll(256) for fd,event in fdlist: data = os.read(fd, 256) write_fd = client.fileno() if fd == master else master if len(data)==0: is_connect = False break os.write(write_fd, data) print(fd, event,data) mypoll.unregister(client.fileno()) finally: s.close() os.close(master) os.close(slave) os.remove(luser_name) if __name__ == "__main__": main()