ros2 中python 的多种调试方式
这里介绍了三种调试方法
第一种 使用pudb调试,需要先安装pudb.无需vscode,vim完全胜任.
第二种 使用vscode调试 ,需要安装debugpy .需要vscode进行远程调试 ,远程主机安装vscode环境麻烦.
第三种 使用run-main调试,需要安装run-main,由于他是单独调试某个py文件,缺点是无法使用ros launch启动,也就是launch里的有些参数无法传递 run-main中,ros调试中可以放弃了.
此文件名为teststartup.sh
#!/bin/sh
echo "Debug ROS2"cd /opt/local/ros2
source venv/bin/activate #激活虚拟环境,可以使用poetry
source install/setup.bash #激活本地的ros
export ROS_LOG_DIR=/opt/local/log
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/local/ros2/install/xxxx/lib #添加了执行环境
# 须知:调试前必须以debug模式生成项目,才可以进入调试,如: python3 -m colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug --symlink-install
#---------------------------------------------########-----------------------------------------
# 方法1(需要安装pudb) PUDB_TTY=/dev/pts/4 ros2 launch moni_xxx moni_xxx.launch.py # 使用pudb调试: import pudb;pu.db,我们调试的时候可以再开一个ssh 并使用tty命令查看终端号,那么前面写的就是 PUDB_TTY=/dev/pts/终端号
# 比如终端号为4那么在这个四号终端里我们输入 sleep infinity 可让终端进入可触发调试状态,然后运行上面的调试命令进行调试
#---------------------------------------------########-----------------------------------------
# 方法2 DEBUG=1 ros2 launch moni_xxx moni_xxx.launch.py #使用vscode 的 attach 方式调试,利用debugpy。
#这里我们在main函数下方放置了一个函数setDebug,并且在py文件中某个node的__init__函数内添加 setDebug(self)以便调试,命令行输入 ./teststartup.sh 1 启动debug调试,teststartup.sh是本调试文件的名称。
#def setDebug(SELF=None) :
# # 检查命令行参数中是否有 --debug
# # 检查环境变量 DEBUG=1
# # 运行 DEBUG=1 ros2 launch moni_xxx moni_xxx.launch.py 可进入调试模式
# SELF.debug_mode = os.environ.get('DEBUG', '0') == '1'# if SELF.debug_mode:
# import debugpy
# debugpy.listen(('localhost',5678))
# debugpy.wait_for_client()
# else:
# SELF.get_logger().info('调试模式未启用')
#然后在vscode当中启动调试launch.json 其代码如下
#{
# "version": "0.2.0",
# "configurations": [
# {
# "name": "Python 调试程序attach",
# "type": "debugpy",
# "request": "attach",
# "connect": {
# "host": "127.0.0.1",
# "port": 5678
# }
# },
# ]
#}
DEBUG=$1 ros2 launch moni_xxx moni_xxx.launch.py # 命令行输入 ./teststartup.sh 1 启动debug调试
# 当需要调试cam node的时候 使用命令./teststartup.sh 2, 因为在camnode里 setDebug函数内 SELF.debug_mode = os.environ.get('DEBUG', '0') == '2'
#---------------------------------------------########-----------------------------------------
# 方法3 使用run-main(需要安装run-main)调试(已放弃,作为参考表留)PUDB_TTY=/dev/pts/3 run-main /opt/local/ros2/src/moni_xxx/moni_xxx/xxx_node.py # run-main 直接运行的方法调试,缺点在于ros2 launch 传递的参数无法使用,比较麻烦,不赞成使用需要再主函数下方植入以下方法才能启动
#def _main(args=None):
# #调试用需要安装run-main
# main()