parameter/argument-两大参数

参数

每个结点都有参数,且以字典的形式存储
使用参数而不是程序中的变量的好处是可以动态修改关键值,而不需要重新编译代码,特别适合调试

ros2 param
ros2 param list        列出当前运行结点的参数列表
ros2 param get <node> <param>获取某个结点的某个参数值
ros2 param set <node> <param>设置某个结点的某个参数值
ros2 param dump <node>打印某个结点的所有参数
ros2 param dump <node> >> xxx.yaml将结点的参数全部保存到文件
ros2 param load <node> xxx.yaml将参数文件值应用到node中
ros2 param describle <node> <param>查看某节点参数的含义

1.节点中接口定义参数

接口手动生成

# 声明参数并设置默认值
self.declare_parameter('initial_point',[0.0,0.0,0.0])
self.declare_parameter('initial_point',[0.0,0.0,0.0])
# 获取指定参数的默认值
self.initial_point = self.get_parameter('initial_point').value
self.target_points = self.get_parameter('target_points').value

运行时加载 

# 单一参数的使用命令行即可
ros2 run <package_name> <executable_name> --ros-args -p <parameter_name>:=<value>

声明的参数你可以在命令行中动态指定,多好

2.参数文件中定义参数

文件自动生成

# 先启动节点
ros2 run autopartol_robot autopartol_node

# 在另一个终端生成参数文件
ros2 param dump /autopartol_node > autopartol_params.yaml

 autopartol_params.yaml

/node_name:
  ros__parameters:
    param1: value1
    param2: value2

运行时加载

# 多参数还是建议使用yaml文件组织
ros2 run autopartol_robot autopartol_node --ros-args --params-file params.yaml

parameter-结点级参数

定义:结点的编写过程中就进行参数定义:本质上属于结点的内容参数

赋值:在结点内赋默认初值,在laucn封装节结点时可重新赋值

应用:常规应用场景比如:修改A*算法的启发式权重值 H_weight : 1.0

argument-命令级参数

定义:launch文件的编写过程中参数定义赋值:本质上属于结点的启动参数

使用:使用LaunchConfiguration 通过键来获取值如作为路径拼接的一环

应用:常规应用场景比如:修改Rviz启动时的配置文件   -d xxx.rviz

《parameter》

# 编写结点时声明​并赋默认值
self.declare_parameter('my_int_param', 42)  # 声明并赋值参数
self.get_parameter('my_int_param').value    # 获取其值来使用
​
# 编写launch时赋予其新的值
 Node(
        package="my_pkg",
        executable="my_node",
        parameters=[{"my_int_param": 42},{"my_str_param": "hello"}]
      )

from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration

# 在launch文件中参数声明
arg_model = DeclareLaunchArgument(
    name='model',                   # 参数名
    default_value='default.urdf',   # 默认值
    description='URDF 文件路径'      # 描述
)

# 在launch文件中参数使用
LaunchConfiguration(‘model’)
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
Executing action: all (aliases: build) Running ninja in directory /home/wokwi/esp-project-esp32s3/build Executing "ninja all"... [1/9] Performing build step for 'bootloader' [1/1] cd /home/wokwi/esp-project-esp32s3/build/bootloader/esp-idf/esptool_py && /opt/esp/python_env/idf5.3_py3.10_env/bin/python /opt/esp/idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /home/wokwi/esp-project-esp32s3/build/bootloader/bootloader.bin Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free. [2/7] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/src/main.c.obj FAILED: esp-idf/main/CMakeFiles/__idf_main.dir/src/main.c.obj ccache /opt/esp/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc -DESP_PLATFORM -DIDF_VER=\"v5.3.1\" -DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\" -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -DUNITY_INCLUDE_CONFIG_H -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -I/home/wokwi/esp-project-esp32s3/build/config -I/home/wokwi/esp-project-esp32s3/main/src -I/opt/esp/idf/components/newlib/platform_include -I/opt/esp/idf/components/freertos/config/include -I/opt/esp/idf/components/freertos/config/include/freertos -I/opt/esp/idf/components/freertos/config/xtensa/include -I/opt/esp/idf/components/freertos/FreeRTOS-Kernel/include -I/opt/esp/idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -I/opt/esp/idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -I/opt/esp/idf/components/freertos/esp_additions/include -I/opt/esp/idf/components/esp_hw_support/include -I/opt/esp/idf/components/esp_hw_support/include/soc -I/opt/esp/idf/components/esp_hw_support/include/soc/esp32s3 -I/opt/esp/idf/components/esp_hw_support/dma/include -I/opt/esp/idf/components/esp_hw_support/ldo/include -I/opt/esp/idf/components/esp_hw_support/port/esp32s3/. -I/opt/esp/idf/components/esp_hw_support/port/esp32s3/include -I/opt/esp/idf/components/heap/include -I/opt/esp/idf/components/log/include -I/opt/esp/idf/components/soc/include -I/opt/esp/idf/components/soc/esp32s3 -I/opt/esp/idf/components/soc/esp32s3/include -I/opt/esp/idf/components/hal/platform_port/include -I/opt/esp/idf/components/hal/esp32s3/include -I/opt/esp/idf/components/hal/include -I/opt/esp/idf/components/esp_rom/include -I/opt/esp/idf/components/esp_rom/include/esp32s3 -I/opt/esp/idf/components/esp_rom/esp32s3 -I/opt/esp/idf/components/esp_common/include -I/opt/esp/idf/components/esp_system/include -I/opt/esp/idf/components/esp_system/port/soc -I/opt/esp/idf/components/esp_system/port/include/private -I/opt/esp/idf/components/xtensa/esp32s3/include -I/opt/esp/idf/components/xtensa/include -I/opt/esp/idf/components/xtensa/deprecated_include -I/opt/esp/idf/components/lwip/include -I/opt/esp/idf/components/lwip/include/apps -I/opt/esp/idf/components/lwip/include/apps/sntp -I/opt/esp/idf/components/lwip/lwip/src/include -I/opt/esp/idf/components/lwip/port/include -I/opt/esp/idf/components/lwip/port/freertos/include -I/opt/esp/idf/components/lwip/port/esp32xx/include -I/opt/esp/idf/components/lwip/port/esp32xx/include/arch -I/opt/esp/idf/components/lwip/port/esp32xx/include/sys -I/opt/esp/idf/components/esp_driver_gpio/include -I/opt/esp/idf/components/esp_pm/include -I/opt/esp/idf/components/mbedtls/port/include -I/opt/esp/idf/components/mbedtls/mbedtls/include -I/opt/esp/idf/components/mbedtls/mbedtls/library -I/opt/esp/idf/components/mbedtls/esp_crt_bundle/include -I/opt/esp/idf/components/mbedtls/mbedtls/3rdparty/everest/include -I/opt/esp/idf/components/mbedtls/mbedtls/3rdparty/p256-m -I/opt/esp/idf/components/mbedtls/mbedtls/3rdparty/p256-m/p256-m -I/opt/esp/idf/components/esp_app_format/include -I/opt/esp/idf/components/esp_bootloader_format/include -I/opt/esp/idf/components/app_update/include -I/opt/esp/idf/components/bootloader_support/include -I/opt/esp/idf/components/bootloader_support/bootloader_flash/include -I/opt/esp/idf/components/esp_partition/include -I/opt/esp/idf/components/efuse/include -I/opt/esp/idf/components/efuse/esp32s3/include -I/opt/esp/idf/components/esp_mm/include -I/opt/esp/idf/components/spi_flash/include -I/opt/esp/idf/components/pthread/include -I/opt/esp/idf/components/esp_timer/include -I/opt/esp/idf/components/esp_driver_gptimer/include -I/opt/esp/idf/components/esp_ringbuf/include -I/opt/esp/idf/components/esp_driver_uart/include -I/opt/esp/idf/components/vfs/include -I/opt/esp/idf/components/app_trace/include -I/opt/esp/idf/components/esp_event/include -I/opt/esp/idf/components/nvs_flash/include -I/opt/esp/idf/components/esp_driver_pcnt/include -I/opt/esp/idf/components/esp_driver_spi/include -I/opt/esp/idf/components/esp_driver_mcpwm/include -I/opt/esp/idf/components/esp_driver_ana_cmpr/include -I/opt/esp/idf/components/esp_driver_i2s/include -I/opt/esp/idf/components/sdmmc/include -I/opt/esp/idf/components/esp_driver_sdmmc/include -I/opt/esp/idf/components/esp_driver_sdspi/include -I/opt/esp/idf/components/esp_driver_sdio/include -I/opt/esp/idf/components/esp_driver_dac/include -I/opt/esp/idf/components/esp_driver_rmt/include -I/opt/esp/idf/components/esp_driver_tsens/include -I/opt/esp/idf/components/esp_driver_sdm/include -I/opt/esp/idf/components/esp_driver_i2c/include -I/opt/esp/idf/components/esp_driver_ledc/include -I/opt/esp/idf/components/esp_driver_parlio/include -I/opt/esp/idf/components/esp_driver_usb_serial_jtag/include -I/opt/esp/idf/components/driver/deprecated -I/opt/esp/idf/components/driver/i2c/include -I/opt/esp/idf/components/driver/touch_sensor/include -I/opt/esp/idf/components/driver/twai/include -I/opt/esp/idf/components/driver/touch_sensor/esp32s3/include -I/opt/esp/idf/components/esp_phy/include -I/opt/esp/idf/components/esp_phy/esp32s3/include -I/opt/esp/idf/components/esp_vfs_console/include -I/opt/esp/idf/components/esp_netif/include -I/opt/esp/idf/components/wpa_supplicant/include -I/opt/esp/idf/components/wpa_supplicant/port/include -I/opt/esp/idf/components/wpa_supplicant/esp_supplicant/include -I/opt/esp/idf/components/esp_coex/include -I/opt/esp/idf/components/esp_wifi/include -I/opt/esp/idf/components/esp_wifi/wifi_apps/include -I/opt/esp/idf/components/esp_wifi/wifi_apps/nan_app/include -I/opt/esp/idf/components/esp_wifi/include/local -I/opt/esp/idf/components/unity/include -I/opt/esp/idf/components/unity/unity/src -I/opt/esp/idf/components/cmock/CMock/src -I/opt/esp/idf/components/console -I/opt/esp/idf/components/http_parser -I/opt/esp/idf/components/esp-tls -I/opt/esp/idf/components/esp-tls/esp-tls-crypto -I/opt/esp/idf/components/esp_adc/include -I/opt/esp/idf/components/esp_adc/interface -I/opt/esp/idf/components/esp_adc/esp32s3/include -I/opt/esp/idf/components/esp_adc/deprecated/include -I/opt/esp/idf/components/esp_driver_isp/include -I/opt/esp/idf/components/esp_driver_cam/include -I/opt/esp/idf/components/esp_driver_cam/interface -I/opt/esp/idf/components/esp_driver_jpeg/include -I/opt/esp/idf/components/esp_driver_ppa/include -I/opt/esp/idf/components/esp_eth/include -I/opt/esp/idf/components/esp_gdbstub/include -I/opt/esp/idf/components/esp_hid/include -I/opt/esp/idf/components/tcp_transport/include -I/opt/esp/idf/components/esp_http_client/include -I/opt/esp/idf/components/esp_http_server/include -I/opt/esp/idf/components/esp_https_ota/include -I/opt/esp/idf/components/esp_https_server/include -I/opt/esp/idf/components/esp_psram/include -I/opt/esp/idf/components/esp_lcd/include -I/opt/esp/idf/components/esp_lcd/interface -I/opt/esp/idf/components/esp_lcd/rgb/include -I/opt/esp/idf/components/protobuf-c/protobuf-c -I/opt/esp/idf/components/protocomm/include/common -I/opt/esp/idf/components/protocomm/include/security -I/opt/esp/idf/components/protocomm/include/transports -I/opt/esp/idf/components/protocomm/include/crypto/srp6a -I/opt/esp/idf/components/protocomm/proto-c -I/opt/esp/idf/components/esp_local_ctrl/include -I/opt/esp/idf/components/espcoredump/include -I/opt/esp/idf/components/espcoredump/include/port/xtensa -I/opt/esp/idf/components/wear_levelling/include -I/opt/esp/idf/components/fatfs/diskio -I/opt/esp/idf/components/fatfs/src -I/opt/esp/idf/components/fatfs/vfs -I/opt/esp/idf/components/idf_test/include -I/opt/esp/idf/components/idf_test/include/esp32s3 -I/opt/esp/idf/components/ieee802154/include -I/opt/esp/idf/components/json/cJSON -I/opt/esp/idf/components/mqtt/esp-mqtt/include -I/opt/esp/idf/components/nvs_sec_provider/include -I/opt/esp/idf/components/perfmon/include -I/opt/esp/idf/components/spiffs/include -I/opt/esp/idf/components/touch_element/include -I/opt/esp/idf/components/usb/include -I/opt/esp/idf/components/wifi_provisioning/include -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -Og -fno-shrink-wrap -fmacro-prefix-map=/home/wokwi/esp-project-esp32s3=. -fmacro-prefix-map=/opt/esp/idf=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -std=gnu17 -Wno-old-style-declaration -MD -MT esp-idf/main/CMakeFiles/__idf_main.dir/src/main.c.obj -MF esp-idf/main/CMakeFiles/__idf_main.dir/src/main.c.obj.d -o esp-idf/main/CMakeFiles/__idf_main.dir/src/main.c.obj -c /home/wokwi/esp-project-esp32s3/main/src/main.c /home/wokwi/esp-project-esp32s3/main/src/main.c: In function 'app_main': /home/wokwi/esp-project-esp32s3/main/src/main.c:56:20: error: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'int' [-Werror=format=] 56 | printf("设置角度: %" PRIu32 "°, 占空比: %" PRIu32 "\n", angle, duty); | ^~~~~~~~~~~~~ ~~~~~ | | | int /home/wokwi/esp-project-esp32s3/main/src/main.c:65:20: error: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'int' [-Werror=format=] 65 | printf("设置角度: %" PRIu32 "°, 占空比: %" PRIu32 "\n", angle, duty); | ^~~~~~~~~~~~~ ~~~~~ | | | int cc1: some warnings being treated as errors ninja: build stopped: subcommand failed. ninja failed with exit code 1, output of the command is in the /home/wokwi/esp-project-esp32s3/build/log/idf_py_stderr_output_21792 and /home/wokwi/esp-project-esp32s3/build/log/idf_py_stdout_output_21792 Error: Process exited with 2
08-21
你这次遇到的错误是由于在 `printf` 中使用了错误的格式符,导致类型不匹配。具体来说: --- ### ❌ 错误信息: ``` format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'int' ``` 你使用了 `%" PRIu32 "` 来打印 `angle`(一个 `int` 类型),但 `PRIu32` 是用于 `uint32_t` 类型的宏,而 `angle` 是 `int`(有符号整数),所以导致类型不匹配。 --- ### ✅ 解决方案 你需要根据变量的类型选择对应的 `printf` 格式宏: | 类型 | 宏定义 | |-------------|--------------| | `int` | `%d` | | `uint32_t` | `%" PRIu32 "` | 所以,将打印语句: ```c printf("设置角度: %" PRIu32 "°, 占空比: %" PRIu32 "\n", angle, duty); ``` 改为: ```c printf("设置角度: %d°, 占空比: %" PRIu32 "\n", angle, duty); ``` 因为 `angle` 是 `int` 类型,不需要使用 `PRIu32`,而 `duty` 是 `uint32_t`,所以仍使用 `%" PRIu32 "`。 --- ### ✅ 修改后的完整代码片段如下: ```c #include <stdio.h> #include <inttypes.h> // 必须包含 PRIu32 #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/ledc.h" #include "esp_err.h" // 定义舵机角度范围 #define SERVO_MIN_ANGLE 0 #define SERVO_MAX_ANGLE 180 // 定义PWM参数 #define LEDC_TIMER LEDC_TIMER_0 #define LEDC_MODE LEDC_LOW_SPEED_MODE #define LEDC_OUTPUT_IO (13) #define LEDC_CHANNEL LEDC_CHANNEL_0 #define LEDC_DUTY_RES LEDC_TIMER_13_BIT #define LEDC_FREQUENCY (50) #define LEDC_DUTY_MIN (26) #define LEDC_DUTY_MID (130) #define LEDC_DUTY_MAX (234) // 将角度转换为占空比 static uint32_t angle_to_duty(int angle) { return LEDC_DUTY_MIN + (angle * (LEDC_DUTY_MAX - LEDC_DUTY_MIN)) / SERVO_MAX_ANGLE; } void app_main(void) { // LEDC定时器配置 ledc_timer_config_t ledc_timer = { .speed_mode = LEDC_MODE, .duty_resolution = LEDC_DUTY_RES, .freq_hz = LEDC_FREQUENCY, .clk_cfg = LEDC_AUTO_CLK }; ledc_timer_config(&ledc_timer); // LEDC通道配置 ledc_channel_config_t ledc_channel = { .channel = LEDC_CHANNEL, .duty = 0, .gpio_num = LEDC_OUTPUT_IO, .speed_mode = LEDC_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER }; ledc_channel_config(&ledc_channel); printf("舵机控制程序启动\n"); while (1) { // 控制舵机从0度转到180度 for (int angle = 0; angle <= 180; angle += 10) { uint32_t duty = angle_to_duty(angle); printf("设置角度: %d°, 占空比: %" PRIu32 "\n", angle, duty); ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty); ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); vTaskDelay(pdMS_TO_TICKS(500)); } // 控制舵机从180度回到0度 for (int angle = 180; angle >= 0; angle -= 10) { uint32_t duty = angle_to_duty(angle); printf("设置角度: %d°, 占空比: %" PRIu32 "\n", angle, duty); ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty); ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); vTaskDelay(pdMS_TO_TICKS(500)); } } } ``` --- ### ✅ 总结 - ✅ `angle` 是 `int` 类型,使用 `%d` - ✅ `duty` 是 `uint32_t` 类型,使用 `%" PRIu32 "` - ✅ 包含 `<inttypes.h>` 以使用 `PRIu32` 宏 - ✅ 编译器将不再报错,程序可以正常构建并运行 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值