E: 无法下载 https://mirrors.ustc.edu.cn/ros2/ubuntu/pool/main/r/ros-galactic-rviz2/ros-galactic-rviz2_8.5.2-1focal.20221207.132801_amd64.deb 404 Not Found [IP: 202.141.176.110 443]
依然报错
Win11+WSL2+Ubuntu22.04.5 LTS环境下,无法连接FishBot小车的主控板和雷达版,表现为MicroRos接收不到数据,ros2 node list无节点,雷达板nc -l 8889监听不到端口信息等。
问题分析实质上是网络问题,我在实际中遇到的问题有两点:一是WSL2的网络模式与防火墙问题,二是路由器的双频合一(或多频合一)的设置问题。
解决方法 小车若连接路由器,一定要关闭路由器的双频合一功能,并使小车连接2.4G频段。 打开“网络和Internet设置”,修改当前网络的配置文件类型为专用网络。公用网络的防火墙比较严格。fa96f7e8-1b49-4312-bb27-0159cfe855b2-image.png 修改.wslconfig配置文件,位于C:\Users\<你的用户名>\.wslconfig,没有的话就手动创建一个,WSL2启动时会自动读取。在其中添加以下内容: [wsl2] networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=true
此处是设置WSL2为镜像网络模式,让WSL2的IP地址与宿主机相同,并告诉WSL允许防火墙规则生效。
4. 手动放行MicroRos代理的端口,和雷达板需要的端口:
(1)允许Ping入站:
(2)允许 Micro-ROS Agent 端口 (UDP 8888):
New-NetFirewallRule -DisplayName "Micro-ROS Agent UDP" -Direction Inbound -Action Allow -Protocol UDP -LocalPort 8888 -Enabled True(3)允许 雷达版 端口 (TCP 8889):
New-NetFirewallRule -DisplayName "Lidar TCP 8889" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8889 -Enabled True放行端口后也是成功接收到了数据。
以上是我在使用WSL2连接小车时遇到的问题,以及解决的方法,希望对大家有所帮助。
a716298a-7b3d-4bb4-8225-301de7a57607-image.png
Ubuntu20 在安装ROS1的基础上,一键安装ROS2失败。
雷达固件烧录以及配置完成之后,收到/scan话题的频率特别低。无论是串口还是无线,都很低。无法扫图建图。
06c191e1-67cc-4bac-9859-6383682db9d4-img_v3_02sr_070896fb-ea9c-45a8-9ba8-2dc83970233g.jpg
88553ccb-acfb-43be-a19e-9e5277a14a1d-img_v3_02sr_d28c59ff-412d-4dfa-b0b9-297990d51e2g.jpg
10b4b962-291c-4bd9-8795-67c2ddf32883-image.png
Traceback (most recent call last):
File "/tmp/fishinstall/tools/translation/translator.py", line 60, in loadTranslationFile
self._translations = importlib.import_module(_import_command).translations
File "/usr/lib/python3.10/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tools.translation.assets.zh_CN'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/tmp/fishinstall/install.py", line 138, in <module>
main()
File "/tmp/fishinstall/install.py", line 68, in main
importlib.import_module("tools.translation.translator").Linguist()
File "/tmp/fishinstall/tools/translation/translator.py", line 52, in init
self.loadTranslationFile()
File "/tmp/fishinstall/tools/translation/translator.py", line 64, in loadTranslationFile
self._translations = importlib.import_module(_import_command).translations
File "/usr/lib/python3.10/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tools.translation.assets.en_US'
使用CubeMX+IDE开发
下面是我freertos的Default代码
之后报错,下面是报错日志
[Init] Agent Connected! (rc=0) [Init] System Ready. Entering Loop... [Error] Spin: 900 [Error] Spin: 900 [Error] Spin: 900 [Error] Spin: 900 [Error] Spin: 900 [Error] Spin: 900 [Error] Spin: 900acbf4ebe-2096-43d9-91c6-11ebfaacfbb8-image.png cee2f40e-0527-4900-af9a-c41b1dee2958-image.png
本文是对官网文章个人的总结概括,有意读者可阅读官网文章:https://micro.ros.org/docs/concepts/client_library/execution_management/
介绍 节点是ROS框架的根基,节点内的回调函数更是灵魂。ROS中通信机制有很多,话题,服务,动作等等,所以对节点的回调函数的执行处理是一个很重要的问题。
ROS1中网络线程接收到的所有消息均放在FIFO队列中,回调也是以FIFO的方式调用,没有执行管理。在ROS2中,随着DDS(数据分发服务)的引入,executor(执行器)的概念也被创建来支持执行管理。大致流程是查询->获取->执行:
ROS2中消息被缓冲在DDS中,executor 会收集它所管理的所有节点中的句柄,配置一个等待集(wait set)并发给rcl层,并阻塞。 rcl层返回一个就绪集(ready set),列出哪些句柄此刻有消息。 Executor 遍历就绪集,从中提取数据,调用相应回调函数。 但ROS2标准rclcpp执行器具有局限性。例如定时器优先于所有其他 DDS 句柄,非定时器句柄采用非抢占式轮询调度,以及每个句柄仅考虑一个输入数据(即使可能有多个输入数据可用),ROS也没有机制来强制节点内回调函数的执行顺序。这些特点致使其难以保证执行器的确定性和实时性。
鉴于以上问题,在开发microros的执行器时,官方开发了高级执行管理机制,并将其用于ROS中,改进了标准ROS2的rclcpp库。
rclcpp标准执行器分析 体系结构 弱引用管理:执行器实例只维护指向节点的弱指针(weak po1inter)。弱指针是c++中的一个概念。通俗理解就是通过一个中间人去访问对象。执行器访问节点时会判断节点是否存在,如果节点已销毁,执行器就会跳过,而不会强行访问导致bug。所以我们可以安全地销毁节点,而无需通知Executor。 依赖DDS队列:执行器自己不维护回调队列,而是依赖DDS来缓冲消息。它只是需要了,从中提取数据。 缺乏优先级:执行器内部层次,在一个任务中,不对回调进行优先级排序或分类。 非实时感知:执行器与操作系统层次,没有利用底层操作系统调度器的实时特性来更好地控制执行顺序。可以理解为没有配置任务优先级。 不太好的特性 计时器优先级最高。执行器总是先处理定时器。如果定时器任务太多(过载),DDS 里的普通消息(如传感器数据)可能永远轮不到处理。 非定时器句柄采用非抢占式循环调度。 每一句柄只考虑一条消息。会严重加剧延迟。 处理模式的分析 这一大部分文章主要分析了移动机器人和实时嵌入式系统的处理模式,由此分析推导出microros中执行器应具有的特点.
移动机器人:
机器人的感知-规划-行动流水线 多速率传感器同步 高优先级处理路径实时嵌入式系统
时间触发轮询 逻辑执行时间 (LET) rclc执行器 特征rclc执行器支持所有事件类型:
订阅 计时器 服务 客户 警戒条件 行动 生命周期还提供了如下新功能:
触发执行 用户自定义顺序执行 多线程和调度配置 用于周期性进程调度数据同步的LET语义 顺序执行 配置过程中,用户可定义句柄的顺序:即添加顺序,先添加,先检查先执行。 在配置时,用户可以定义句柄是仅在有新数据可用时调用(ON_NEW_DATA)还是始终调用回调(ALWAYS)。rclc_executor_add_subscription(&exe_sense, &sense_IMU, &my_sub_cb2, ON_NEW_DATA); 运行时,所有句柄均按照用户定义的顺序进行处理。 如果句柄配置为 ON_NEW_DATA,则仅当有新数据可用时才会调用相应的回调函数。 如果句柄的配置为 ALWAYS,则相应的回调函数也始终为 ALWAYS。如果没有数据可用,则回调函数将不带任何数据(例如,空指针)被调用。 辨析:执行器被触发和回调被调用是两个概念。 触发条件 给定一组句柄,触发条件(基于这些句柄的输入数据是否可用)决定何时开始处理所有回调。 可选方案: ALL:当所有句柄都有输入数据时触发。 ANY:当至少一个句柄有输入数据可用时触发。 ONE:当用户指定的句柄有输入数据时触发。 User-defined: 用户自定义复杂的触发逻辑,甚至可以包含硬件中断。可以满足更个性化的需求。 逻辑执行时间(LET语义)LET语义的核心是通过固定时间读取,固定时间写入的策略,保证实时系统中**数据的一致性。**具体流程如下,在一个周期中:
周期开始(读输入):
周期开始时执行器会读取所有相关的输入数据,并保存为一份本地副本。
周期进行中(处理计算):
执行器拿着本地副本中的数据,按预定顺序执行回调函数。关键在于,执行期间,即使DDS收到了新的数据,执行器也不会使用,从而保证本周期内数据的一致性。
周期结束(写输出):
周期结束时,统一将结果发布,即使有的结果早就算出,也要等到最后统一发布。
多线程和调度配置逻辑执行是一个特殊情况,正常情况下,执行器触发后,对数据是即取即用,对逐一读取句柄时,在执行该回调函数之前,才会从DDS队列中请求新数据。
这个特点支持用户可以创建多个executor,把优先级高,低的callback分配给不同的executor,然后创建不同优先级的任务,让executor在不同任务中运行。
注意:
通过将回调分配给不同的 Executor 实例,可以避免标准 ROS 2 执行器中“一个慢任务阻塞所有任务”的现象。
危险性:
if Executors are running in multiple threads, publishing needs to be atomic
当执行器在多线程中运行时,发布操作一定要是原子性的。microros现在库尚未提供这种线程安全的保护,所以需要用户手动实现。
void motor_callback(const void * msgin) { // 在发布前获取锁 if (xSemaphoreTake(pub_mutex, portMAX_DELAY) == pdTRUE) { // 【原子操作区】此时没人能打断发布过程 rcl_publish(&shared_publisher, &tx_msg, NULL); // 发布完立即释放锁 xSemaphoreGive(pub_mutex); } } 执行器常用API 配置阶段 初始化参数 : 回调总数 回调顺序 触发条件(可选,默认值:ANY) 数据通信语义(可选,默认为 ROS2) 执行顺序与逻辑 顺序定义: 代码中添加句柄(Handle)的顺序,直接决定了运行时回调的 顺序处理顺序。 回调执行条件: ON_NEW_DATA ALWAYS 执行器触发条件: trigger_any (默认):任意一个回调有新数据就触发(兼容标准 ROS 2 行为)。 trigger_all:所有回调都有新数据时才触发。 trigger_one:指定某个特定句柄收到数据时触发。 user_defined_function:用户自定义复杂逻辑。 通信语义设置: ROS2 (默认) LET(逻辑执行时间) 执行阶段可用的旋转函数:
spin_some:运行一次。rclc_executor_spin_some(&executor, 1000);在1000ns内等待执行,只执行一次,就立即返回,1000ns是最大等待时间。
spin_period:按固定周期运行。不会返回,在1000周期内执行一次,然后休眠;该周期结束,开始下一次周期。
spin:无限循环运行。
(lerobot) root@tydic-OMEN-MAX-Gaming-Laptop-16-ah0xxx:~# ros2 run demo_nodes_cpp talker
Traceback (most recent call last):
File "/opt/ros/humble/bin/ros2", line 33, in <module>
sys.exit(load_entry_point('ros2cli==0.18.15', 'console_scripts', 'ros2')())
File "/opt/ros/humble/bin/ros2", line 25, in importlib_load_entry_point
return next(matches).load()
File "/usr/lib/python3.10/importlib/metadata/init.py", line 171, in load
module = import_module(match.group('module'))
File "/usr/lib/python3.10/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/opt/ros/humble/lib/python3.10/site-packages/ros2cli/cli.py", line 22, in <module>
from rclpy.executors import ExternalShutdownException
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/init.py", line 49, in <module>
from rclpy.signals import install_signal_handlers
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/signals.py", line 15, in <module>
from rclpy.exceptions import InvalidHandle
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/exceptions.py", line 15, in <module>
from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/impl/implementation_singleton.py", line 32, in <module>
rclpy_implementation = import_c_library('._rclpy_pybind11', package)
File "/opt/ros/humble/lib/python3.10/site-packages/rpyutils/import_c_library.py", line 39, in import_c_library
return importlib.import_module(name, package=package)
File "/usr/lib/python3.10/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /opt/ros/humble/lib/librcl_logging_spdlog.so: undefined symbol: ZN6spdlog7details7log_msgC1ENS_10source_locEN3fmt2v817basic_string_viewIcEENS_5level10level_enumES6
The C extension '/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/_rclpy_pybind11.cpython-310-x86_64-linux-gnu.so' failed to be imported while being present on the system. Please refer to 'https://docs.ros.org/en/{distro}/Guides/Installation-Troubleshooting.html#import-failing-even-with-library-present-on-the-system' for possible solutions
本篇以cubemx模板构建microros代码,实现stm32F429IGT6运行简单例程。
官方学习网站:https://micro.ros.org/
嵌入式端构建流程以该仓库为教程:https://github.com/micro-ROS/micro_ros_stm32cubemx_utils
大致步骤:
克隆仓库
选择sample_project.ioc,在cubemx中打开并完善配置,生成MakeFile工程。
修改MakeFile文件
从Docker拉取镜像并构建生成静态库libmicroros.a及头文件。
添加文件,添加例程代码,进行测试。
具体步骤 克隆仓库无他,找寻个喜欢的位置,直接克隆即可。
以下是克隆下的仓库,只需关注所框文件:
df6b7dce-ec36-48a0-8286-fd877231a218-image-20251126223754318.png
extra_sources:里面是microros框架针对STM32嵌入式平台提供的适配层和底层支持代码。
custom_memory_manager.c:microros实际管理分配内存的代码,使用的是freertosAPI函数
microros_allocators.c:对custom_memory_manager.c的进一步封装 microros_time.c:为 micro-ROS 客户端库提供精确的系统时间,使用的是freertosAPI函数 microros_transports文件夹下的四个文件,是官方提供的物理传输层接口,分别通过串口+DMA,串口中断,udp,usb与电脑连接,从而实现板子和电脑上的数据传输。microros_static_library,microros_static_library_ide是静态库构建的核心,为 Docker 容器提供所有必要的脚本和配置文件。最后生成的静态库就这这两个文件夹下面,以cubemx模板构建在前者文件夹,IDE则在后者。
sample_main.c,sample_main_udp.c,sample_main_embeddedrtps.c三者都是得的例程,区别在传输协议上,前两个用的是micro-XRCE-DDS 协议,通过串口,网络与ROS节点通信,依赖micro-ROS Agent 充当中继;embeddedrtps.c则是直接在嵌入式设备上运行完整的 DDS/RTPS 协议栈,可直接与ROS节点通信,不依赖micro-ROS Agent ,延迟更低,但资源消耗太大。
sample_project.ioc其实没啥用,就是正常的cubemx工程配置。
生成MakeFile工程通过cubemx配置生成MakeFile工程。配置时只需注意串口,DMA,FreeRTOS,任务栈要给大,官方推荐3000。
修改MakeFile文件MakeFile文件在Docker编译生成静态库中很重要,Docker编译时会读取你工程中的MakeFile文件中关于**编译工具,选项的设置,**如编译器版本,是否使用硬件浮点等。默认是不用修改的。
构建生成静态库 docker pull microros/micro_ros_static_library_builder:kilted docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=micro_ros_stm32cubemx_utils/microros_static_library microros/micro_ros_static_library_builder:kilted 构建过程其实就这几行命令,注意选择自己需要的R版本,还有比较令人恼火的是,因为网络代理原因,拉取完镜像,构建编译时总是失败,原因是无法连接到github。作者被折磨了好几天,也未能解决,在linux上构建编译时从未成功,几次成功的经历都是在WSL环境下实现的。注意Docker的代理需要手动配置,WSL2的也需要手动配置。希望读者不会遇到该问题,或读者能轻松解决。
53115e51-078d-46e6-baf1-61aa89a77b8d-image-20251127183437635.png image-20251127183437635
构建成功之后,我们会在microros_static_library文件夹中找到libmicroros文件夹,该文件夹就是生成的静态库等所需文件。
ee2aec3f-e5ec-4edb-a5c9-21e82580948a-image-20251127183757235.png image-20251127183757235
microros_include文件夹是各种头文件。 libmicroros.a就是静态库文件,里面包含了microros的函数具体实现,相当于它没有给我们.c源文件,而是把他们包含在了.a静态库中。优点是不用添加一堆文件,缺点万一有问题不能debug,因为你没有源码,并且消息类型变量不能自由定义。 available_ros2_types这是microros可用的消息类型,由编译时生成。 built_packages这个似乎是用于版本记录控制的,无需太关注。 添加例程,文件进行测试 添加文件 就五个文件(头文件除外)
libmicroros.a
custom_memory_manager.c
microros_allocators.c
microros_time.c
dma_transport.c:如果你不是用串口+DMA通信,改用符合的文件。
例程参照sample_main.c,主要代码如下:
/* USER CODE BEGIN 4 */ bool cubemx_transport_open(struct uxrCustomTransport * transport); bool cubemx_transport_close(struct uxrCustomTransport * transport); size_t cubemx_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err); size_t cubemx_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err); void * microros_allocate(size_t size, void * state); void microros_deallocate(void * pointer, void * state); void * microros_reallocate(void * pointer, size_t size, void * state); void * microros_zero_allocate(size_t number_of_elements, size_t size_of_element, void * state); /* USER CODE END 4 */ /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN 5 */ // micro-ROS configuration rmw_uros_set_custom_transport( true, (void *) &huart3, cubemx_transport_open, cubemx_transport_close, cubemx_transport_write, cubemx_transport_read); rcl_allocator_t freeRTOS_allocator = rcutils_get_zero_initialized_allocator(); freeRTOS_allocator.allocate = microros_allocate; freeRTOS_allocator.deallocate = microros_deallocate; freeRTOS_allocator.reallocate = microros_reallocate; freeRTOS_allocator.zero_allocate = microros_zero_allocate; if (!rcutils_set_default_allocator(&freeRTOS_allocator)) { printf("Error on default allocators (line %d)\n", __LINE__); } // micro-ROS app rcl_publisher_t publisher; std_msgs__msg__Int32 msg; rclc_support_t support; rcl_allocator_t allocator; rcl_node_t node; allocator = rcl_get_default_allocator(); //create init_options rclc_support_init(&support, 0, NULL, &allocator); // create node rclc_node_init_default(&node, "cubemx_node", "", &support); // create publisher rclc_publisher_init_default( &publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "cubemx_publisher"); msg.data = 0; for(;;) { rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL); if (ret != RCL_RET_OK) { printf("Error publishing (line %d)\n", __LINE__); } msg.data++; osDelay(10); } /* USER CODE END 5 */ } 代理端构建 如果通信协议选择使用的micro-XRCE-DDS 协议,在运行ROS2的主机上还需构建microros_agent,官方教程参照:https://github.com/micro-ROS/micro_ros_setup?tab=readme-ov-file。按照官方教程完整流程构建,除了可配置miccroros_agent,**还可获得所有源码,如之前缺失的.c文件。**但文件层次比较复杂,需仔细研究一番。
若只构建microros_agent:
只需参考运行Building,Building micro-ROS-Agent这两部分的命令代码。
1a7e02c9-d4ea-4507-8432-e87135e3e945-image-20251127204425923.png image-20251127204425923
b20cac9c-52a9-4203-ab94-82267762caef-image-20251127205159697.png image-20251127205159697
成果检验最终效果:
2251c90a-7b80-4456-b966-e5fe74cf661f-image-20251127204943932.png image-20251127204943932
在Ubuntu24.04ros2jazzy与gazebo sim 8进行仿真显示找不到模型,从solidworks中导出的URDF文件,在当前环境中没有没有显示模型,日志显示“GUI] [Err] [SystemPaths.cc:425] Unable to find file with URI [model://my_robot/meshes/base_car.STL]”,但是gazebo中的entity tree有模型的名称1764662097053.png 如图。感谢解答!
RUN Choose Task:[Please enter the number in brackets]
请选择你要安装的ROS版本名称(请注意ROS1和ROS2区别):
[1]:foxy(ROS2)
[2]:galactic(ROS2)
[3]:noetic(ROS1)
[4]:rolling(ROS2)
[0]:quit
Type the number in [] to choose a function:3
RUN Choose Task:[Please enter the number in brackets]
请选择安装的具体版本(如果不知道怎么选,请选1桌面版):
[1]:noetic(ROS1)桌面版
[2]:noetic(ROS1)基础版(小)
[0]:quit
Type the number in [] to choose a function:1
Run CMD Task:[sudo apt search aptitude ]
[-][1.77s] CMD Result:success
Run CMD Task:[sudo apt install aptitude -y]
[-][1.54s] CMD Result:code:100
Run CMD Task:[sudo apt install ros-noetic-desktop-full -y]
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
ros-noetic-desktop-full : Depends: ros-noetic-desktop but it is not going to be installed
Depends: ros-noetic-perception but it is not going to be installed
Depends: ros-noetic-simulators but it is not going to be installed
Depends: ros-noetic-urdf-sim-tutorial but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
Run CMD Task:[sudo apt install ros-noetic-desktop-full -y]
[-][1.54s] CMD Result:code:100
============================================================
请注意我,检测你在安装过程中出现依赖问题,请在稍后输入n,再选择y,即可解决(若无法解决,清在稍后手动运行命令: sudo aptitude install ros-noetic-desktop-full)
确认了解情况,请输入回车继续安装
Run CMD Task:[sudo aptitude install ros-noetic-desktop-full]
sudo: aptitude: command not found
Run CMD Task:[sudo aptitude install ros-noetic-desktop-full -y]
[-][0.00s] CMD Result:code:1
Run CMD Task:[sudo apt search python3-catkin-tools ]
[-][1.51s] CMD Result:success
Run CMD Task:[sudo apt install python3-catkin-tools -y]
[-][1.44s] CMD Result:code:100
Run CMD Task:[sudo apt search python3-rosdep ]
[-][1.56s] CMD Result:success
Run CMD Task:[sudo apt install python3-rosdep -y]
[-][1.56s] CMD Result:success
Run CMD Task:[ls /opt/ros/noetic/setup.bash]
[-][0.00s] CMD Result:code:2
安装失败了,请打开鱼香社区:https://fishros.org.cn/forum 在一键安装专区反馈问题...
9bb75ffc-e65a-48f6-ac3f-6b5e721d38e5-image.png a1739072-c8f5-4440-ba2d-db03d39003ba-image.png
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">
<!-- 声明 base 模块 -->
<xacro:macro name="base_link" params="length radius">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="${length}" radius="${radius}" />
</geometry>
<material name="blue">
<color rgba="0.1 0.1 1.0 0.5" />
</material>
</visual>
</link>
</xacro:macro>
<!-- 声明 IMU 模块 -->
<xacro:macro name="imu_link" params="imu_name xyz">
<link name="${imu_name}_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.02 0.02 0.02" />
</geometry>
</visual>
<material name="black">
<color rgba="0 0 0 0.5" />
</material>
</link>
<joint name="${imu_name}_joint" type="fixed">
<parent link="base_link" />
<child link="${imu_name}_link" />
<origin xyz="${xyz}" />
</joint>
</xacro:macro>
<!-- 传递参数调用 base_link 模块 -->
<xacro:base_link length="0.12" radius="0.1" />
<!-- 传递参数调用 imu 模块 -->
<xacro:imu_link imu_name="imu_up" xyz="0 0 0.1" />
<xacro:imu_link imu_name="imu_down" xyz="0 0 -0.1" />
</robot>
import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory
import os
import launch_ros.parameter_descriptions
def generate_launch_description():
#获取urdf路径
urdf_package_path = get_package_share_directory('fishbot_description')
default_urdf_path = os.path.join(urdf_package_path,'urdf','first_robot.xacro')
#声明一个urdf目录的参数,方便修改
action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
name='model',
default_value=str(default_urdf_path),
description='加载的模型文件路径'
)
#通过文件路径,获取内容,并转换为参数值对象,以供传入robot_state_publisher
substitutions_command_result = launch.substitutions.Command(['xacro ',launch.substitutions.LaunchConfiguration('model')])
robot_description_value = launch_ros.parameter_descriptions.ParameterValue(
substitutions_command_result, value_type=str
)
])
ROS1中除了RVIZ Range,还有没有更好Sonar声呐开源可视化插件?谢谢解答!
下列软件包有未满足的依赖关系:
libasound2t64 : 破坏: libasound2 (< 1.2.11-1ubuntu0.1)
libblkid-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
libboost-mpi-python1.74.0 : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
libcurl4t64 : 破坏: libcurl4 (< 8.5.0-2ubuntu10.6)
libdbus-1-dev : 依赖: libdbus-1-3 (= 1.12.20-2ubuntu4.1) 但是 1.14.10-4ubuntu4.1 正要被安装
libdecor-0-dev : 依赖: libdecor-0-0 (= 0.1.0-3build1) 但是 0.2.2-1build2 正要被安装
libdrm-dev : 依赖: libdrm2 (= 2.4.113-2~ubuntu0.22.04.1) 但是 2.4.122-1~ubuntu0.24.04.2 正要被安装
依赖: libdrm-intel1 (= 2.4.113-2~ubuntu0.22.04.1) 但是 2.4.122-1~ubuntu0.24.04.2 正要被安装
依赖: libdrm-radeon1 (= 2.4.113-2~ubuntu0.22.04.1) 但是 2.4.122-1~ubuntu0.24.04.2 正要被安装
依赖: libdrm-nouveau2 (= 2.4.113-2~ubuntu0.22.04.1) 但是 2.4.122-1~ubuntu0.24.04.2 正要被安装
依赖: libdrm-amdgpu1 (= 2.4.113-2~ubuntu0.22.04.1) 但是 2.4.122-1~ubuntu0.24.04.2 正要被安装
libexif-dev : 依赖: libc6-dev 但无法安装它
libexpat1-dev : 依赖: libexpat1 (= 2.4.7-1ubuntu0.6) 但是 2.6.1-2ubuntu0.3 正要被安装
依赖: libc6-dev 但无法安装它 或
libc-dev
libgdal-dev : 依赖: libc6-dev 但无法安装它
依赖: libjpeg-dev
libgeotiff-dev : 依赖: libjpeg-dev
libglib2.0-bin:i386 : 依赖: libc6:i386 (>= 2.34) 但无法安装它
依赖: libelf1:i386 (>= 0.142) 但无法安装它
依赖: libglib2.0-0:i386 (= 2.72.4-0ubuntu2.6) 但无法安装它
libglib2.0-dev : 依赖: libglib2.0-0 (= 2.72.4-0ubuntu2.6)
依赖: libglib2.0-dev-bin (= 2.72.4-0ubuntu2.6)
libhdf4-alt-dev : 依赖: libjpeg-dev
libhdf5-dev : 依赖: libjpeg-dev
依赖: libssl-dev 但无法安装它
libhdf5-openmpi-dev : 依赖: libjpeg-dev
依赖: libssl-dev 但无法安装它
libheif-dev : 依赖: libheif1 (= 1.12.0-2build1) 但是 1.17.6-1ubuntu4.1 正要被安装
依赖: libaom-dev 但是它将不会被安装
依赖: libde265-dev (>= 1.0.7) 但是它将不会被安装
libibus-1.0-dev : 依赖: gir1.2-ibus-1.0 (= 1.5.26-4) 但是 1.5.29-2 正要被安装
依赖: libibus-1.0-5 (= 1.5.26-4) 但是 1.5.29-2 正要被安装
libicu-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
libltdl-dev : 依赖: libltdl7 (= 2.4.6-15build2) 但是 2.4.7-7build1 正要被安装
推荐: libtool 但是它将不会被安装
libmount-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
libmysqlclient-dev : 依赖: libssl-dev 但无法安装它
libnuma-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
libopencv-highgui-dev : 依赖: libjpeg-dev
libopenmpi-dev : 依赖: gfortran-11 但无法安装它 或
gfortran-mod-15
推荐: libcoarrays-openmpi-dev 但无法安装它
libpcre2-dev : 依赖: libc-dev
libpcre3-dev : 依赖: libc6-dev 但无法安装它
libpng-dev : 依赖: libpng16-16 (= 1.6.37-3build5)
推荐: libpng-tools
libpq-dev : 依赖: libssl-dev 但无法安装它
libpyside2-py3-5.15 : 依赖: qtdeclarative-abi-5-15-3
libpython3-stdlib:i386 : 依赖: libpython3.10-stdlib:i386 (>= 3.10.6-1~) 但无法安装它
libpython3.10-minimal:i386 : 依赖: libc6:i386 (>= 2.4) 但无法安装它
依赖: libssl3:i386 (>= 3.0.0~~alpha1) 但无法安装它
推荐: libpython3.10-stdlib:i386 但无法安装它
libqt5core5t64 : 破坏: libqt5core5a (< 5.15.13+dfsg-1ubuntu1)
libqt5dbus5t64 : 破坏: libqt5dbus5 (< 5.15.13+dfsg-1ubuntu1)
libqt5gui5t64 : 破坏: libqt5gui5 (< 5.15.13+dfsg-1ubuntu1)
libqt5network5t64 : 破坏: libqt5network5 (< 5.15.13+dfsg-1ubuntu1)
libqt5webkit5-dev : 依赖: libqt5webkit5 (= 5.212.0~alpha4-15ubuntu1) 但无法安装它
libqt5widgets5t64 : 破坏: libqt5widgets5 (< 5.15.13+dfsg-1ubuntu1)
libshiboken2-py3-5.15 : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
libsqlite3-dev : 依赖: libc6-dev 但无法安装它
libstdc++-11-dev : 依赖: libc6-dev (>= 2.13-0ubuntu6) 但无法安装它
libtiff-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
依赖: libjpeg-dev
libtinyxml-dev : 依赖: libtinyxml2.6.2v5 (= 2.6.2-6ubuntu0.22.04.1) 但是 2.6.2-6.1 正要被安装
libudev-dev : 依赖: libudev1 (= 249.11-0ubuntu3.17) 但是 255.4-1ubuntu8.11 正要被安装
libvtk9-dev : 依赖: libc6-dev 但无法安装它
依赖: libfreetype6-dev
依赖: libjpeg-dev
libwayland-dev : 依赖: libwayland-client0 (= 1.20.0-1ubuntu0.1) 但是 1.22.0-2.1build1 正要被安装
依赖: libwayland-server0 (= 1.20.0-1ubuntu0.1) 但是 1.22.0-2.1build1 正要被安装
依赖: libwayland-cursor0 (= 1.20.0-1ubuntu0.1) 但是 1.22.0-2.1build1 正要被安装
依赖: libwayland-egl1 (= 1.20.0-1ubuntu0.1) 但是 1.22.0-2.1build1 正要被安装
libwebp-dev : 依赖: libwebp7 (= 1.2.2-2ubuntu0.22.04.2) 但是 1.3.2-0.4build3 正要被安装
依赖: libwebpmux3 (= 1.2.2-2ubuntu0.22.04.2) 但是 1.3.2-0.4build3 正要被安装
依赖: libwebpdemux2 (= 1.2.2-2ubuntu0.22.04.2) 但是 1.3.2-0.4build3 正要被安装
libx11-dev : 依赖: libx11-6 (= 2:1.7.5-1ubuntu0.3) 但是 2:1.8.7-1build1 正要被安装
依赖: libxcb1-dev 但是它将不会被安装
libxerces-c-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
libxft-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
依赖: libfontconfig1-dev
依赖: libfreetype6-dev
libzstd-dev : 依赖: libzstd1 (= 1.4.8+dfsg-3build1) 但是 1.5.5+dfsg2-2build1.1 正要被安装
python3:i386 : 预依赖: python3-minimal:i386 (= 3.10.6-1~22.04.1) 但无法安装它
python3-cairo : 依赖: python3 (< 3.13) 但无法安装它
依赖: python3 (>= 3.12~) 但无法安装它
python3-cffi-backend : 依赖: python3 (< 3.13) 但无法安装它
依赖: python3 (>= 3.12~) 但无法安装它
python3-cryptography : 依赖: python3 (>= 3~) 但无法安装它
python3-dev : 依赖: python3 (= 3.10.6-1~22.04.1) 但无法安装它
依赖: python3.10-dev (>= 3.10.6-1~) 但是它将不会被安装
python3-lxml : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
推荐: python3-bs4 但是它将不会被安装
推荐: python3-html5lib 但是它将不会被安装
python3-matplotlib : 依赖: python3-pil.imagetk 但是它将不会被安装
依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
依赖: python3-fonttools 但是它将不会被安装
依赖: python3-kiwisolver 但是它将不会被安装
推荐: python3-tk 但是它将不会被安装
python3-netifaces : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-numpy : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-opencv : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-pil : 依赖: python3 (< 3.13) 但无法安装它
依赖: python3 (>= 3.12~) 但无法安装它
python3-psutil : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-pykdl : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-pyqt5 : 依赖: python3 (>= 3~) 但无法安装它
python3-pyqt5.qtsvg : 依赖: python3 (>= 3~) 但无法安装它
python3-pyqt5.sip : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-pyside2.qtsvg : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
依赖: python3-pyside2.qtwidgets 但是它将不会被安装
依赖: python3-pyside2.qtgui 但是它将不会被安装
依赖: python3-pyside2.qtcore 但是它将不会被安装
python3-sip : 依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-vtk9 : 依赖: python3-mpi4py 但是它将不会被安装
依赖: python3 (< 3.11) 但无法安装它
依赖: python3 (>= 3.10~) 但无法安装它
python3-yaml : 依赖: python3 (< 3.13) 但无法安装它
依赖: python3 (>= 3.12~) 但无法安装它
python3.10:i386 : 依赖: libpython3.10-stdlib:i386 (= 3.10.12-1~22.04.11) 但无法安装它
python3.10-minimal:i386 : 预依赖: libc6:i386 (>= 2.35) 但无法安装它
依赖: libexpat1:i386 (>= 2.1~beta3) 但无法安装它
qtdeclarative5-dev : 依赖: libqt5qml5 (= 5.15.3+dfsg-1) 但是 5.15.13+dfsg-1ubuntu0.1 正要被安装
依赖: libqt5qmlmodels5 (= 5.15.3+dfsg-1) 但是 5.15.13+dfsg-1ubuntu0.1 正要被安装
依赖: libqt5qmlworkerscript5 (= 5.15.3+dfsg-1) 但是 5.15.13+dfsg-1ubuntu0.1 正要被安装
依赖: libqt5quick5 (= 5.15.3+dfsg-1) 但是 5.15.13+dfsg-1ubuntu0.1 正要被安装 或
libqt5quick5-gles (>= 5.15) 但是它将不会被安装
依赖: libqt5quickparticles5 (= 5.15.3+dfsg-1) 但是它将不会被安装 或
libqt5quickparticles5-gles (>= 5.15) 但是它将不会被安装
依赖: libqt5quickshapes5 (= 5.15.3+dfsg-1) 但是它将不会被安装
依赖: libqt5quicktest5 (= 5.15.3+dfsg-1) 但是它将不会被安装
依赖: libqt5quickwidgets5 (= 5.15.3+dfsg-1) 但是 5.15.13+dfsg-1ubuntu0.1 正要被安装
依赖: qt5-qmltooling-plugins 但是它将不会被安装
依赖: qtdeclarative5-dev-tools
qttools5-dev : 依赖: qttools5-dev-tools (= 5.15.3-1)
ros-humble-demo-nodes-cpp-native : 依赖: ros-humble-fastrtps 但无法安装它
依赖: ros-humble-rmw-fastrtps-cpp 但无法安装它
ros-humble-rviz-ogre-vendor : 依赖: libfreetype6-dev
uuid-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
zlib1g:i386 : 依赖: libc6:i386 (>= 2.4) 但无法安装它
zlib1g-dev : 依赖: libc6-dev 但无法安装它 或
libc-dev
E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。
Run CMD Task:[sudo apt install ros-humble-desktop -y]
[-][0.35s] CMD Result:code:100
链接:https://docs.nav2.org/tutorials/docs/navigation2_with_slam.html
执行如下步骤:
b57754f1-3bd7-408c-95e4-a4a7d32c6c1b-image.png
遇到如下问题:
bee4e1fe-74cf-4042-8eca-7286d00c3f0e-image.png
这条命令是针对turtlebot本体的吗,我看下面是在gazebo的仿真阿,怎么解决这个问题。
求助大佬:本人rm新人,在进行一些ros2的基本知识学习后加入了战队,目前做了几个两三个节点的微项目和修改一些github代码上的参数,现在在战队主要在做上赛季前辈代码的复刻和学习部分。
现在开始阅读一个完整机器人项目的代码,感觉有点无从下手,譬如不太明白各节点发布和订阅的先后关系,再加上部分节点也是借鉴于其他战队和文献,所以在代码阅读理解这方面遇到了一些困难,想请教一下大佬们我现在能做哪些方面的锻炼或者用什么方法能够快速提升我对于这种完整项目的代码理解能力,接下来投入到进一步工作当中
环境:
ROS2 Humble + Moveit2 + Python3.10
尝试在Python程序中通过Moveit2控制2个机械臂的路径规划,但没有成功,代码如下:
... self.cr3_arm_group: PlanningComponent = self.robot.get_planning_component("cr3_arm") self.nova2_arm_group: PlanningComponent = self.robot.get_planning_component("nova2_arm") self.dual_arm_group: PlanningComponent = self.robot.get_planning_component("dual_arm") ... cr3_pose_goal = PoseStamped() cr3_pose_goal.header.frame_id = "base_link" cr3_pose_goal.pose.position.x = -0.299975 cr3_pose_goal.pose.position.y = -0.50000693 cr3_pose_goal.pose.position.z = 0.069975 cr3_pose_goal.pose.orientation.w = 0.0 cr3_pose_goal.pose.orientation.x = 0.0 cr3_pose_goal.pose.orientation.y = 1.0 cr3_pose_goal.pose.orientation.z = 0.0 nova2_pose_goal = PoseStamped() nova2_pose_goal.header.frame_id = "nova2_base_link" nova2_pose_goal.pose.position.x = 0.30004 nova2_pose_goal.pose.position.y = -0.49997307 nova2_pose_goal.pose.position.z = 0.070025 nova2_pose_goal.pose.orientation.w = 0.0 nova2_pose_goal.pose.orientation.x = 0.0 nova2_pose_goal.pose.orientation.y = 1.0 nova2_pose_goal.pose.orientation.z = 0.0 self.dual_arm_group.set_start_state_to_current_state() self.dual_arm_group.set_goal_state(pose_stamped_msg=cr3_pose_goal, pose_link="Link6") self.dual_arm_group.set_goal_state(pose_stamped_msg=nova2_pose_goal, pose_link="nova2_Link6") plan_result = self.plan(self.dual_arm_group)结果显示还是只规划了一个机械臂
bef043d9-28ed-45c9-8f66-26a065eea3f1-PixPin_2025-11-22_09-13-03.png
发现Python版有很多api调用不了
求教在Python代码中通过什么方式可以控制双机械臂同时规划?
版块
-
1.4k
主题5.1k
帖子 -
471
主题3.1k
帖子 -
69
主题264
帖子 -
1.1k
主题4.5k
帖子 -
1.0k
主题3.8k
帖子 -
5
主题11
帖子 -
365
主题1.7k
帖子