diff --git a/docs/Beginner/CMake and Package.md b/docs/Beginner/CMake and Package.md index 95a03ea..0f5e59f 100755 --- a/docs/Beginner/CMake and Package.md +++ b/docs/Beginner/CMake and Package.md @@ -63,46 +63,64 @@ ament_auto_package() CMakeLists.txt - - - #### **ROS2** -```cmake -cmake_minimum_required(VERSION 3.11) -project() +具体参考 [Here](https://docs.ros.org/en/iron/How-To-Guides/Ament-CMake-Documentation.html) -# ======================= COMPILE OPTION ======================= +由于 ament_auto_find_build_dependencies() 命令会根据 package.xml 导入相关的依赖,所以一定得有 package.xml 文件) + +当前的最佳实践是基于 targets 的导入,因此推荐使用 ament_target_dependencies() 命令来替代 target_link_library() 和 include_directory() 命令 + +```cmake +cmake_minimum_required(VERSION 3.8) +project(<工程名>) + +# >>> 通用配置 >>> +# 设置优化等级 +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RELEASE) +endif () +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")) + +# 设置标准 set(CMAKE_CXX_STANDARD 17) -set(CMAKE_BUILD_TYPE RELEASE) + +# 设置编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -# 导入宏包 +# >>> 导入三方包 >>> +find_package(PCL REQUIRED) + +# >>> 导入 ROS 包 >>> find_package(ament_cmake_auto REQUIRED) -# 根据package.xml导入相关的依赖(所以一定得有package.xml) + +# >>> 查找相关的依赖 >>> ament_auto_find_build_dependencies() -# 等价于导入相关的ROS头文件和依赖库 +# >>> 构建目标文件 >>> ament_auto_add_executable( ) +ament_auto_add_library( ) +ament_target_dependencies( Eigen3) -# 导出相关的配置文件和进行安装 -ament_auto_package() - -# 不同于ROS1会在源目录中查找文件,ROS2需要显式安装相关内容到install目录,为更好的维护建议编译时使用关键词--symlink-install +# >>> 导出非配置文件 >>> install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) install(DIRECTORY rviz_cfg DESTINATION share/${PROJECT_NAME}) + +# >>> 导出相关的配置文件和进行安装 >>> +ament_auto_package() ``` #### **ROS1** ```cmake -cmake_minimum_required(VERSION 3.14) -project(工程名) +cmake_minimum_required(VERSION 3.8) +project(<工程名>) # ======================= COMPILE OPTION ======================= set(CMAKE_CXX_STANDARD 17) @@ -118,11 +136,11 @@ find_package(catkin REQUIRED COMPONENTS ) catkin_package( - INCLUDE_DIRS # 导出当前的头文件以被其他ROS包调用 + INCLUDE_DIRS # 导出当前的头文件以被其他ROS包调用 include - LIBRARIES # 导出当前生成的库文件以被其他ROS包调用 + LIBRARIES # 导出当前生成的库文件以被其他ROS包调用 route_handler - CATKIN_DEPENDS # 导出当前的ROS依赖,以被其他ROS包继承 + CATKIN_DEPENDS # 导出当前的ROS依赖,以被其他ROS包继承 roscpp pcl_ros sensor_msgs @@ -142,6 +160,8 @@ target_link_libraries(route_handler ${catkin_LIBRARIES}) + + ## Package.xml
diff --git a/docs/Beginner/Interface.md b/docs/Beginner/Interface.md index 3906c08..67335ec 100755 --- a/docs/Beginner/Interface.md +++ b/docs/Beginner/Interface.md @@ -214,8 +214,249 @@ catkin_package( ## Service +
+ :wrench: 用例 1: + 常用命令行 + + +```bash +# >>> 调用服务 >>> +# ros2 service call /clear std_srvs/srv/Empty +(ros2) ros2 service call [arguments] +``` + +
+ +
+ :wrench: 用例 2: + 初始化服务(客户端、服务端) + + + + +#### **ROS2(C++)** + +ROS2 倾向于使用智能指针 + +```cpp +// >>> 客户端 >>> +rclcpp::Client<包名::srv::服务名>::SharedPtr client_; +client_ = node->create_client(<服务类型>, [rmw_qos_profile_services_default]); + +// >>> 服务端 >>> +rclcpp::Service<包名::srv::服务名>::SharedPtr service_; +service_ = node->create_service<服务类型>(<服务名>, &回调函数); +``` + +#### **ROS1(C++)** + +```cpp +// >>> 客户端 >>> +ros::ServiceClient client_; +client_ = pnh_.serviceClient<服务类型>(<服务名>); + +// >>> 服务端 >>> +ros::ServiceServer service_; +service_ = pnh_.advertiseService(<服务类型>, <回调函数>); +``` + +#### **ROS1(Python)** + +```python +# >>> 客户端 >>> +rospy.wait_for_service('服务名') +service = rospy.ServiceProxy('服务名', 服务类型) + +# >>> 服务端 >>> +rospy.Service('服务名', 服务类型, 回调函数) + + +def onCallback(self, req): + pass +``` + + + +
+ +
+ :wrench: 用例 3: + 等待服务 + + + + +#### **ROS1(C++)** + +```c++ +// 等待 1s +while (!ros::service::waitForService(<服务名>, ros::Duration(1))) { + if (!ros::ok()) { + ROS_ERROR("Interrupted while waiting for service."); + ros::shutdown(); + return; + } + ROS_INFO_STREAM("Waiting for service... [" << module_name << "]"); +} +``` + +#### **ROS2(C++)** + +ROS1 的 wait() 是普通函数,而 ROS2 的是成员函数 + +```c++ +// concise +using std::chrono_literals::operator ""s; +client->wait_for_service(1s) + +// complex +while (!client->wait_for_service(1s)) { + if (!rclcpp::ok()) { + RCLCPP_ERROR(node->get_logger(), "Interrupted while waiting for service."); + rclcpp::shutdown(); + return; + } + RCLCPP_INFO_STREAM(node->get_logger(), "Waiting for service... [" << module_name << "]"); +} +``` + +#### **ROS1(Python)** + +不能仿效 C++的形式,尽管可以指定 timeout,但它是直接抛出异常 ROSException,而非返回 true/false + +```python + +import rospy + +rospy.init_node( < 节点名 >) +rospy.wait_for_service( < 服务名 >) +``` + + + +#### **ROS2(Python)** + +```python +while not self.cli.wait_for_service(timeout_sec=1.0): + if not rclpy.is_shutdown(): + node.get_logger().error("Interrupted while waiting for service.") + rclpy.shutdown() + return + node.get_logger().info("Waiting for service... [{}]".format(module_name)) +``` + +
+ +
+ :wrench: 用例 4: + 回调函数 + + +| — | ROS1 | ROS2 | +|:---:|:----------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:| +| 返回值 | `bool` | `void` | +| 形参 | 引用(无 const,无指针) | const + 智能指针 | +| 示例 | bool on_clear_route(
ClearRoute::Service::Request &req,
ClearRoute::Service::Response &res); | void on_clear_route(
const ClearRoute::Service::Request::SharedPtr req,
const ClearRoute::Service::Response::SharedPtr res); | + + + +#### **ROS1(C++)** + +```cpp +// 类成员函数(无模板参数) +srv_auto_mode_ = pnh->advertiseService("服务名", &RTCInterface::onAutoModeService, this); +bool onAutoModeService(AutoMode::Request &request, AutoMode::Response &response); +``` + +#### **ROS2(C++)** + +```c++ +#include + +void callback(const std::shared_ptr<包名::srv::服务类型::Request> request, + std::shared_ptr<包名::srv::服务类型::Response> response) +{ + response->sum = request->a + request->b; +} + +rclcpp::Service<包名::srv::服务类型>::SharedPtr service = + node->create_service<包名::srv::服务类型>("服务名", &callback); +``` + +#### **ROS1(Python)** + TODO +#### **ROS2(Python)** + +```python +self.srv = self.create_service( < 服务类型 >, < 服务名 >, self.callback) + +def callback(self, request, response): + return response +``` + + + +
+ +
+ :wrench: 用例 5: + 调用服务 + + + + +#### **ROS1(C++)** + +`call()` 函数只能接受左值 + +```cpp +# 步骤一:实例化请求 +请求类 srv; +# 步骤二:触发请求 +if (client.call(srv)) { + ROS_INFO("Sum: %ld", (long int)srv.response.sum); +} +else { + ROS_ERROR("Failed to call service add_two_ints"); + return 1; +} +``` + +#### **ROS2(C++)** + +C++中`ROS1`的服务是同步的,而`ROS2`的则为异步 + +```cpp +# 步骤一:实例化请求 +auto request = std::make_shared<包名::srv::服务类型::Request>(); +// TODO +# 步骤二:异步触发请求 +client->async_send_request(request); +auto result = client->async_send_request(request); + +// Wait for the result. +if (rclcpp::spin_until_future_complete(node, result) == + rclcpp::FutureReturnCode::SUCCESS){ + RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "..."); +} else { + RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service [服务名]"); +} +``` + +#### **ROS1(Python)** + +TODO + +#### **ROS2(Python)** + +TODO + + + +
+ ## Action TODO @@ -281,3 +522,8 @@ rosidl_generator_traits::data_type - [Autoware.Universe name guidelines](https://autowarefoundation.github.io/autoware-documentation/main/contributing/coding-guidelines/ros-nodes/message-guidelines/) - [Autowarw adapting-message-definitions](https://github.com/tier4/AutowareArchitectureProposal.proj/blob/main/docs/developer_guide/knowhow/PortingToROS2.md#adapting-message-definitions) +## Service + +- Official C++ demo:[ROS1](http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29), [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Service-And-Client.html) +- Official Python demo:[ROS1](http://wiki.ros.org/rospy/Overview/Services), [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Service-And-Client.html) +- [Services between ROS1 and ROS2](https://roboticsbackend.com/ros1-vs-ros2-practical-overview/) \ No newline at end of file diff --git a/docs/Beginner/Paramter Server.md b/docs/Beginner/Parameter Server.md similarity index 100% rename from docs/Beginner/Paramter Server.md rename to docs/Beginner/Parameter Server.md diff --git a/docs/Beginner/Publisher and Subscriber.md b/docs/Beginner/Publisher and Subscriber.md index 24d674c..6bfcbe7 100755 --- a/docs/Beginner/Publisher and Subscriber.md +++ b/docs/Beginner/Publisher and Subscriber.md @@ -277,7 +277,7 @@ int main(int argc, char** argv) ## Reference -- Official demo: [ROS1](http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29), [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html) -- Topic statistics: [ROS1](https://wiki.ros.org/Topics#Topic_statistics), [ROS2](https://docs.ros.org/en/humble/Concepts/About-Topic-Statistics.html) -- Sync demo: [ROS1](http://wiki.ros.org/message_filters) +- Official demo for [ROS1](http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29) and [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html) +- Topic statistics for [ROS1](https://wiki.ros.org/Topics#Topic_statistics) and [ROS2](https://docs.ros.org/en/humble/Concepts/About-Topic-Statistics.html) +- Sync demo for [ROS1](http://wiki.ros.org/message_filters) diff --git a/docs/Beginner/Service.md b/docs/Beginner/Service.md deleted file mode 100644 index 055bd6d..0000000 --- a/docs/Beginner/Service.md +++ /dev/null @@ -1,218 +0,0 @@ -# Service - -## CLI - -- 调用服务 - -```bash -# ros2 service call /clear std_srvs/srv/Empty -(ros2) ros2 service call [arguments] -``` - -## API - -## Constructor - -`ROS2`倾向于使用智能指针 - -### ROS1 - -- C++ - -```cpp -// 客户端 -ros::ServiceClient client_; -client_ = pnh_.serviceClient<包名::服务名>(<服务名>); - -// 服务端 -ros::ServiceServer service_; -service_ = pnh_.advertiseService(<服务名>, <回调函数>); -``` - -- Python - -```python -# 客户端 -rospy.wait_for_service('服务名') -service = rospy.ServiceProxy('服务名', 服务类型) - -# 服务端 -rospy.Service('服务名', 服务类型, 回调函数) - - -def self. - - - onCallback(self, req): -# TODO -``` - -### ROS2 - -- C++ - -```c++ -// 客户端 -rclcpp::Client<包名::srv::服务名>::SharedPtr client; -client = node->create_client(<服务名>, [rmw_qos_profile_services_default]); - -// 服务端 -rclcpp::Service<包名::srv::服务名>::SharedPtr service; -service = node->create_service<包名::srv::服务名>(<服务名>, &回调函数); -``` - -## Wait - -### ROS1 - -- C++ - -```c++ -// 等待 1s -while (!ros::service::waitForService(<服务名>, ros::Duration(1))) { - if (!ros::ok()) { - ROS_ERROR("Interrupted while waiting for service."); - ros::shutdown(); - return; - } - ROS_INFO_STREAM("Waiting for service... [" << module_name << "]"); -} -``` - -- Python - -```python -# 不能仿效 C++的形式,尽管可以指定 timeout,但它是直接抛出异常 ROSException,而非返回 true/false - -import rospy - -rospy.init_node( < 节点名 >) -rospy.wait_for_service( < 服务名 >) -``` - -### ROS2 - -`ROS1`的`wait`是普通函数,而`ROS2`的是成员函数 - -- C++ - -```c++ -// concise -using std::chrono_literals::operator ""s; -client->wait_for_service(1s) - -// complex -while (!client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(node->get_logger(), "Interrupted while waiting for service."); - rclcpp::shutdown(); - return; - } - RCLCPP_INFO_STREAM(node->get_logger(), "Waiting for service... [" << module_name << "]"); -} -``` - -- Python - -```python -while not self.cli.wait_for_service(timeout_sec=1.0): - if not rclpy.is_shutdown(): - node.get_logger().error("Interrupted while waiting for service.") - rclpy.shutdown() - return - node.get_logger().info("Waiting for service... [{}]".format(module_name)) -``` - -## Callback - -| — | ROS1 | ROS2 | -|:---:|:----------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:| -| 返回值 | `bool` | `void` | -| 形参 | 引用(无 const,无指针) | const + 智能指针 | -| 示例 | bool on_clear_route(
ClearRoute::Service::Request &req,
ClearRoute::Service::Response &res); | void on_clear_route(
const ClearRoute::Service::Request::SharedPtr req,
const ClearRoute::Service::Response::SharedPtr res); | - -### ROS1 - -```cpp -// 类成员函数(无模板参数) -srv_auto_mode_ = pnh->advertiseService("服务名", &RTCInterface::onAutoModeService, this); -bool onAutoModeService(AutoMode::Request &request, AutoMode::Response &response); -``` - -### ROS2 - -- C++(无返回值) - -```c++ -#include - -void callback(const std::shared_ptr<包名::srv::服务类型::Request> request, - std::shared_ptr<包名::srv::服务类型::Response> response) -{ - response->sum = request->a + request->b; -} - -rclcpp::Service<包名::srv::服务类型>::SharedPtr service = - node->create_service<包名::srv::服务类型>("服务名", &callback); -``` - -- Python - -```python -self.srv = self.create_service( < 服务类型 >, < 服务名 >, self.callback) - -def callback(self, request, response): - return response -``` - -## Call - -### ROS1 - -- C++ - -```cpp -# 步骤一:实例化请求 -请求类 srv; -# 步骤二:触发请求 -if (client.call(srv)) { - ROS_INFO("Sum: %ld", (long int)srv.response.sum); -} -else { - ROS_ERROR("Failed to call service add_two_ints"); - return 1; -} -``` - -```ad-attention -`call`函数只能接受左值 -``` - -### ROS2 - -C++中`ROS1`的服务是同步的,而`ROS2`的则为异步 - -- C++ - -```cpp -# 步骤一:实例化请求 -auto request = std::make_shared<包名::srv::服务类型::Request>(); -// TODO -# 步骤二:异步触发请求 -client->async_send_request(request); -auto result = client->async_send_request(request); - -// Wait for the result. -if (rclcpp::spin_until_future_complete(node, result) == - rclcpp::FutureReturnCode::SUCCESS){ - RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "..."); -} else { - RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service [服务名]"); -} -``` - -## Reference - -- Official C++ demo:[ROS1](http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29), [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Service-And-Client.html) -- Official Python demo:[ROS1](http://wiki.ros.org/rospy/Overview/Services), [ROS2](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Service-And-Client.html) -- [Services between ROS1 and ROS2](https://roboticsbackend.com/ros1-vs-ros2-practical-overview/) \ No newline at end of file diff --git a/docs/Beginner/rosbag.md b/docs/Beginner/rosbag.md index 098a93a..4c37e02 100755 --- a/docs/Beginner/rosbag.md +++ b/docs/Beginner/rosbag.md @@ -33,6 +33,7 @@ ``` - `ROS1`和`ROS2`包的相互转换,一种方案是使用[rosbags](https://gitlab.com/ternaris/rosbags)提供的 API;另一种方案是基于`ros_bridge`,通过回放`ROS2`包,录制`ROS1`包 + ```bash $ pip3 install rosbags @@ -41,9 +42,9 @@ $ rosbags-convert --dst $ rosbags-convert --dst ``` -```ad-note -暂不支持`ROS2`自定义消息类型->`ROS1`自定义消息类型的转换 -``` +> [!note] +> +> 暂不支持`ROS2`自定义消息类型->`ROS1`自定义消息类型的转换 ## Code @@ -55,35 +56,36 @@ $ rosbags-convert --dst import rosbag from tqdm import tqdm + class Converter: def __init__(self): pass def write(self): - output_bag = rosbag.Bag(<包名>, 'w') - input_bag = rosbag.Bag(<包名>, 'r') + output_bag = rosbag.Bag( < 包名 >, 'w') + input_bag = rosbag.Bag( < 包名 >, 'r') for topic, msg, t in tqdm(input_bag.read_messages(), total=input_bag.get_message_count()): - output_bag.write(<主题名>, <主题数据>, t) - - input_bag.close() - output_bag.close() + output_bag.write( < 主题名 >, < 主题数据 >, t) + input_bag.close() + output_bag.close() -if __name__ == '__main__': - converter = Converter() - converter.write() + if __name__ == '__main__': + converter = Converter() + converter.write() ``` -```ad-attention -注意`read_message`读取的时间戳是`rosbag`获取信息时候的时间戳,而不是传感器发布数据时的时间戳 -``` +> [!attention] +> +> 注意`read_message`读取的时间戳是`rosbag`获取信息时候的时间戳,而不是传感器发布数据时的时间戳 - 增加 TF,相关主题固定为`/tf` ```python from tf2_msgs.msg import TFMessage + def set_transform(header, frame_id, child_frame_id, x, y, z, q): gnss_transform = TransformStamped() gnss_transform.header.stamp = header.stamp @@ -97,7 +99,8 @@ def set_transform(header, frame_id, child_frame_id, x, y, z, q): gnss_transform.transform.rotation.z = q[2] gnss_transform.transform.rotation.w = q[3] return gnss_transform - + + tf_msg = TFMessage() neu_to_imu = set_transform(msg.header, "map", "imu", local_x, local_y, 0, q) tf_msg.transforms.append(neu_to_imu) @@ -107,8 +110,8 @@ output_bag.write("/tf", tf_msg, msg.header.stamp) ## Tool -| repository | description | -| :--------------------------------------------: | :---------------: | +| repository | description | +|:--------------------------------------------:|:-----------------:| | [rqt_bag](http://wiki.ros.org/rqt_bag)(ROS1) | rosbag GUI viewer | ## Reference diff --git a/docs/Software and Tools/RViz.md b/docs/Software and Tools/RViz.md index a298e63..74552cb 100755 --- a/docs/Software and Tools/RViz.md +++ b/docs/Software and Tools/RViz.md @@ -145,6 +145,8 @@ ros::NodeHandle nh; RViz 的插件类型包括:Display, Panel, Tool, View Controller,开发时具体参考 [Here](https://github.com/ros2/rviz/blob/rolling/docs/plugin_development.md) +其中 Display 一般用于显示(如渲染点云、文本、线条),Panel 一般用于控制,Tool 一般用于交互(键鼠交互) + ### Display
@@ -473,7 +475,13 @@ TODO ```cpp -RCLCPP_INFO(rclcpp::get_logger("rviz2"), "%s", msg.c_str()); +// 不会输出到 /rosout +RVIZ_COMMON_LOG_INFO("Hello, world!"); +RVIZ_COMMON_LOG_INFO_STREAM("Hello" << "world!"); + +// 会发布到 /rosout +// 其中的节点为 rviz 而非 rviz2 +RCLCPP_INFO(rclcpp::get_logger("rviz"), "clicked: (%d, %d)", event.x, event.y); ```
diff --git a/docs/Software and Tools/Tool.md b/docs/Software and Tools/Tool.md deleted file mode 100644 index da05db3..0000000 --- a/docs/Software and Tools/Tool.md +++ /dev/null @@ -1,19 +0,0 @@ -## Monitor - -| 仓库名 | 描述 | | -|:-----------------------------------------------------------------------:|:----------------------------------------------:|------| -| [rtui](https://github.com/eduidl/rtui) | TUI for ROS | | -| [ros2-migration-tools](https://github.com/awslabs/ros2-migration-tools) | Tools for migrating packages from ROS1 to ROS2 | | - -## Image publisher - -- 将一张图片进行发布 - -```bash -# 重映射主题名 -(ros1) $ rosrun image_publisher image_publisher img.jpeg __name:= __ns:= image_raw:=/sensing/camera0/image_raw -``` - -## [diagnostic updater](http://wiki.ros.org/action/fullsearch/diagnostic_updater?action=fullsearch&context=180&value=linkto%3A"diagnostic_updater") - -记录传感器的状态和发布状态信息的节点,比较少用,相关示例代码如下:ROS1 [Python](https://docs.ros.org/en/api/diagnostic_updater/html/example_8py_source.html), [C++](https://docs.ros.org/en/api/diagnostic_updater/html/example_8cpp_source.html) diff --git a/docs/Software and Tools/Tools.md b/docs/Software and Tools/Tools.md new file mode 100644 index 0000000..29576f8 --- /dev/null +++ b/docs/Software and Tools/Tools.md @@ -0,0 +1,36 @@ +# Tools + +
+ :wrench: 工具 1: + TUI for ROS + +
+ +
+ :wrench: 工具 2: + Tools for migrating packages from ROS1 to ROS2 + +
+ +
+ :wrench: 工具 3: + Image publisher + + +```bash +# 重映射主题名 +(ros1) $ rosrun image_publisher image_publisher img.jpeg __name:= __ns:= image_raw:=/sensing/camera0/image_raw +``` + +
+ +
+ :wrench: 工具 4: + PlotJuggler + + +```bash +$ sudo apt install ros-$ROS_DISTRO-plotjuggler-ros +``` + +
\ No newline at end of file diff --git a/docs/_media/android-chrome-192x192.png b/docs/_media/android-chrome-192x192.png new file mode 100644 index 0000000..11ab07f Binary files /dev/null and b/docs/_media/android-chrome-192x192.png differ diff --git a/docs/_media/android-chrome-512x512.png b/docs/_media/android-chrome-512x512.png new file mode 100644 index 0000000..1154296 Binary files /dev/null and b/docs/_media/android-chrome-512x512.png differ diff --git a/docs/_media/apple-touch-icon.png b/docs/_media/apple-touch-icon.png new file mode 100644 index 0000000..dde3c68 Binary files /dev/null and b/docs/_media/apple-touch-icon.png differ diff --git a/docs/_media/favicon-16x16.png b/docs/_media/favicon-16x16.png new file mode 100644 index 0000000..4b95842 Binary files /dev/null and b/docs/_media/favicon-16x16.png differ diff --git a/docs/_media/favicon-32x32.png b/docs/_media/favicon-32x32.png new file mode 100644 index 0000000..d4f0106 Binary files /dev/null and b/docs/_media/favicon-32x32.png differ diff --git a/docs/_media/site.webmanifest b/docs/_media/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/docs/_media/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 88502aa..6ef68f4 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,17 +1,17 @@ - [Home](/) - Beginner - - [Build Tool](Beginner/Build%20Tool.md) - - [CMake and Package](Beginner/CMake%20and%20Package.md) + - [Build Tool](Beginner/Build%20Tool.md):How to use Catkin, Colcon... + - [CMake and Package](Beginner/CMake%20and%20Package.md):How to write CMake and Package.xml - [Exectuor and Callback](Beginner/Exectuor%20and%20Callback.md) - [Header and Module](Beginner/Header%20and%20Module.md) - - [Install](Beginner/Install.md) - - [Interface](Beginner/Interface.md) + - [Install](Beginner/Install.md):How to install ROS and ROS packages + - [Interface](Beginner/Interface.md):How to use ROS interface (e.g. msg, srv, action) - [Launch](Beginner/Launch.md) - [Logger](Beginner/Logger.md) - [Network](Beginner/Network.md) - [Node and Component](Beginner/Node%20and%20Component.md) - - [Paramter Server](Beginner/Paramter%20Server.md) + - [Parameter Server](Beginner/Parameter%20Server.md) - [Publisher and Subscriber](Beginner/Publisher%20and%20Subscriber.md) - [rosbag](Beginner/rosbag.md) - [Service](Beginner/Service.md) @@ -19,7 +19,7 @@ - [Time](Beginner/Time.md) - Intermediate - - [Assertion and Exception](Assertion%20and%20Exception.md) + - [Assertion and Exception](Intermediate/Assertion%20and%20Exception.md) - [DDS](Intermediate/DDS.md) - [Deployment](Intermediate/Deployment.md) - [Plugins](Intermediate/Plugins.md) diff --git a/docs/index.html b/docs/index.html index 0d9cc30..1311aaa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,7 +10,10 @@ - + + + + @@ -76,7 +79,7 @@ crossChapterText: true, }, plugins: [ - EditOnGithubPlugin.create("https://github.com/Natsu-Akatsuki/ros_cookbook/tree/main/docs/", "", "Edit on GitHub") + EditOnGithubPlugin.create("https://github.com/Natsu-Akatsuki", "", "Edit on GitHub") ], }