纠结的velocity log那些事(出现Permission denied)

在从JBoss迁移到Jetty容器时遇到Velocity日志配置导致的应用异常问题。问题出现在未正确配置日志输出路径,导致Linux环境下权限不足。通过调整日志配置或自定义LogChute解决。

背景  

  最近开始使用jetty做为我们的应用web容器,在迁移过程中发现一个比较隐晦的问题,原本在jboss容器跑的好好的应用,换到jetty容器上,直接不可用。出现一些莫名奇妙的错误。

 

现象

说明:我们应用中有代码使用了velocity处理一些业务,比如模板输出,自定义渲染引擎等。

 

使用例子:

RuntimeInstance  ri    = new RuntimeInstance();

.....
ri.parse(new StringReader(script), name); //进行渲染脚本处理

 

换成jetty后,会莫名的出现一个异常信息,截取了一个异常描述:

caused by: java.lang.RuntimeException: Error configuring Log4JLogChute : 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.velocity.util.ExceptionUtils.createWithCause(ExceptionUtils.java:67)
    at org.apache.velocity.util.ExceptionUtils.createRuntimeException(ExceptionUtils.java:45)
    at org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:133)
    at org.apache.velocity.runtime.log.Log4JLogChute.init(Log4JLogChute.java:85)
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157)
    ... 33 more
Caused by: java.io.FileNotFoundException: velocity.log (Permission denied)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.(FileOutputStream.java:177)
    at java.io.FileOutputStream.(FileOutputStream.java:102)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
    at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:194)
    at org.apache.log4j.FileAppender.(FileAppender.java:109)
    at org.apache.log4j.RollingFileAppender.(RollingFileAppender.java:72)
    at org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:118)
    ... 35 more

 

换回jboss容器后,一切正常,没有出现任何异常。

 

分析

   查找问题最好的利器就是debug,我也不例外。开启remote debug,一步步跟踪代码,发现最后的问题出在RuntimeInstance.init()调用initializeLog()方法上,说白了就是velocity日志处理上。

 

展开分析之前,先大致了解下velocity的日志处理。

 

velocity的3个关于日志记录的参数:

  • runtime.log.logsystem       (对应的logsystem实例)
  • runtime.log.logsystem.class (对应的logsystem实现类)
  • runtime.log  (日志文件名称)

备注: logsystem是velocity 1.5版本以前早期的log一套实现接口,现在1.5以后建议都使用logchute,而且早的logsystem一套也不建议被使用,@deprecated Use LogChute instead!

 

类图:


Log :  对LogChute的一个delegate,提供一些遍历的方法,比如info(),warn()不同级别的日志记录方法。

LogChute:  velocity中定义的日志处理接口,目前支持各种类型的Log三方包,同时支持System.out,NullLog等特殊类型。

LogMananger : velocity管理Log对象的入口,里面有个方法updateLog(Log log, RuntimeServices rsvc),就是本次出问题的点。

 

针对每种LogChute实现,都有自己一些特殊的配置项, (大家都知道velocity配置项可以是通过velocity.properties进行配置)

 

比如log4j的配置项,代码:Log4JLogChute

  • runtime.log.logsystem.log4j.logger (对应于log4j.xml配置中的Logger name,如果没有就使用class获取Logger,同时获取runtime.log属性作为日志输出的文件)
  • runtime.log.logsystem.log4j.logger.level (转化log4j的level到velocity log中,可覆盖Logger)

 

再来理一下,velocity整个初始化日志过程:

  1. new RuntimeInstance(),属性Log log = new Log(), 默认创建一个HoldingLogChute()做为LogChute,(该LogChute临时记录日志到内存对象上)
  2. RuntimeInstance.init() 进行velocity系统初始化
  3. 顺序调用initializeProperties(), 读取velocity.properties默认配置,合并自定义的properties。
  4. 顺序调用initializeLog() ,调用LogManager.updateLog(),进行Log初始化
  5. LogManager.createLogChute()会首先读取runtime.log.logsystem配置,看看是否有存在自定义的LogChute实例对象,如果有则直接使用,并返回
  6. 在没有对应的LogChute实例对象配置,继续读取runtime.log.logsystem.class,看看似乎否有logsystem的配置,就是前面类图中的一对LogChute,LogSystem的实现类。
    runtime.log.logsystem.class = org.apache.velocity.runtime.log.AvalonLogChute,org.apache.velocity.runtime.log.Log4JLogChute,org.apache.velocity.runtime.log.CommonsLogLogChute,org.apache.velocity.runtime.log.ServletLogChute,org.apache.velocity.runtime.log.JdkLogChute
     按照顺序,逐一加载LogChute实现类,如果class装载成功,则进行初始化,并返回
  7. LogManager,针对createLogChute,将系统初始时HoldingLogChute记录的内容,输出到新的LogChute上,最后完成了log的初始化

 

了解了velocity的整套log机制后,再来看该问题: 

  • 使用时没有设置velocity log的任何参数,因为系统中存在Log4j的包,所以会使用Log4jChute做为Log记录的对象返回。
  • 在初始化Log4jChute时,没有设置logger.name,初始化Logger时,会使用默认的velocity.log做为文件输出路径
  • File file = new File("velocity.log"),大家知道这样的文件创建,是基于当前jvm的current work,也就是user.dir属性。(可以通过jinfo $pid | grep user.dir进行查看)

ok,现在的问题已经很明了,异常中提示velocity.log无权限,只需要check一下当前jvm进程的user.dir属性。

最后检查结果:

  • jboss作为web容器时,user.dir=/home/ljh/web-deploy/bin  (当前的启动脚本所在目录)
  • jetty作为web容器时,user.dir = /usr/local/program/jetty-7.2.0 (所指定的jetty.home变量路径)

刚好我用的是linux系统,软件安装路径的权限都是root用户,运行web应用的都是普通用户,所以也让我撞上了这个问题。

 

 

说明:jboss和jetty我都是通过调用自带的run.sh和jetty.sh进行启动,存在这样的差异也是让我很无语的,几点建议。

  • 大家尽量在写代码时做到容器无关性
  • 尽量避免使用相对目录

解决

深入了解了velocity log机制后,解决方案就有很多种了

 

方案一:暴力型,啥都不输出

RuntimeInstance       ri            = new RuntimeInstance();
.......
if (!ri.isInitialized()) {
            // 设置空的log,避免使用velocity默认的veloicyt.log
           ri.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, new NullLogChute());
           ri.init();
 }

 
说明:针对应用中的渲染引擎,可以直接使用NullLogChute(),不做任何的日志输出。

 

方案二:统一型,融合到现有的log框架

RuntimeInstance       ri            = new RuntimeInstance();
......
if (!ri.isInitialized()) {
	    .......
            // 自定义LogChute,代理到应用的Log对象上,统一使用Log4j.xml进行管理
            ri.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, new LogChute() {
            public void init(RuntimeServices runtimeServices) {
            }

            public void log(int level, String message) {
                log(level, message, null);
            }

            public void log(int level, String message, Throwable t) {
                switch (level) {
                    case TRACE_ID:
                        getLogger().trace(message, t);
                        break;

                    case DEBUG_ID:
                        getLogger().debug(message, t);
                        break;

                    case INFO_ID:
                        getLogger().info(message, t);
                        break;

                    case WARN_ID:
                        getLogger().warn(message, t);
                        break;

                    case ERROR_ID:
                        getLogger().error(message, t);
                        break;

                    default:
                }
            }

            public boolean isLevelEnabled(int level) {
                switch (level) {
                    case TRACE_ID:
                        return getLogger().isTraceEnabled();

                    case DEBUG_ID:
                        return getLogger().isDebugEnabled();

                    case INFO_ID:
                        return getLogger().isInfoEnabled();

                    case WARN_ID:
                        return getLogger().isWarnEnabled();

                    case ERROR_ID:
                        return getLogger().isErrorEnabled();

                    default:
                        return false;
                }
            }
        });

        ri.init();
 }

 

说明:使用内部匿名类,将LogChute代理到当前class类的getLogger对象上,这样实现和当前web容器的整合,可以统一使用log4j.xml进行管理,只需要设置好Velocity 包装class的logger即可。

 


 

现在还有比较流行Slf4jLog,同样可以写一个Slf4jLogChute。一个小建议:对WARN以下level不记录异常的详细stack详情 ── 避免Velocity在找不到资源时会打印异常,直接打印e.getMessage()

 

异常的stack打印还是比较消耗性能的,具体可以看下我同事的一篇分析文章,使用异常耗性能到底耗在哪一块http://www.blogjava.net/stone2083/archive/2010/07/09/325649.html

[INFO] [launch]: All log files can be found below /home/forlinx/.ros/log/2025-10-17-16-35-30-652442-FCU3501-219247 [INFO] [launch]: Default logging verbosity is set to INFO map_path <launch.substitutions.launch_configuration.LaunchConfiguration object at 0x7f9570b460> [INFO] [controller_server-1]: process started with pid [219255] [INFO] [smoother_server-2]: process started with pid [219257] [ERROR] [smoother_server-2]: process has died [pid 219257, exit code -6, cmd '/opt/ros/humble/lib/nav2_smoother/smoother_server --ros-args --log-level info --ros-args -r __node:=smoother_server --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static']. [INFO] [planner_server-3]: process started with pid [219259] [INFO] [behavior_server-4]: process started with pid [219261] [INFO] [bt_navigator-5]: process started with pid [219263] [ERROR] [bt_navigator-5]: process has died [pid 219263, exit code -6, cmd '/opt/ros/humble/lib/nav2_bt_navigator/bt_navigator --ros-args --log-level info --ros-args -r __node:=bt_navigator --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static']. [INFO] [waypoint_follower-6]: process started with pid [219265] [INFO] [velocity_smoother-7]: process started with pid [219267] [INFO] [lifecycle_manager-8]: process started with pid [219269] [INFO] [collision_monitor-9]: process started with pid [219271] [ERROR] [waypoint_follower-6]: process has died [pid 219265, exit code -6, cmd '/opt/ros/humble/lib/nav2_waypoint_follower/waypoint_follower --ros-args --log-level info --ros-args -r __node:=waypoint_follower --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static']. [smoother_server-2] [ERROR] [1760690131.044590579] [rcl]: Failed to parse global arguments [smoother_server-2] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [smoother_server-2] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [bt_navigator-5] [ERROR] [1760690131.049120961] [rcl]: Failed to parse global arguments [bt_navigator-5] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [bt_navigator-5] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [waypoint_follower-6] [ERROR] [1760690131.060939095] [rcl]: Failed to parse global arguments [waypoint_follower-6] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [waypoint_follower-6] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [ERROR] [controller_server-1]: process has died [pid 219255, exit code -6, cmd '/opt/ros/humble/lib/nav2_controller/controller_server --ros-args --log-level info --ros-args --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static -r cmd_vel:=cmd_vel_nav']. [controller_server-1] [ERROR] [1760690131.066215256] [rcl]: Failed to parse global arguments [controller_server-1] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [controller_server-1] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [ERROR] [velocity_smoother-7]: process has died [pid 219267, exit code -6, cmd '/opt/ros/humble/lib/nav2_velocity_smoother/velocity_smoother --ros-args --log-level info --ros-args -r __node:=velocity_smoother --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static -r cmd_vel:=cmd_vel_nav -r cmd_vel_smoothed:=cmd_vel']. [ERROR] [planner_server-3]: process has died [pid 219259, exit code -6, cmd '/opt/ros/humble/lib/nav2_planner/planner_server --ros-args --log-level info --ros-args -r __node:=planner_server --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static']. [ERROR] [behavior_server-4]: process has died [pid 219261, exit code -6, cmd '/opt/ros/humble/lib/nav2_behaviors/behavior_server --ros-args --log-level info --ros-args -r __node:=behavior_server --params-file /tmp/launch_params_avnqgp2v -r /tf:=tf -r /tf_static:=tf_static']. [velocity_smoother-7] [ERROR] [1760690131.077933642] [rcl]: Failed to parse global arguments [velocity_smoother-7] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [velocity_smoother-7] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [lifecycle_manager-8] [INFO] [1760690131.102962011] [lifecycle_manager_navigation]: Creating [planner_server-3] [ERROR] [1760690131.104290530] [rcl]: Failed to parse global arguments [planner_server-3] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [planner_server-3] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [behavior_server-4] [ERROR] [1760690131.104879687] [rcl]: Failed to parse global arguments [behavior_server-4] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [behavior_server-4] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /tmp/launch_params_avnqgp2v'. Error: Sequences cannot be key at line 120, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [lifecycle_manager-8] [INFO] [1760690131.108818287] [lifecycle_manager_navigation]: Creating and initializing lifecycle service clients [collision_monitor-9] [ERROR] [1760690131.119792060] [rcl]: Failed to parse global arguments [collision_monitor-9] terminate called after throwing an instance of 'rclcpp::exceptions::RCLInvalidROSArgsError' [collision_monitor-9] what(): failed to initialize rcl: Couldn't parse params file: '--params-file /userdata/lifan/stopplan/xqrobot/install/nav/share/nav/param/nav2_param.yaml'. Error: Sequences cannot be key at line 469, at ./src/parse.c:822, at ./src/rcl/arguments.c:406 [ERROR] [collision_monitor-9]: process has died [pid 219271, exit code -6, cmd '/opt/ros/humble/lib/nav2_collision_monitor/collision_monitor --ros-args -r __node:=collision_monitor --params-file /userdata/lifan/stopplan/xqrobot/install/nav/share/nav/param/nav2_param.yaml']. [lifecycle_manager-8] [INFO] [1760690133.111270391] [lifecycle_manager_navigation]: Waiting for service controller_server/get_state... [lifecycle_manager-8] [INFO] [1760690135.114140078] [lifecycle_manager_navigation]: Waiting for service controller_server/get_state... [lifecycle_manager-8] [INFO] [1760690137.114522106] [lifecycle_manager_navigation]: Waiting for service controller_server/get_state... [lifecycle_manager-8] [INFO] [1760690139.114785060] [lifecycle_manager_navigation]: Waiting for service controller_server/get_state...
最新发布
10-18
user@ubuntu:~$ roslaunch mavros px4.launch ... logging to /home/user/.ros/log/2fd11034-6bbc-11f0-b7a6-3d5c010d0769/roslaunch-ubuntu-57392.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://ubuntu:36439/ SUMMARY ======== CLEAR PARAMETERS * /mavros/ PARAMETERS * /mavros/camera/frame_id: base_link * /mavros/cmd/use_comp_id_system_control: False * /mavros/conn/heartbeat_rate: 1.0 * /mavros/conn/system_time_rate: 1.0 * /mavros/conn/timeout: 10.0 * /mavros/conn/timesync_rate: 10.0 * /mavros/distance_sensor/hrlv_ez4_pub/field_of_view: 0.0 * /mavros/distance_sensor/hrlv_ez4_pub/frame_id: hrlv_ez4_sonar * /mavros/distance_sensor/hrlv_ez4_pub/id: 0 * /mavros/distance_sensor/hrlv_ez4_pub/orientation: PITCH_270 * /mavros/distance_sensor/hrlv_ez4_pub/send_tf: True * /mavros/distance_sensor/hrlv_ez4_pub/sensor_position/x: 0.0 * /mavros/distance_sensor/hrlv_ez4_pub/sensor_position/y: 0.0 * /mavros/distance_sensor/hrlv_ez4_pub/sensor_position/z: -0.1 * /mavros/distance_sensor/laser_1_sub/id: 3 * /mavros/distance_sensor/laser_1_sub/orientation: PITCH_270 * /mavros/distance_sensor/laser_1_sub/subscriber: True * /mavros/distance_sensor/lidarlite_pub/field_of_view: 0.0 * /mavros/distance_sensor/lidarlite_pub/frame_id: lidarlite_laser * /mavros/distance_sensor/lidarlite_pub/id: 1 * /mavros/distance_sensor/lidarlite_pub/orientation: PITCH_270 * /mavros/distance_sensor/lidarlite_pub/send_tf: True * /mavros/distance_sensor/lidarlite_pub/sensor_position/x: 0.0 * /mavros/distance_sensor/lidarlite_pub/sensor_position/y: 0.0 * /mavros/distance_sensor/lidarlite_pub/sensor_position/z: -0.1 * /mavros/distance_sensor/sonar_1_sub/horizontal_fov_ratio: 1.0 * /mavros/distance_sensor/sonar_1_sub/id: 2 * /mavros/distance_sensor/sonar_1_sub/orientation: PITCH_270 * /mavros/distance_sensor/sonar_1_sub/subscriber: True * /mavros/distance_sensor/sonar_1_sub/vertical_fov_ratio: 1.0 * /mavros/fake_gps/eph: 2.0 * /mavros/fake_gps/epv: 2.0 * /mavros/fake_gps/fix_type: 3 * /mavros/fake_gps/geo_origin/alt: 408.0 * /mavros/fake_gps/geo_origin/lat: 47.3667 * /mavros/fake_gps/geo_origin/lon: 8.55 * /mavros/fake_gps/gps_rate: 5.0 * /mavros/fake_gps/mocap_transform: True * /mavros/fake_gps/satellites_visible: 5 * /mavros/fake_gps/tf/child_frame_id: fix * /mavros/fake_gps/tf/frame_id: map * /mavros/fake_gps/tf/listen: False * /mavros/fake_gps/tf/rate_limit: 10.0 * /mavros/fake_gps/tf/send: False * /mavros/fake_gps/use_mocap: True * /mavros/fake_gps/use_vision: False * /mavros/fcu_protocol: v2.0 * /mavros/fcu_url: /dev/ttyACM0:57600 * /mavros/gcs_url: * /mavros/global_position/child_frame_id: base_link * /mavros/global_position/frame_id: map * /mavros/global_position/gps_uere: 1.0 * /mavros/global_position/rot_covariance: 99999.0 * /mavros/global_position/tf/child_frame_id: base_link * /mavros/global_position/tf/frame_id: map * /mavros/global_position/tf/global_frame_id: earth * /mavros/global_position/tf/send: False * /mavros/global_position/use_relative_alt: True * /mavros/image/frame_id: px4flow * /mavros/imu/angular_velocity_stdev: 0.0003490659 // 0... * /mavros/imu/frame_id: base_link * /mavros/imu/linear_acceleration_stdev: 0.0003 * /mavros/imu/magnetic_stdev: 0.0 * /mavros/imu/orientation_stdev: 1.0 * /mavros/landing_target/camera/fov_x: 2.0071286398 * /mavros/landing_target/camera/fov_y: 2.0071286398 * /mavros/landing_target/image/height: 480 * /mavros/landing_target/image/width: 640 * /mavros/landing_target/land_target_type: VISION_FIDUCIAL * /mavros/landing_target/listen_lt: False * /mavros/landing_target/mav_frame: LOCAL_NED * /mavros/landing_target/target_size/x: 0.3 * /mavros/landing_target/target_size/y: 0.3 * /mavros/landing_target/tf/child_frame_id: camera_center * /mavros/landing_target/tf/frame_id: landing_target * /mavros/landing_target/tf/listen: False * /mavros/landing_target/tf/rate_limit: 10.0 * /mavros/landing_target/tf/send: True * /mavros/local_position/frame_id: map * /mavros/local_position/tf/child_frame_id: base_link * /mavros/local_position/tf/frame_id: map * /mavros/local_position/tf/send: False * /mavros/local_position/tf/send_fcu: False * /mavros/mission/pull_after_gcs: True * /mavros/mission/use_mission_item_int: True * /mavros/mocap/use_pose: True * /mavros/mocap/use_tf: False * /mavros/mount/debounce_s: 4.0 * /mavros/mount/err_threshold_deg: 10.0 * /mavros/mount/negate_measured_pitch: False * /mavros/mount/negate_measured_roll: False * /mavros/mount/negate_measured_yaw: False * /mavros/odometry/fcu/map_id_des: map * /mavros/odometry/fcu/odom_child_id_des: base_link * /mavros/odometry/fcu/odom_parent_id_des: odom * /mavros/plugin_blacklist: ['safety_area', '... * /mavros/plugin_whitelist: [] * /mavros/px4flow/frame_id: px4flow * /mavros/px4flow/ranger_fov: 0.118682 * /mavros/px4flow/ranger_max_range: 5.0 * /mavros/px4flow/ranger_min_range: 0.3 * /mavros/safety_area/p1/x: 1.0 * /mavros/safety_area/p1/y: 1.0 * /mavros/safety_area/p1/z: 1.0 * /mavros/safety_area/p2/x: -1.0 * /mavros/safety_area/p2/y: -1.0 * /mavros/safety_area/p2/z: -1.0 * /mavros/setpoint_accel/send_force: False * /mavros/setpoint_attitude/reverse_thrust: False * /mavros/setpoint_attitude/tf/child_frame_id: target_attitude * /mavros/setpoint_attitude/tf/frame_id: map * /mavros/setpoint_attitude/tf/listen: False * /mavros/setpoint_attitude/tf/rate_limit: 50.0 * /mavros/setpoint_attitude/use_quaternion: False * /mavros/setpoint_position/mav_frame: LOCAL_NED * /mavros/setpoint_position/tf/child_frame_id: target_position * /mavros/setpoint_position/tf/frame_id: map * /mavros/setpoint_position/tf/listen: False * /mavros/setpoint_position/tf/rate_limit: 50.0 * /mavros/setpoint_raw/thrust_scaling: 1.0 * /mavros/setpoint_velocity/mav_frame: LOCAL_NED * /mavros/startup_px4_usb_quirk: False * /mavros/sys/disable_diag: False * /mavros/sys/min_voltage: 10.0 * /mavros/target_component_id: 1 * /mavros/target_system_id: 1 * /mavros/tdr_radio/low_rssi: 40 * /mavros/time/time_ref_source: fcu * /mavros/time/timesync_avg_alpha: 0.6 * /mavros/time/timesync_mode: MAVLINK * /mavros/vibration/frame_id: base_link * /mavros/vision_pose/tf/child_frame_id: vision_estimate * /mavros/vision_pose/tf/frame_id: odom * /mavros/vision_pose/tf/listen: False * /mavros/vision_pose/tf/rate_limit: 10.0 * /mavros/vision_speed/listen_twist: True * /mavros/vision_speed/twist_cov: True * /mavros/wheel_odometry/child_frame_id: base_link * /mavros/wheel_odometry/count: 2 * /mavros/wheel_odometry/frame_id: odom * /mavros/wheel_odometry/send_raw: True * /mavros/wheel_odometry/send_twist: False * /mavros/wheel_odometry/tf/child_frame_id: base_link * /mavros/wheel_odometry/tf/frame_id: odom * /mavros/wheel_odometry/tf/send: False * /mavros/wheel_odometry/use_rpm: False * /mavros/wheel_odometry/vel_error: 0.1 * /mavros/wheel_odometry/wheel0/radius: 0.05 * /mavros/wheel_odometry/wheel0/x: 0.0 * /mavros/wheel_odometry/wheel0/y: -0.15 * /mavros/wheel_odometry/wheel1/radius: 0.05 * /mavros/wheel_odometry/wheel1/x: 0.0 * /mavros/wheel_odometry/wheel1/y: 0.15 * /rosdistro: noetic * /rosversion: 1.17.4 NODES / mavros (mavros/mavros_node) auto-starting new master process[master]: started with pid [57400] ROS_MASTER_URI=http://localhost:11311 setting /run_id to 2fd11034-6bbc-11f0-b7a6-3d5c010d0769 process[rosout-1]: started with pid [57410] started core service [/rosout] process[mavros-2]: started with pid [57418] [INFO] [1753711645.697546795]: FCU URL: /dev/ttyACM0:57600 [INFO] [1753711645.699861079]: serial0: device: /dev/ttyACM0 @ 57600 bps [FATAL] [1753711645.700168484]: FCU: DeviceError:serial:open: No such file or directory ================================================================================REQUIRED process [mavros-2] has died! process has finished cleanly log file: /home/user/.ros/log/2fd11034-6bbc-11f0-b7a6-3d5c010d0769/mavros-2*.log Initiating shutdown! ================================================================================ [mavros-2] killing on exit [rosout-1] killing on exit [master] killing on exit shutting down processing monitor... ... shutting down processing monitor complete done
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值