2023年1月12日 星期四

for ROS2 同一個 package 即要有cpp的node,又想加入python node,如何定義這樣的package?

 聰明的你一定是那句:「摻在一起做成撒尿牛丸啊,笨蛋」,沒錯,這次我們就是要混在一起做成撒尿牛丸package ,
放心,這需求不是今天才出現的,有時網路上找到的lib是cpp或是python ,而又不想各別定義成不同的package,就會需要樣的應用了( 當然你也可以用ctypes來解決 python call c's dll/so ,
只是既然可以用ros2的 topic機制就直接用它比較省事)
參考這兩位大德的解說文: Create a ROS2 package for Both Python and Cpp Nodes 
 
摘要一兩個重點,以供日後回來快速查閱
一.在create package時,請先以「ros2 pkg create  想要的套件名稱  --build-type ament_cmake」指定是要以cpp 為主的package 建置方式,因為日後python要用的setup.py會用不到,重心會放在CMakeLists.txt及pacakge .

假設路徑圖如下:
-------------------------------
my_cpp_py_pkg/
# --> package info, configuration, and compilation
├── CMakeLists.txt
├── package.xml
# --> Python stuff
├── my_cpp_py_pkg
│ ├── __init__.py
│ └── module_to_import.py
├── scripts
│ └── py_node.py
# --> Cpp stuff
├── include
│ └── my_cpp_py_pkg
│ └── cpp_header.hpp
└── src
└── cpp_node.cpp
-------------------------------
CMakeLists.txt方面 
要安裝python node的路徑,就是直接寫做
-----------------
install(PROGRAMS
scripts/py_node.py 
DESTINATION lib/${PROJECT_NAME}
)
-----------------------------
二.「#!/usr/bin/env python3」 -- python node方面,以往是不必在python node的最前面加上做編輯器指定,現在用這種混搭方式就要在py檔的第一行做編輯器指定
三 python node裡要import的話,就上面的路徑而言,是
「from  my_cpp_py_pkg. module_to_import import blablalba」
(不必在CMakeLists.txt裡指定,非常方便)

其他細節就請自己慢慢看上述兩篇引用的網誌了 
(應該沒有IT像我這樣在下班後還在玩ROS的吧....)

2023年1月8日 星期日

ROS2 colcon build遇到的問題 (distro:foxy on ubuntu 20.04)

Q1.錯誤訊息「undefined reference to `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::Imu_<std::allocator<void> > >()' collect2: error: ld returned 1 exit status」

sol:請檢查 CMakeLists.txt 的ament_target_dependencies 及 c_cpp_properties.json includePath 及  package.xml 的 depend  ,套件/路徑有沒有加入(以上述的訊息,是「sensor_msgs」套件定義漏了)

Q2.錯誤訊息「python3.8/site-packages/setuptools/dist.py:717: UserWarning: Usage of dash-separated 'script-dir' will not be supported in future versions. Please use the underscore name 'script_dir' instead 」

sol:除了要「pip install setuptools==58.2.0」把setuptools降級之外,也要把package裡的「setup.cfg」
的「script-dir」及「install-scripts」改為「script_dst」「install_script」

Q3.For python: 執行node時找不到自己定義的模組(明明colcon build都沒錯!!)

sol:請在setup.py的「data_files」裡加上「('lib/' + package_name, [package_name+'/SimpleOneTrailerSystem.py']),」

如:
---------------------
data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        ('lib/' + package_name, [package_name+'/DC_Motor.py']),
    ],
--------
參考這裡

其他的錯誤,日後遇到再回來update了