小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
请问ros2 run和ros2 launch启动同一个节点的启动效果不同是什么原因呢?
-
我参考网上代码写了一个JY_95T imu的获取程序,这款imu需要在接收数据前发送一串字符串命令,但是我发现我用ros2 run imu_get_cpp publisher_imu_node 启动能正确发送这段代码,用 ros2 launch imu_get_cpp imu_cpp.launch.py 启动这个imu节点这段命令不能正常发出,而是在按ctrl+c退出程序的时候才发出这段命令,按理说这两种启动节点的方法应该是一样的。有人知道什么原因吗?下面是2种启动方法的日志文件
m@ubun:~/ros2_ws$ ros2 run imu_get_cpp publisher_imu_node
[INFO] [1693883056.342819936] [publisher_imu_node]: imu串口初始化完成!
imu发出命令: a4 3 8 23 d2
imu发布线程工作中
^C[INFO] [1693883060.571197391] [rclcpp]: signal_handler(signal_value=2)
imu线程退出m@ubun:~/ros2_ws$ ros2 launch imu_get_cpp imu_cpp.launch.py
[INFO] [launch]: All log files can be found below /home/m/.ros/log/2023-09-05-11-05-57-304442-ubun-16558
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [publisher_imu_node-1]: process started with pid [16563]
[publisher_imu_node-1] [INFO] [1693883157.461656186] [publisher_imu_node]: imu串口初始化完成!
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[publisher_imu_node-1] [INFO] [1693883161.738837124] [rclcpp]: signal_handler(signal_value=2)
[publisher_imu_node-1] imu发出命令: a4 3 8 23 d2
[publisher_imu_node-1] imu发布线程工作中
[publisher_imu_node-1] imu线程退出
[INFO] [publisher_imu_node-1]: process has finished cleanly [pid 16563]imu_cpp.launch.py
#!/usr/bin/python3 from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): imu_node = Node(package='imu_get_cpp', executable='publisher_imu_node', name='publisher_imu_node', output='screen', ) return LaunchDescription([ imu_node, ])
-
@毛哥成山轮胎机油保养 imu程序详细代码在
链接文本 -
@毛哥成山轮胎机油保养 用launch相当于用子进程启动程序,还是有点区别的,对于多线程的程序,会出现一些异常
除此之外,考虑程序是否有阻塞问题 -
@小鱼 c++还是有点驾驭不了,源码在这
链接文本
鱼总有时间帮我分析一下哪里有问题,现在这个程序用launch启动逻辑是不正常的,只能用ros2 run 启动,还有这个imu我用尽了各种办法都不能固定usb端口别名,只能是先插这个imu 它的端口号用ttyUSB0
usb.rulesKERNELS=="1-1.2:1.0", MODE:="0777", GROUP:="dialout",SYMLINK+="wheeltec_laser" KERNELS=="3-1:1.0", MODE:="0777", GROUP:="dialout", SYMLINK+="ttyTHS1" SUBSYSTEM=="usb", ATTR{idProduct}=="0403", ATTR{idVendor}=="2bc5", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="astra_pro" SUBSYSTEM=="usb", ATTR{idProduct}=="0501", ATTR{idVendor}=="2bc5", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="astrauvc" KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777",GROUP:="dialout", SYMLINK+="ttyimu"
其他像雷达 摄像头 底盘驱动端口都生效了,这个ttyimu就是死活不生效,现在只能用/dev/ttyUSB0
-
@毛哥成山轮胎机油保养
你试试把printf("imu发出命令: %x %x %x %x %x\n",cmd_buffer[0],cmd_buffer[1],cmd_buffer[2],cmd_buffer[3],cmd_buffer[4]);
换成RCLCPP_INFO输出,应该就没问题了
-
@Lorry 确实用RCLCPP_INFO把问题解决了,谢谢
-
@Lorry 我试遍了网上给usb端口改别名的方法,就是不生效,只能把imu第一个插上选/dev/ttyUSB0,你有经验吗?
-
@毛哥成山轮胎机油保养 改别名是可以的呀,我之前也改过imu的别名
-
@Lorry 可以了
KERNELS=="3-2.3:1.0", MODE:="0777", GROUP:="dialout", SYMLINK+="ttyimu",
以前弄了好多次,不行,刚刚重新试了一下,可以了。