From c2f3c808f96fff357a579169fa6bfcf94e4c78f8 Mon Sep 17 00:00:00 2001 From: Roni Kreinin Date: Thu, 6 Jul 2023 14:17:53 -0400 Subject: [PATCH 1/5] Networking documentation --- docs/ros/installation/img/wifi_interface.jpg | Bin 0 -> 99178 bytes docs/ros/installation/robot.mdx | 67 +++++++++++++++++- docs/ros/networking/computer_setup.mdx | 40 +++++++++++ docs/ros/networking/ntp.mdx | 53 -------------- .../{networking.mdx => overview.mdx} | 13 +--- 5 files changed, 107 insertions(+), 66 deletions(-) create mode 100644 docs/ros/installation/img/wifi_interface.jpg create mode 100644 docs/ros/networking/computer_setup.mdx rename docs/ros/networking/{networking.mdx => overview.mdx} (76%) diff --git a/docs/ros/installation/img/wifi_interface.jpg b/docs/ros/installation/img/wifi_interface.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c65f839747566cd3a3c4c67283ebbc17398b43f9 GIT binary patch literal 99178 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 +

+ +
+ + +Next, create the file `/etc/netplan/60-wireless.yaml`, and paste the following contents: + +``` +network: + wifis: + # Replace WIRELESS_INTERFACE with the name of the wireless network device, e.g. wlan0 or wlp3s0 + # Fill in the SSID and PASSWORD fields as appropriate. The password may be included as plain-text + # or as a password hash. To generate the hashed password, run + # echo -n 'WIFI_PASSWORD' | iconv -t UTF-16LE | openssl md4 -binary | xxd -p + # If you have multiple wireless cards you may include a block for each device. + # For more options, see https://netplan.io/reference/ + WIRELESS_INTERFACE: + optional: true + access-points: + SSID_GOES_HERE: + password: PASSWORD_GOES_HERE + dhcp4: true + dhcp4-overrides: + send-hostname: true +``` + +Replace `WIRELESS_INTERFACE` with the name of your Wi-Fi interface, `SSID_GOES_HERE` with your Wi-Fi SSID, and `PASSWORD_GOES_HERE` with your Wi-Fi password. + +Save the file and call `sudo netplan apply` to apply the changes. Check `ip a` again to make sure that an IP address has been assigned to your Wi-Fi interface. + +#### Ethernet + +The robot's computer can also be connected to a dhcp network over ethernet. Connect an ethernet cable to the built-in ethernet port on the robot's computer and check that an IP has been assigned with `ip a`. ### ROS 2 Humble @@ -46,6 +105,10 @@ sudo sh -c 'echo "deb https://packages.clearpathrobotics.com/stable/ubuntu $(lsb sudo apt-get update ``` +### Network Configuration + +Once the Clearpath package server is set up, follow the [Clearpath Computer Setup](../networking/computer_setup.mdx) instructions to configure the network interfaces. + ### Clearpath Robot metapackage Once the Clearpath package server has been added, the [Clearpath Robot](https://github.com/clearpathrobotics/clearpath_robot) metapackage can be installed. diff --git a/docs/ros/networking/computer_setup.mdx b/docs/ros/networking/computer_setup.mdx new file mode 100644 index 000000000..c0f04a432 --- /dev/null +++ b/docs/ros/networking/computer_setup.mdx @@ -0,0 +1,40 @@ +--- +title: Clearpath Computer Setup +sidebar_position: 2 +--- + +The `clearpath_computer_setup` package offers a terminal menu tool for configuring a robot computer. The main feature of this tool is the ability to generate +`netplan` configurations. The `clearpath_comptuer_setup` package is available on the [Clearpath package server](../installation/robot.mdx#clearpath-package-server). + +It should be installed on the robot's computer: + +``` +sudo apt install python3-clearpath-computer-setup +``` + +To run the tool, call: + +``` +sudo clearpath-computer-setup +``` + +### Standard Clearpath Bridge + +The default networking configuration for a robot's computer is to bridge all ethernet interfaces and assign the computer the IP address `192.168.131.1`. See [Network IP Addresses](./network_ip_addresses.mdx) for a detailed list of IP ranges. + +To configure the default bridge, run `clearpath-computer-setup` and navigate to **Netplan Setup** -> **Pre-set Configurations**. Select **Standard Clearpath Bridge** and generate the configuration by following the instructions. Then, return to the **Netplan Setup** menu and select **Apply Configuration Changes**. +This will create a `/etc/netplan/50-clearpath-standard.yaml` file and apply the changes to `netplan`. + +Once the network settings have been applied, call `ip a` to check that the network bridge has been created, and that the computer has been assigned the `192.168.131.1` IP address. + +### Custom Networking + +The `clearpath-computer-setup` tool can also be used to set up custom network interfaces. Navigate to the **Netplan Setup** menu and use the bridge, ethernet, or Wi-Fi setup menus to add configurations. Once you are done configuring, return to the **Netplan Setup** menu and select **Write Configuration YAML**. You will be prompted for a file name. The file should be placed under `/etc/netplan/` to take effect, and the naming convention is a two digit number followed by a unique name. For example, `/etc/netplan/50-home-wifi.yaml`. + +:::note + +Netplan will read files under `/etc/netplan/` in alphanumeric order. Files beginning in `01` will be read first, and `99` will be read last. +If two files define the same configuration, the configuration read last will be used. Otherwise, netplan will amalgamate all files under `/etc/netplan/` to create the netplan configuration. + +::: + diff --git a/docs/ros/networking/ntp.mdx b/docs/ros/networking/ntp.mdx index 3fcf1f55d..6918d9b10 100644 --- a/docs/ros/networking/ntp.mdx +++ b/docs/ros/networking/ntp.mdx @@ -120,56 +120,3 @@ rtcsync makestep 1 3 ``` -### Work-around for no RTC - -Most computers have a realtme clock (RTC) that keeps time while the computer is otherwise powered-off. This clock has -a replaceable battery, referred to either as the RTC backup battery or CMOS battery. If you are using a computer that -does not have an RTC backup battery, or does not have a RTC at all, you may see unusual behaviour. Typically the -clock will reset to a default date (often January 1, 1970) when the computer loses power. The clock will then jump -ahead to the present as soon as a connection with an NTP server is established. - -Under most circumstances this is fine, but some ROS nodes will behave incorrectly if the clock suddenly jumps ahead by -50+ years. To mitigate this, if you are configuring a computer that does not have a reliable RTC, modify the file -`/lib/systemd/system/ros.service` to add an `ExecStartPre` command to the service: - -``` -[Service] -ExecStart=/usr/sbin/ros-start -ExecStartPre=/usr/sbin/ros-wait-clock -``` - -Then create the file `/usr/sbin/ros-wait-clock` by running - -``` -sudo nano /usr/sbin/ros-wait-clock -``` - -and entering the following: - -```bash -#!/bin/bash - -hw_time="$(hwclock -r -f /dev/rtc1)" - -# wait at most 15s -for i in {1..15}; -do - if [[ "$hw_time" == 19* ]]; - then - echo "HW clock says it's ${hw_time}. Waiting for clock-sync..." - sleep 1 - hw_time="$(hwclock -r -f /dev/rtc1)" - else - echo "HW clock says it's now ${hw_time}. Clock appears synchronized with reality" - exit 0 - fi -done - -echo "Wait for clock sync timed out. Moving ahead with possibly bad clock." -``` - -Save the file, close the editor, and make the file executable by running - -``` -sudo chmod +x /usr/sbin/ros-wait-clock -``` diff --git a/docs/ros/networking/networking.mdx b/docs/ros/networking/overview.mdx similarity index 76% rename from docs/ros/networking/networking.mdx rename to docs/ros/networking/overview.mdx index adc6ca62e..1efe52e10 100644 --- a/docs/ros/networking/networking.mdx +++ b/docs/ros/networking/overview.mdx @@ -1,19 +1,10 @@ --- -title: Networking -sidebar_position: 3 +title: Overview +sidebar_position: 1 --- :::note -For details on setting up wired and wireless networking connections to your Clearpath -robot, refer to the robot-specific tutorials, such as the -[Husky ROS1 tutorial](../../robots/outdoor_robots/husky/tutorials_husky/tutorials_husky_ros1#husky-networking) or the -[Husky ROS2 tutorial](../../robots/outdoor_robots/husky/tutorials_husky/tutorials_husky_ros2#husky-networking). - -::: - -:::note - Contact our Support team at support@clearpathrobotics.com if you have any questions. ::: From a4bdb0eec5acb5539dc412a90a6762f2672e2eec Mon Sep 17 00:00:00 2001 From: Roni Kreinin Date: Thu, 6 Jul 2023 14:44:13 -0400 Subject: [PATCH 2/5] Sensor links Throw on broken links --- docs/ros/ros.mdx | 26 +++++++++++++++++++------- docusaurus.config.js | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/ros/ros.mdx b/docs/ros/ros.mdx index c417395d5..b2174ec4f 100644 --- a/docs/ros/ros.mdx +++ b/docs/ros/ros.mdx @@ -85,6 +85,13 @@ by Clearpath which are used by all supported Clearpath platforms. ## Supported Sensors {#supported-sensors} +:::note + +While some sensor drivers may support other sensor models, the table below represents the +sensors that have been validated by Clearpath. + +::: + @@ -94,45 +101,50 @@ by Clearpath which are used by all supported Clearpath platforms. - + - + - + - + - + - + +
Sensor
Hokuyo UST10Hokuyo UST10-LX 2D Lidar Source or Debian urg_node
Intel Realsense D435(i)Intel Realsense D435 Depth Camera Source or Debian realsense-ros
MicroStrain GX5MicroStrain 3DM-GX5 IMU Source or Debian microstrain_intertial
Sick LMS1xxSICK LMS-111 2D Lidar Source or Debian LMS1xx
SwiftNav DuroSwift Navigation Duro GPS Source duro_gps_driver
Velodyne VLP16Velodyne Puck 3D Lidar Source or Debian velodyne
+ +:::note + +Debian drivers are automatically installed on robots as part of the [Clearpath Robot Metapackage](../ros/installation/robot.mdx#clearpath-robot-metapackage). - \ No newline at end of file +::: \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index 5917d1721..3ad4496cb 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -11,7 +11,7 @@ const config = { title: "Clearpath Robotics Documentation", url: "https://docs.clearpathrobotics.com", baseUrl: "/", - onBrokenLinks: "warn", + onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", favicon: "img/website_images/favicon.ico", From f167c833b76a9d1f25ba8998719b43663f208147 Mon Sep 17 00:00:00 2001 From: Roni Kreinin Date: Thu, 6 Jul 2023 15:00:55 -0400 Subject: [PATCH 3/5] Formatting --- .../accessories/add-ons/stack_light.mdx | 22 +- docs/robots/accessories/add-ons/usb_hub.mdx | 8 +- .../add-ons/wireless_stop_system.mdx | 8 +- .../manipulators/kinova_gen3_lite.mdx | 6 +- docs/robots/accessories/pacs.mdx | 110 +++++----- .../sensors/gps/garmin_gps_18x.mdx | 28 +-- .../sensors/gps/swift_navigation_duro.mdx | 28 +-- .../indoor_robots/dingo/tutorials_dingo.mdx | 14 +- .../integration_husky/integration_husky.mdx | 1 + docs/ros/api/mcu_api.mdx | 3 - docs/ros/api/overview.mdx | 72 ++++--- docs/ros/api/platform_api.mdx | 2 - docs/ros/api/sensors_api.mdx | 46 ++-- docs/ros/config/generators.mdx | 49 +++-- docs/ros/config/services.mdx | 1 - docs/ros/config/yaml.mdx | 1 - docs/ros/installation/controller.mdx | 6 +- docs/ros/installation/remote_pc.mdx | 2 +- docs/ros/installation/robot.mdx | 12 +- docs/ros/networking/computer_setup.mdx | 1 - docs/ros/networking/ntp.mdx | 1 - docs/ros/ros.mdx | 196 ++++++++++-------- docs/ros/tutorials/driving.mdx | 5 +- .../navigation_demos/localization.mdx | 5 +- docs/ros/tutorials/navigation_demos/nav2.mdx | 4 +- .../tutorials/navigation_demos/overview.mdx | 2 +- docs/ros/tutorials/navigation_demos/slam.mdx | 5 +- docs/ros/tutorials/simulator/install.mdx | 1 - docs/ros/tutorials/simulator/overview.mdx | 4 +- docs/ros/tutorials/simulator/simulate.mdx | 3 +- .../DocsVersionDropdownNavbarItem.js | 22 +- 31 files changed, 341 insertions(+), 327 deletions(-) diff --git a/docs/robots/accessories/add-ons/stack_light.mdx b/docs/robots/accessories/add-ons/stack_light.mdx index 8ec360e80..8bc536297 100644 --- a/docs/robots/accessories/add-ons/stack_light.mdx +++ b/docs/robots/accessories/add-ons/stack_light.mdx @@ -12,18 +12,18 @@ sidebar_position: 9
-| Description | CPR Item | -| :------------------------------------------------------- | :------: | +| Description | CPR Item | +| :-------------------------------------------------------------- | :------: | | PACS™ kit, including mounting, controls base, and top cap | 027220 | -| Kit, controls base and top cap | 020711 | -| Mounting adapter | 020710 | -| Light Module, Green | 020714 | -| Light Module, Red | 020715 | -| Light Module, Amber | 020716 | -| Light Module, Blue | 020717 | -| Light Module, White | 020718 | -| Light Module, Yellow | 020719 | -| Light Module, Magenta | 020720 | +| Kit, controls base and top cap | 020711 | +| Mounting adapter | 020710 | +| Light Module, Green | 020714 | +| Light Module, Red | 020715 | +| Light Module, Amber | 020716 | +| Light Module, Blue | 020717 | +| Light Module, White | 020718 | +| Light Module, Yellow | 020719 | +| Light Module, Magenta | 020720 | ## Pinout {#stack_light_pinout} diff --git a/docs/robots/accessories/add-ons/usb_hub.mdx b/docs/robots/accessories/add-ons/usb_hub.mdx index b676a4949..a73fdd493 100644 --- a/docs/robots/accessories/add-ons/usb_hub.mdx +++ b/docs/robots/accessories/add-ons/usb_hub.mdx @@ -5,9 +5,9 @@ sidebar_position: 11 ## Item Numbers -| Description | CPR Item | -| :---------------------------------------- | :------------------------------------------------------: | -| USB 3.0 Hub, 7 port, 9 - 24 VDC | [025440](/assets/pdf/clearpath_robotics_025440-TDS1.pdf) | +| Description | CPR Item | +| :----------------------------------------------- | :------------------------------------------------------: | +| USB 3.0 Hub, 7 port, 9 - 24 VDC | [025440](/assets/pdf/clearpath_robotics_025440-TDS1.pdf) | | USB 3.0 Hub, 7 port, 9 - 24 VDC, PACS™ kit | 027642 | --- @@ -30,7 +30,7 @@ The PACS™ kit for this sensor includes: | ID | Description | CPR item | Quantity | | :-: | :-------------------------------------- | :------------------------------------------------------: | :------: | -| 1 | Kit, Attachment—80 X 80, DIN Rail | [027881](../add-ons/din_rail) | 1 | +| 1 | Kit, Attachment—80 X 80, DIN Rail | [027881](../add-ons/din_rail) | 1 | | 2 | USB Hub—7 Port, USB 3.0 | [025440](/assets/pdf/clearpath_robotics_025440-TDS1.pdf) | 1 | | 3 | Spacer, DIN rail, Locking—35 X 7.5 X 10 | 023649 | 2 | diff --git a/docs/robots/accessories/add-ons/wireless_stop_system.mdx b/docs/robots/accessories/add-ons/wireless_stop_system.mdx index 2fd10b92a..b511cc27e 100644 --- a/docs/robots/accessories/add-ons/wireless_stop_system.mdx +++ b/docs/robots/accessories/add-ons/wireless_stop_system.mdx @@ -15,11 +15,11 @@ sidebar_position: 12 ## Item Numbers -| Description | CPR item | Manufacturer item | -| :-------------------------------- | :------: | :---------------- | -| Kar-Tech | 014663 | 3A4159A | +| Description | CPR item | Manufacturer item | +| :--------------------------------------- | :------: | :---------------- | +| Kar-Tech | 014663 | 3A4159A | | Kar-Tech, PACS™ kit | 027297 | | -| FORT Robotics, Mobility | 025727 | | +| FORT Robotics, Mobility | 025727 | | | FORT Robotics, Mobility, PACS™ kit | 027216 | | --- diff --git a/docs/robots/accessories/manipulators/kinova_gen3_lite.mdx b/docs/robots/accessories/manipulators/kinova_gen3_lite.mdx index 89c82b29a..da3cd0764 100644 --- a/docs/robots/accessories/manipulators/kinova_gen3_lite.mdx +++ b/docs/robots/accessories/manipulators/kinova_gen3_lite.mdx @@ -16,9 +16,9 @@ import TabItem from "@theme/TabItem"; ## Item Numbers -| Description | CPR Item | -| :------------------------- | :------------------------------------------------------: | -| Kinova Gen3 lite Bundle | [022586](/assets/pdf/clearpath_robotics_015822-TDS1.pdf) | +| Description | CPR Item | +| :-------------------------------- | :------------------------------------------------------: | +| Kinova Gen3 lite Bundle | [022586](/assets/pdf/clearpath_robotics_015822-TDS1.pdf) | | Kinova Gen3 lite, PACS™ kit | 027219 | --- diff --git a/docs/robots/accessories/pacs.mdx b/docs/robots/accessories/pacs.mdx index 5c714f39a..9a63babf2 100644 --- a/docs/robots/accessories/pacs.mdx +++ b/docs/robots/accessories/pacs.mdx @@ -69,64 +69,64 @@ Refer to the integration pages for our robots for more details: | Plate—80 X 80, Attachment Interface, Large | [027110](/assets/pdf/clearpath_robotics_027110.pdf) | | Plate—80 X 80, Attachment Interface, Manipulator (UR3 and UR5) | [027269](/assets/pdf/clearpath_robotics_027269.pdf) | | Plate—80 X 80, Attachment Interface | [028866](/assets/pdf/clearpath_robotics_028866.pdf) | -| Screw, Round Head, M5×0.8 | [Many](./components/fasteners/screw_round_head) | +| Screw, Round Head, M5×0.8 | [Many](./components/fasteners/screw_round_head) | ## Sensor and Attachment Kits -| Category | Description | CPR Item | Sales Kit | Installation Kit, With Fasteners | Environment Variables in Clearpath OS? | -| :---------------- | :------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------: | :----------------------------: | :------------------------------: | :------------------------------------: | -| **Accessories** | [DIN Rail](./add-ons/din_rail) | - | 027882 | 027881 | No | -| **Camera** | [Axis F1035-E](./sensors/cameras/axis_f1035_e) | 020068 | 027105 | 027212 | No | -| | [Axis F34](./sensors/cameras/axis_f1035_e) | 020442 | 027634 | 027633 | No | -| | [Axis M5525-E](./sensors/cameras/axis_m5525_e) | 006758 | 027106 | 027225 | No | -| | [FLIR Blackfly S](./sensors/cameras/flir_blackfly_s) | many | 027118 | 027218 | Yes | -| | [FLIR Ladybug5+](./sensors/cameras/flir_ladybug5p) | 017245 | 028894 | 028893 | No | -| | [Intel RealSense D435](./sensors/cameras/realsense_d435) | 024150 | 026869 | 027208 | Yes | -| | [Occam Omni 60 Colour](./sensors/cameras/occam_omni_60) | 019645 | 027102 | 027211 | No | -| | [Stereolabs ZED 2](./sensors/cameras/stereolabs_zed_2) | 023611 | 028960 | 028959 | No | -| | [Stereolabs ZED 2i](./sensors/cameras/stereolabs_zed_2) | 025844 | 026872 | 027210 | No | -| **Computer** | Mini-ITX Indoor | - | 027668 | 027667 | - | -| **GPS** | [Garmin GPS 18x](./sensors/gps/garmin_gps_18x) | 001893 | 028876 | 028875 | No | -| | [Swift Navigation Duro](./sensors/gps/swift_navigation_duro) | 015822 | 027107 | 027213 | No | -| | [Swift Navigation Duro Inertial](./sensors/gps/swift_navigation_duro) | 018151 | 027108 | 027214 | No | -| **IMU** | [Microstrain 3DM-GX5-10](./sensors/imu/microstrain_3dm_gx5) | 017839 | 028963 | 028962 | Yes | -| | [Microstrain 3DM-GX5-15](./sensors/imu/microstrain_3dm_gx5) | 017772 | 027114 | 027215 | Yes | -| | [Microstrain 3DM-GX5-25](./sensors/imu/microstrain_3dm_gx5) | 014603 | 027117 | 027217 | Yes | -| | [Microstrain 3DM-GX5-35](./sensors/imu/microstrain_3dm_gx5) | 028528 | 028964 | 028957 | Yes | -| | [Microstrain 3DM-GX5-45](./sensors/imu/microstrain_3dm_gx5) | 017391 | 028966 | 028965 | Yes | -| | [Redshift Labs UM7](./sensors/imu/redshift_labs_um7) | 011914 | 028881 | 028880 | No | -| **Lidar 2D** | [Hokuyo UST10-LX](./sensors/lidar_2d/hokuyo_ust10_lx) | 011759 | 027207 | 026611 | Yes | -| | [Hokuyo UST10-LX Vertical](./sensors/lidar_2d/hokuyo_ust10_lx) | 011759 | 026966 | 027224 | Yes | -| | [Hokuyo UST20-LX](./sensors/lidar_2d/hokuyo_ust20_lx) | 016359 | 029013 | 029012 | Yes | -| | [Hokuyo UST30-LX](./sensors/lidar_2d/hokuyo_ust30_lx) | 027584 | 029015 | 029014 | Yes | -| | [SICK LMS111](./sensors/lidar_2d/sick_lms111) | 006387 | 027657 | 027656 | Yes | -| **Lidar 3D** | [Velodyne Puck Lite](./sensors/lidar_3d/velodyne_puck_lite) | 016312
023729 | 029027 | 029026 | Yes | -| | [Velodyne Puck](./sensors/lidar_3d/velodyne_puck) | 011703
020972 | 026859 | 027206 | Yes | -| | [Velodyne Puck Vertical](./sensors/lidar_3d/velodyne_puck) | 011703
020972 | 026965 | 027222 | Yes | -| | [Velodyne Ultra Puck](./sensors/lidar_3d/velodyne_ultra_puck) | 016901
029035 | 029037 | 029036 | Yes | -| | [Ouster, OS0](./sensors/lidar_3d/ouster) | 028738
028740 | 028660
028661
028662 | 028850
028851
028852 | No | -| | [Ouster, OS1](./sensors/lidar_3d/ouster) | 028848
028742
028745 | 028663
028664
028665 | 028853
028854
028855 | No | -| | [Ouster, OS2](./sensors/lidar_3d/ouster) | 028849
028747
028749 | 028666
028667
028668 | 028856
028857
028858 | No | -| **Lights** | [Stack Light, Controls Base](./add-ons/stack_light) | 020710
020711
020715
020716
020717
020718
020719
020720 | 027111 | 027220 | No | -| **Manipulator** | [FLIR PTU E46](./manipulators/flir_ptu_e46) | 018807
027246 | 028873 | 028872 | No | -| | [Kinova Gen 3 Lite](./manipulators/kinova_gen3_lite) | 022586 | 026913 | 027219 | No | -| | Universal Robots UR5e Arm | 027264 | 027272 | 027271 | No | -| | Universal Robots UR5e Controls Cabinet | - | 027291
027293 | 027290
027292 | No | -| **Motion-Stop** | [Kar-Tech](./add-ons/wireless_stop_system) | 014663 | 027298 | 027297 | No | -| | [FORT Robotics Joystick](./add-ons/wireless_stop_system) | 025727 | 027112 | 027216 | No | -| **Network** | [Network Access Point, Microhard px2-ENC](./add-ons/network_access_point) | 015329 | 029104 | - | - | -| | [Network Access Point, Microhard BulletPlusAC](./add-ons/network_access_point) | 027795 | 029105 | - | - | -| | [Network Switch, 5 Port](./add-ons/network_switch) | 021044 | 027639 | 027638 | - | -| | [Network Switch, 8 Port](./add-ons/network_switch) | 025333 | 027641 | 027640 | - | -| | [Network Switch, 16 Port](./add-ons/network_switch) | 029098 | - | - | - | -| | [USB Hub, 7 Port](./add-ons/usb_hub) | 025440 | 027643 | 027642 | - | -| **OutdoorNav HW** | [OutdoorNav Starter Kit](../../robots/accessories/add-ons/outdoornav_starter_kit) | - | 028356 | - | - | -| **Power Supply** | [Power Supply, SB-15](./add-ons/power_supplies) | - | 028902 | 028901 | - | -| | [Power Supply, SB-25](./add-ons/power_supplies) | - | 028904 | 028903 | - | -| | [Power Supply, TEP 150](./add-ons/power_supplies) | - | 028942 | 028941 | - | -| **Relay** | [Relay, USB Controlled, 2 Channel](./add-ons/relay_board) | 019464 | 029099 | - | - | -| | [Relay, USB Controlled, 4 Channel](./add-ons/relay_board) | 019465 | 029100 | - | - | -| | [Relay, USB Controlled, 8 Channel](./add-ons/relay_board) | 019466 | 029101 | - | - | +| Category | Description | CPR Item | Sales Kit | Installation Kit, With Fasteners | Environment Variables in Clearpath OS? | +| :---------------- | :-------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------: | :----------------------------: | :------------------------------: | :------------------------------------: | +| **Accessories** | [DIN Rail](./add-ons/din_rail) | - | 027882 | 027881 | No | +| **Camera** | [Axis F1035-E](./sensors/cameras/axis_f1035_e) | 020068 | 027105 | 027212 | No | +| | [Axis F34](./sensors/cameras/axis_f1035_e) | 020442 | 027634 | 027633 | No | +| | [Axis M5525-E](./sensors/cameras/axis_m5525_e) | 006758 | 027106 | 027225 | No | +| | [FLIR Blackfly S](./sensors/cameras/flir_blackfly_s) | many | 027118 | 027218 | Yes | +| | [FLIR Ladybug5+](./sensors/cameras/flir_ladybug5p) | 017245 | 028894 | 028893 | No | +| | [Intel RealSense D435](./sensors/cameras/realsense_d435) | 024150 | 026869 | 027208 | Yes | +| | [Occam Omni 60 Colour](./sensors/cameras/occam_omni_60) | 019645 | 027102 | 027211 | No | +| | [Stereolabs ZED 2](./sensors/cameras/stereolabs_zed_2) | 023611 | 028960 | 028959 | No | +| | [Stereolabs ZED 2i](./sensors/cameras/stereolabs_zed_2) | 025844 | 026872 | 027210 | No | +| **Computer** | Mini-ITX Indoor | - | 027668 | 027667 | - | +| **GPS** | [Garmin GPS 18x](./sensors/gps/garmin_gps_18x) | 001893 | 028876 | 028875 | No | +| | [Swift Navigation Duro](./sensors/gps/swift_navigation_duro) | 015822 | 027107 | 027213 | No | +| | [Swift Navigation Duro Inertial](./sensors/gps/swift_navigation_duro) | 018151 | 027108 | 027214 | No | +| **IMU** | [Microstrain 3DM-GX5-10](./sensors/imu/microstrain_3dm_gx5) | 017839 | 028963 | 028962 | Yes | +| | [Microstrain 3DM-GX5-15](./sensors/imu/microstrain_3dm_gx5) | 017772 | 027114 | 027215 | Yes | +| | [Microstrain 3DM-GX5-25](./sensors/imu/microstrain_3dm_gx5) | 014603 | 027117 | 027217 | Yes | +| | [Microstrain 3DM-GX5-35](./sensors/imu/microstrain_3dm_gx5) | 028528 | 028964 | 028957 | Yes | +| | [Microstrain 3DM-GX5-45](./sensors/imu/microstrain_3dm_gx5) | 017391 | 028966 | 028965 | Yes | +| | [Redshift Labs UM7](./sensors/imu/redshift_labs_um7) | 011914 | 028881 | 028880 | No | +| **Lidar 2D** | [Hokuyo UST10-LX](./sensors/lidar_2d/hokuyo_ust10_lx) | 011759 | 027207 | 026611 | Yes | +| | [Hokuyo UST10-LX Vertical](./sensors/lidar_2d/hokuyo_ust10_lx) | 011759 | 026966 | 027224 | Yes | +| | [Hokuyo UST20-LX](./sensors/lidar_2d/hokuyo_ust20_lx) | 016359 | 029013 | 029012 | Yes | +| | [Hokuyo UST30-LX](./sensors/lidar_2d/hokuyo_ust30_lx) | 027584 | 029015 | 029014 | Yes | +| | [SICK LMS111](./sensors/lidar_2d/sick_lms111) | 006387 | 027657 | 027656 | Yes | +| **Lidar 3D** | [Velodyne Puck Lite](./sensors/lidar_3d/velodyne_puck_lite) | 016312
023729 | 029027 | 029026 | Yes | +| | [Velodyne Puck](./sensors/lidar_3d/velodyne_puck) | 011703
020972 | 026859 | 027206 | Yes | +| | [Velodyne Puck Vertical](./sensors/lidar_3d/velodyne_puck) | 011703
020972 | 026965 | 027222 | Yes | +| | [Velodyne Ultra Puck](./sensors/lidar_3d/velodyne_ultra_puck) | 016901
029035 | 029037 | 029036 | Yes | +| | [Ouster, OS0](./sensors/lidar_3d/ouster) | 028738
028740 | 028660
028661
028662 | 028850
028851
028852 | No | +| | [Ouster, OS1](./sensors/lidar_3d/ouster) | 028848
028742
028745 | 028663
028664
028665 | 028853
028854
028855 | No | +| | [Ouster, OS2](./sensors/lidar_3d/ouster) | 028849
028747
028749 | 028666
028667
028668 | 028856
028857
028858 | No | +| **Lights** | [Stack Light, Controls Base](./add-ons/stack_light) | 020710
020711
020715
020716
020717
020718
020719
020720 | 027111 | 027220 | No | +| **Manipulator** | [FLIR PTU E46](./manipulators/flir_ptu_e46) | 018807
027246 | 028873 | 028872 | No | +| | [Kinova Gen 3 Lite](./manipulators/kinova_gen3_lite) | 022586 | 026913 | 027219 | No | +| | Universal Robots UR5e Arm | 027264 | 027272 | 027271 | No | +| | Universal Robots UR5e Controls Cabinet | - | 027291
027293 | 027290
027292 | No | +| **Motion-Stop** | [Kar-Tech](./add-ons/wireless_stop_system) | 014663 | 027298 | 027297 | No | +| | [FORT Robotics Joystick](./add-ons/wireless_stop_system) | 025727 | 027112 | 027216 | No | +| **Network** | [Network Access Point, Microhard px2-ENC](./add-ons/network_access_point) | 015329 | 029104 | - | - | +| | [Network Access Point, Microhard BulletPlusAC](./add-ons/network_access_point) | 027795 | 029105 | - | - | +| | [Network Switch, 5 Port](./add-ons/network_switch) | 021044 | 027639 | 027638 | - | +| | [Network Switch, 8 Port](./add-ons/network_switch) | 025333 | 027641 | 027640 | - | +| | [Network Switch, 16 Port](./add-ons/network_switch) | 029098 | - | - | - | +| | [USB Hub, 7 Port](./add-ons/usb_hub) | 025440 | 027643 | 027642 | - | +| **OutdoorNav HW** | [OutdoorNav Starter Kit](../../robots/accessories/add-ons/outdoornav_starter_kit) | - | 028356 | - | - | +| **Power Supply** | [Power Supply, SB-15](./add-ons/power_supplies) | - | 028902 | 028901 | - | +| | [Power Supply, SB-25](./add-ons/power_supplies) | - | 028904 | 028903 | - | +| | [Power Supply, TEP 150](./add-ons/power_supplies) | - | 028942 | 028941 | - | +| **Relay** | [Relay, USB Controlled, 2 Channel](./add-ons/relay_board) | 019464 | 029099 | - | - | +| | [Relay, USB Controlled, 4 Channel](./add-ons/relay_board) | 019465 | 029100 | - | - | +| | [Relay, USB Controlled, 8 Channel](./add-ons/relay_board) | 019466 | 029101 | - | - |
diff --git a/docs/robots/accessories/sensors/gps/garmin_gps_18x.mdx b/docs/robots/accessories/sensors/gps/garmin_gps_18x.mdx index 64cefd215..e42f26782 100644 --- a/docs/robots/accessories/sensors/gps/garmin_gps_18x.mdx +++ b/docs/robots/accessories/sensors/gps/garmin_gps_18x.mdx @@ -23,21 +23,21 @@ import Support from "/components/support.mdx"; ## Specifications -| Description | Value | -| :------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------ | -| Mass | 165 kg | -| Voltage, Minimum | 4 V | -| Voltage, Maximum | 5.5 V | -| Voltage, Sensor | 5 V | -| Power, Average | 0.5 W | -| Data | TIA-232-F ( RS-232 )
Default setting is 19200 baud | -| View, Vertical | Unknown | -| Position Accuracy | 15 m | +| Description | Value | +| :--------------------------------------------------------------------------------------------------------- | :------------------------------------------------------ | +| Mass | 165 kg | +| Voltage, Minimum | 4 V | +| Voltage, Maximum | 5.5 V | +| Voltage, Sensor | 5 V | +| Power, Average | 0.5 W | +| Data | TIA-232-F ( RS-232 )
Default setting is 19200 baud | +| View, Vertical | Unknown | +| Position Accuracy | 15 m | | Position Accuracy RTK (requires a [Base Station](../../add-ons/base_station.mdx) or a positioning-service) | Unknown | -| Ingress Protection, Solids | Unknown ( assume 6 ) | -| Ingress Protection, Liquids | 7 | -| Operating Temperature, Min | -30 °C | -| Operating Temperature, Max | 80 °C | +| Ingress Protection, Solids | Unknown ( assume 6 ) | +| Ingress Protection, Liquids | 7 | +| Operating Temperature, Min | -30 °C | +| Operating Temperature, Max | 80 °C | --- diff --git a/docs/robots/accessories/sensors/gps/swift_navigation_duro.mdx b/docs/robots/accessories/sensors/gps/swift_navigation_duro.mdx index 5a85ee3e1..70ad7ba96 100644 --- a/docs/robots/accessories/sensors/gps/swift_navigation_duro.mdx +++ b/docs/robots/accessories/sensors/gps/swift_navigation_duro.mdx @@ -24,21 +24,21 @@ import Support from "/components/support.mdx"; ## Specifications -| Description | Value | -| :------------------------------------------------------------------------------------------------------------ | :------------------- | -| Mass | 0.8 kg | -| Voltage, Minimum | 10 V | -| Voltage, Maximum | 35 V | -| Voltage, Sensor | 12 V or 24 V | -| Power, Average | 5 W | -| Data | Ethernet, 100 Mbit/s | -| View, Vertical | ±60° from vertical | -| Position Accuracy | 2.5 m | +| Description | Value | +| :--------------------------------------------------------------------------------------------------------- | :------------------- | +| Mass | 0.8 kg | +| Voltage, Minimum | 10 V | +| Voltage, Maximum | 35 V | +| Voltage, Sensor | 12 V or 24 V | +| Power, Average | 5 W | +| Data | Ethernet, 100 Mbit/s | +| View, Vertical | ±60° from vertical | +| Position Accuracy | 2.5 m | | Position Accuracy RTK (requires a [Base Station](../../add-ons/base_station.mdx) or a positioning-service) | 0.01 m | -| Ingress Protection, Solids | 6 | -| Ingress Protection, Liquids | 7 | -| Operating Temperature, Min | -40 °C | -| Operating Temperature, Max | 75 °C | +| Ingress Protection, Solids | 6 | +| Ingress Protection, Liquids | 7 | +| Operating Temperature, Min | -40 °C | +| Operating Temperature, Max | 75 °C | --- diff --git a/docs/robots/indoor_robots/dingo/tutorials_dingo.mdx b/docs/robots/indoor_robots/dingo/tutorials_dingo.mdx index 44f70294c..39e924407 100644 --- a/docs/robots/indoor_robots/dingo/tutorials_dingo.mdx +++ b/docs/robots/indoor_robots/dingo/tutorials_dingo.mdx @@ -171,16 +171,16 @@ Additional configurations coming soon You can view all topics that are active using `rostopic list`. The most important topics are summarized in the table below. -| Topic | Message Type | Purpose | -| :------------------- | :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `/cmd_vel` | `geometry_msgs/Twist` | Input to Dingo's kinematic controller. Publish here to make Dingo go. | -| `/odometry/filtered` | `nav_msgs/Odometry` | Published by `robot_localization`, a filtered localization estimate based on wheel odometry (encoders) and integrated IMU. | -| `/imu/data` | `sensor_msgs/IMU` | Published by `imu_filter_madgwick`, an orientation estimated based on the Dingo's internal IMU. | -| `/mcu/status` | `dingo_msgs/Status` | Low-frequency status data for Dingo's systems. This information is republished in human readable form on the `diagnostics` topic and is best consumed with the Robot Monitor. | +| Topic | Message Type | Purpose | +| :------------------- | :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `/cmd_vel` | `geometry_msgs/Twist` | Input to Dingo's kinematic controller. Publish here to make Dingo go. | +| `/odometry/filtered` | `nav_msgs/Odometry` | Published by `robot_localization`, a filtered localization estimate based on wheel odometry (encoders) and integrated IMU. | +| `/imu/data` | `sensor_msgs/IMU` | Published by `imu_filter_madgwick`, an orientation estimated based on the Dingo's internal IMU. | +| `/mcu/status` | `dingo_msgs/Status` | Low-frequency status data for Dingo's systems. This information is republished in human readable form on the `diagnostics` topic and is best consumed with the Robot Monitor. | | `/mcu/aux_input` | `dingo_msgs/UInt8` | User can subscribe to this topic to monitor the MCU user inputs. See [AUX Inputs](./integration_dingo#dingo-aux-inputs). | | `/mcu/aux_output` | `std_msgs/UInt8` | User can publish to this topic to enable and disable the AUX outputs as well as control relays on the MCU. See [AUX Outputs and Relays](./integration_dingo#dingo-aux-outputs). | | `/mcu/fans` | `dingo_msgs/Fans` | User can publish to this topic to control an optionally installed fan. See details [Optional Fan](./integration_dingo#dingo-fan). | -| `/mcu/lights` | `dingo_msgs/Lights` | User can publish to this topic to override the default behavior of the Dingo corner LEDs. | +| `/mcu/lights` | `dingo_msgs/Lights` | User can publish to this topic to override the default behavior of the Dingo corner LEDs. | --- diff --git a/docs/robots/outdoor_robots/husky/integration_husky/integration_husky.mdx b/docs/robots/outdoor_robots/husky/integration_husky/integration_husky.mdx index 2a29f5be4..d4ea66879 100644 --- a/docs/robots/outdoor_robots/husky/integration_husky/integration_husky.mdx +++ b/docs/robots/outdoor_robots/husky/integration_husky/integration_husky.mdx @@ -56,6 +56,7 @@ Refer to the following pages for Husky brackets that can simplify your integrati - [Riser, Stiffener](./kits/riser_stiffener_husky) - [Electronics Rack](./kits/electronics_rack_husky) - [OutdoorNav Starter Kit](../../../accessories/add-ons/outdoornav_starter_kit) + --- ## Electrical Integration diff --git a/docs/ros/api/mcu_api.mdx b/docs/ros/api/mcu_api.mdx index 972f55028..39962e84c 100644 --- a/docs/ros/api/mcu_api.mdx +++ b/docs/ros/api/mcu_api.mdx @@ -6,7 +6,6 @@ toc_min_heading_level: 2 toc_max_heading_level: 4 --- - ## MCU topics | Topic | Message type | Publisher | Description | QoS | @@ -25,5 +24,3 @@ toc_max_heading_level: 4 | Service | Service type | Server | Description | QoS | | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- | :------- | :------------------------------------ | :------------- | | platform/mcu/configure | [clearpath_platform_msgs/ConfigureMcu](https://github.com/clearpathrobotics/clearpath_msgs/blob/main/clearpath_platform_msgs/srv/ConfigureMcu.srv) | MCU node | Configure MCU domain ID and namespace | System default | - - diff --git a/docs/ros/api/overview.mdx b/docs/ros/api/overview.mdx index f46bcbdf6..1c72b3738 100644 --- a/docs/ros/api/overview.mdx +++ b/docs/ros/api/overview.mdx @@ -6,27 +6,25 @@ toc_min_heading_level: 2 toc_max_heading_level: 4 --- - The ROS 2 API is a standard naming scheme for ROS 2 topics and services. Every supported Clearpath robot uses this API, making it easy to use the robots interchangeably. - ## QoS Profiles {#qos-profiles} Topics and services in ROS 2 use Quality of Service (QoS) profiles to change communication policies. The QoS profile -of a topic or service has several policies such as history, depth, reliability, durability, and more. For more details on +of a topic or service has several policies such as history, depth, reliability, durability, and more. For more details on QoS settings, visit the [ROS 2 documentation](https://docs.ros.org/en/humble/Concepts/About-Quality-of-Service-Settings.html). For Clearpath platforms, the main policies that may change between different topics and services are reliability and durability. For reliability -there are two options: *Best Effort*, and *Reliable*. A *Best Effort* reliability suggests that an attempt will be made to publish -the data, but if the network is not robust then the data may be lost. On the other hand, *Reliable* guarantees that the data will be received. +there are two options: _Best Effort_, and _Reliable_. A _Best Effort_ reliability suggests that an attempt will be made to publish +the data, but if the network is not robust then the data may be lost. On the other hand, _Reliable_ guarantees that the data will be received. This may require that the data be sent multiple times. -The durability of a QoS profile can be either *Transient Local* or *Volatile*. *Transient Local* means that data for published messages will +The durability of a QoS profile can be either _Transient Local_ or _Volatile_. _Transient Local_ means that data for published messages will be stored by the publisher even after it has been published. A new subscriber will receive the data even if a lot of time has passed since it was originally published. -This durability is typically used for data that only needs to be published once, such as the robot description. The other durability policy is *Volatile* which does not +This durability is typically used for data that only needs to be published once, such as the robot description. The other durability policy is _Volatile_ which does not stored old messages. The messages are published and only active subscribers will receive the data. New subscribers will have to wait for the next message to be published. -Most topics will use a *Volatile* durability policy. +Most topics will use a _Volatile_ durability policy. It is important to check for [QoS compatibility](https://docs.ros.org/en/humble/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-compatibilities) when interacting with ROS 2. Mixing of QoS policies when publishing or subscribing to topics can lead to incompatibility. For example, subscribing to a Best Effort publisher with a Reliable subscriber @@ -42,29 +40,29 @@ The following are some common QoS profiles used by Clearpath platforms. #### System Default -* **History**: *Keep Last* -* **Depth**: *10* -* **Reliability**: *Reliable* -* **Durability**: *Volatile* -* **Deadline**: *System Default* -* **Lifespan**: *System Default* -* **Liveliness**: *Automatic* -* **Lease Duration**: *System Default* +- **History**: _Keep Last_ +- **Depth**: _10_ +- **Reliability**: _Reliable_ +- **Durability**: _Volatile_ +- **Deadline**: _System Default_ +- **Lifespan**: _System Default_ +- **Liveliness**: _Automatic_ +- **Lease Duration**: _System Default_ -The *System Default* QoS profile is the most common profile used by most topics. +The _System Default_ QoS profile is the most common profile used by most topics. #### Sensor Data -* **History**: *Keep Last* -* **Depth**: *5* -* **Reliability**: *Best Effort* -* **Durability**: *Volatile* -* **Deadline**: *System Default* -* **Lifespan**: *System Default* -* **Liveliness**: *Automatic* -* **Lease Duration**: *System Default* +- **History**: _Keep Last_ +- **Depth**: _5_ +- **Reliability**: _Best Effort_ +- **Durability**: _Volatile_ +- **Deadline**: _System Default_ +- **Lifespan**: _System Default_ +- **Liveliness**: _Automatic_ +- **Lease Duration**: _System Default_ -The *Sensor Data* QoS Profile uses a *Best Effort* reliability to send the latest data +The _Sensor Data_ QoS Profile uses a _Best Effort_ reliability to send the latest data as soon as possible, without bothering to resend data that was not received. This is mostly used by the MCU and sensor drivers. @@ -74,16 +72,16 @@ Not all sensor drivers use this QoS profile. Always check the QoS profile before #### Transient Local -* **History**: *Keep Last* -* **Depth**: *10* -* **Reliability**: *Reliable* -* **Durability**: *Transient Local* -* **Deadline**: *System Default* -* **Lifespan**: *System Default* -* **Liveliness**: *Automatic* -* **Lease Duration**: *System Default* +- **History**: _Keep Last_ +- **Depth**: _10_ +- **Reliability**: _Reliable_ +- **Durability**: _Transient Local_ +- **Deadline**: _System Default_ +- **Lifespan**: _System Default_ +- **Liveliness**: _Automatic_ +- **Lease Duration**: _System Default_ -The *Transient Local* QoS Profile offers a *Transient Local* durability, and is typically used by topics that only +The _Transient Local_ QoS Profile offers a _Transient Local_ durability, and is typically used by topics that only want to send messages once. For Clearpath platforms, this includes the robot description topic and the `/rosout` topic which offers system logs. @@ -92,7 +90,7 @@ which offers system logs. Namespacing is the method of adding a prefix to a robot's nodes and topics, to differentiate them from another robot that may be on the same network. For example, every robot will have a `cmd_vel` topic for commanding velocity. If both robots used the same topic, then they would both drive when a message is published to that topic. By namespacing, we can remap the topic -to `robot1/cmd_vel` and `robot2/cmd_vel` for each respective robot. +to `robot1/cmd_vel` and `robot2/cmd_vel` for each respective robot. By default, the namespace of the robot will be obtained from the serial number of the robot. If your serial number is `cpr-a200-0001`, then your namespace -will be `a200_0001`. This can be overwritten in the [robot.yaml](../config/yaml) file. \ No newline at end of file +will be `a200_0001`. This can be overwritten in the [robot.yaml](../config/yaml) file. diff --git a/docs/ros/api/platform_api.mdx b/docs/ros/api/platform_api.mdx index fad5f0dbd..8c2349778 100644 --- a/docs/ros/api/platform_api.mdx +++ b/docs/ros/api/platform_api.mdx @@ -29,5 +29,3 @@ toc_max_heading_level: 4 | tf_static | [tf2_msgs/TFMessage](https://github.com/ros2/geometry2/blob/humble/tf2_msgs/msg/TFMessage.msg) | Various nodes | Static link transforms | [Transient Local](overview#transient-local) | | twist_marker_server/cmd_vel | [geometry_msgs/Twist](https://github.com/ros2/common_interfaces/blob/humble/geometry_msgs/msg/Twist.msg) | Twist Marker Server | Velocity commands from twist marker | [System Default](overview#system-default) | | /rosout | [rcl_interfaces/Log](https://github.com/ros2/rcl_interfaces/blob/humble/rcl_interfaces/msg/Log.msg) | Various nodes | System Logs | [Transient Local](overview#transient-local) | - - diff --git a/docs/ros/api/sensors_api.mdx b/docs/ros/api/sensors_api.mdx index 82f9c17aa..f1d53ef6b 100644 --- a/docs/ros/api/sensors_api.mdx +++ b/docs/ros/api/sensors_api.mdx @@ -6,47 +6,45 @@ toc_min_heading_level: 2 toc_max_heading_level: 4 --- - ## 2D Lidar topics -| Topic | Message type | Description | QoS | -| :------------------------------ | :----------------------------------------------------------------------------------------------------------- | :-------------- | :---------------------------------------- | -| platform/sensors/lidar2d_#/scan | [sensor_msgs/LaserScan](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/LaserScan.msg) | Lidar scan data | [System Default](overview#system-default) | +| Topic | Message type | Description | QoS | +| :------------------------------- | :----------------------------------------------------------------------------------------------------------- | :-------------- | :---------------------------------------- | +| platform/sensors/lidar2d\_#/scan | [sensor_msgs/LaserScan](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/LaserScan.msg) | Lidar scan data | [System Default](overview#system-default) | ## 3D Lidar topics -| Topic | Message type | Description | QoS | -| :-------------------------------- | :--------------------------------------------------------------------------------------------------------------- | :-------------------- | :---------------------------------------- | -| platform/sensors/lidar3d_#/points | [sensor_msgs/PointCloud2](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/PointCloud2.msg) | Lidar pointcloud data | [System Default](overview#system-default) | -| platform/sensors/lidar3d_#/scan | [sensor_msgs/LaserScan](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/LaserScan.msg) | Lidar scan data | [System Default](overview#system-default) | +| Topic | Message type | Description | QoS | +| :--------------------------------- | :--------------------------------------------------------------------------------------------------------------- | :-------------------- | :---------------------------------------- | +| platform/sensors/lidar3d\_#/points | [sensor_msgs/PointCloud2](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/PointCloud2.msg) | Lidar pointcloud data | [System Default](overview#system-default) | +| platform/sensors/lidar3d\_#/scan | [sensor_msgs/LaserScan](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/LaserScan.msg) | Lidar scan data | [System Default](overview#system-default) | ## Camera topics | Topic | Message type | Description | QoS | | :------------------------------------------- | :--------------------------------------------------------------------------------------------------------------- | :-------------- | :---------------------------------------- | -| platform/sensors/camera_#/color/image | [sensor_msgs/Image](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Image.msg) | Raw RGB image | [System Default](overview#system-default) | -| platform/sensors/camera_#/color/camera_info | [sensor_msgs/CameraInfo](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/CameraInfo.msg) | Camera Info | [System Default](overview#system-default) | -| platform/sensors/camera_#/depth/image | [sensor_msgs/Image](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Image.msg) | Raw depth image | [System Default](overview#system-default) | -| platform/sensors/camera_#/depth/camera_info | [sensor_msgs/CameraInfo](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/CameraInfo.msg) | Camera Info | [System Default](overview#system-default) | -| platform/sensors/camera_#/points | [sensor_msgs/PointCloud2](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/PointCloud2.msg) | Pointcloud data | [System Default](overview#system-default) | -| platform/sensors/camera_#/imu | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | IMU data | [System Default](overview#system-default) | +| platform/sensors/camera\_#/color/image | [sensor_msgs/Image](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Image.msg) | Raw RGB image | [System Default](overview#system-default) | +| platform/sensors/camera\_#/color/camera_info | [sensor_msgs/CameraInfo](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/CameraInfo.msg) | Camera Info | [System Default](overview#system-default) | +| platform/sensors/camera\_#/depth/image | [sensor_msgs/Image](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Image.msg) | Raw depth image | [System Default](overview#system-default) | +| platform/sensors/camera\_#/depth/camera_info | [sensor_msgs/CameraInfo](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/CameraInfo.msg) | Camera Info | [System Default](overview#system-default) | +| platform/sensors/camera\_#/points | [sensor_msgs/PointCloud2](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/PointCloud2.msg) | Pointcloud data | [System Default](overview#system-default) | +| platform/sensors/camera\_#/imu | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | IMU data | [System Default](overview#system-default) | ## IMU topics -| Topic | Message type | Description | QoS | -| :------------------------------ | :------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | :---------------------------------------- | -| platform/sensors/imu_#/data_raw | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | Raw IMU orientation, angular velocity, and linear acceleration data | [Sensor Data](overview#sensor-data) | -| platform/sensors/imu_#/data | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | Filtered IMU orientation, angular velocity, and linear acceleration data | [System Default](overview#system-default) | -| platform/sensors/imu_#/mag | [sensor_msgs/MagneticField](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/MagneticField.msg) | IMU magnetic field data | [System Default](overview#system-default) | +| Topic | Message type | Description | QoS | +| :------------------------------- | :------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | :---------------------------------------- | +| platform/sensors/imu\_#/data_raw | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | Raw IMU orientation, angular velocity, and linear acceleration data | [Sensor Data](overview#sensor-data) | +| platform/sensors/imu\_#/data | [sensor_msgs/Imu](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/Imu.msg) | Filtered IMU orientation, angular velocity, and linear acceleration data | [System Default](overview#system-default) | +| platform/sensors/imu\_#/mag | [sensor_msgs/MagneticField](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/MagneticField.msg) | IMU magnetic field data | [System Default](overview#system-default) | ## GPS topics -| Topic | Message type | Description | QoS | -| :------------------------- | :----------------------------------------------------------------------------------------------------------- | :--------------------- | :---------------------------------------- | -| platform/sensors/gps_#/fix | [sensor_msgs/NavSatFix](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/NavSatFix.msg) | Navsat Fix information | [System Default](overview#system-default) | - +| Topic | Message type | Description | QoS | +| :-------------------------- | :----------------------------------------------------------------------------------------------------------- | :--------------------- | :---------------------------------------- | +| platform/sensors/gps\_#/fix | [sensor_msgs/NavSatFix](https://github.com/ros2/common_interfaces/blob/humble/sensor_msgs/msg/NavSatFix.msg) | Navsat Fix information | [System Default](overview#system-default) | :::note The '#' in the topic represents the index of the sensor. Indexing begins at 0 and will increment for each new sensor of that type that is added. Internal sensors such as IMU's will be indexed first. -::: \ No newline at end of file +::: diff --git a/docs/ros/config/generators.mdx b/docs/ros/config/generators.mdx index 6f8cc2e72..3febedd08 100644 --- a/docs/ros/config/generators.mdx +++ b/docs/ros/config/generators.mdx @@ -39,29 +39,28 @@ parameter file for the specific node, and allows for users to overwrite any para ### Setup folder structure -Once all files are generated, the resulting setup folder structure under `/etc/clearpath/` will look like this: - -* **platform** - * **launch** - * *platform-service.launch.py* - * **config** - * *control.yaml* - * *imu_filter.yaml* - * *localization.yaml* - * *teleop_interactive_markers.yaml* - * *teleop_joy.yaml* - * *twist_mux.yaml* -* **sensors** - * **launch** - * *sensors-service.launch.py* - * *camera_0.launch.py* - * *camera_1.launch.py* - * ... - * **config** - * *camera_0.yaml* - * *camera_1.yaml* - * ... -* *robot.urdf.xacro* -* *robot.yaml* -* *setup.bash* +Once all files are generated, the resulting setup folder structure under `/etc/clearpath/` will look like this: +- **platform** + - **launch** + - _platform-service.launch.py_ + - **config** + - _control.yaml_ + - _imu_filter.yaml_ + - _localization.yaml_ + - _teleop_interactive_markers.yaml_ + - _teleop_joy.yaml_ + - _twist_mux.yaml_ +- **sensors** + - **launch** + - _sensors-service.launch.py_ + - _camera_0.launch.py_ + - _camera_1.launch.py_ + - ... + - **config** + - _camera_0.yaml_ + - _camera_1.yaml_ + - ... +- _robot.urdf.xacro_ +- _robot.yaml_ +- _setup.bash_ diff --git a/docs/ros/config/services.mdx b/docs/ros/config/services.mdx index bbc39387b..d2d0a8140 100644 --- a/docs/ros/config/services.mdx +++ b/docs/ros/config/services.mdx @@ -13,7 +13,6 @@ ran everything. For ROS 2 Humble, we have split this into three separate service [Sensors](https://github.com/clearpathrobotics/clearpath_robot/blob/main/clearpath_robot/services/clearpath-sensors.service), and [Robot](https://github.com/clearpathrobotics/clearpath_robot/blob/main/clearpath_robot/services/clearpath-robot.service). - ### Clearpath Platform The `clearpath-platform` service launches the `clearpath-platform.launch.py` file found under `/etc/clearpath/platform/launch/`. This will launch the nodes diff --git a/docs/ros/config/yaml.mdx b/docs/ros/config/yaml.mdx index bd6b89f0c..f3f1934cb 100644 --- a/docs/ros/config/yaml.mdx +++ b/docs/ros/config/yaml.mdx @@ -5,4 +5,3 @@ sidebar_position: 1 toc_min_heading_level: 2 toc_max_heading_level: 4 --- - diff --git a/docs/ros/installation/controller.mdx b/docs/ros/installation/controller.mdx index 7c6414b01..c61138c2e 100644 --- a/docs/ros/installation/controller.mdx +++ b/docs/ros/installation/controller.mdx @@ -10,7 +10,6 @@ Joystick controllers are used for teleoperation; they allow you to remotely driv or a simulated robot. The following instructions below detail how to pair different controllers to the robot's computer; however, these instructions can also be used to pair these controllers to your own computer. - ### PS4 Controller :::note @@ -24,12 +23,14 @@ To re-pair the PS4 controller or pair a new PS4 controller: ``` sudo apt-get install python-ds4drv ``` + 2. Put the controller in pairing mode. Press and hold the PS and Share buttons on your controller until the LED begins rapidly flashing white. 3. Run the `ds4drv-pair` script to pair the controller to the computer. In terminal, run: ``` sudo ds4drv-pair ``` + This script will scan for nearby Bluetooth devices, and pair automatically to the controller. Alternatively, if ds4drv-pair fails to detect the controller, you can pair the controller using `bluetoothctl`: @@ -39,17 +40,20 @@ Alternatively, if ds4drv-pair fails to detect the controller, you can pair the c ``` sudo apt-get install bluez ``` + 2. Run the `bluetoothctl` command. In terminal, run: ``` sudo bluetoothctl ``` + 3. Use `bluetoothctl` to scan for nearby devices. In the bluetooth control application, run: ``` agent on scan on ``` + 4. Put the controller in pairing mode. Press and hold the PS and Share buttons on your controller until the LED begins rapidly flashing white. 5. The bluetooth scan will display the MAC addresses of nearby devices. Determine which MAC address corresponds to the controller and copy it. In the bluetooth control application, run: diff --git a/docs/ros/installation/remote_pc.mdx b/docs/ros/installation/remote_pc.mdx index 5ed88958f..f1dd04c46 100644 --- a/docs/ros/installation/remote_pc.mdx +++ b/docs/ros/installation/remote_pc.mdx @@ -43,6 +43,7 @@ For the remote computer we can create the `clearpath` folder in the home directo ``` mkdir ~/clearpath/ ``` + 2. **Copy the `robot.yaml` file into the setup folder** ``` @@ -65,4 +66,3 @@ Add the following line to your `~/.bashrc` file to automatically source the gene ``` source /etc/clearpath/setup.bash ``` - diff --git a/docs/ros/installation/robot.mdx b/docs/ros/installation/robot.mdx index d0f55349a..e628a4558 100644 --- a/docs/ros/installation/robot.mdx +++ b/docs/ros/installation/robot.mdx @@ -12,7 +12,6 @@ ROS 2 Humble uses [Ubuntu 22.04](https://releases.ubuntu.com/jammy/) as its Tier it is highly recommended to use Ubuntu 22.04. For the robot computer, Ubuntu 22.04 Server should be installed. The server version of the OS will not install a graphical user interface (GUI). - ### First login Connect the robot's computer to a monitor using an HDMI or DisplayPort cable. Then, connect a USB keyboard. Power the robot on and wait for the Ubuntu login prompt to show up. On a fresh install, the default username and password are both `ubuntu`. You will be prompted to change your password. @@ -40,7 +39,7 @@ Once logged in, find the name of your Wi-Fi interface by calling `ip a`. Wi-Fi i
@@ -91,8 +90,7 @@ Configure Ubuntu's APT package manager to add the package server: wget https://packages.clearpathrobotics.com/public.key -O - | sudo apt-key add - ``` -**2. Add the debian sources for the repository** - +**2. Add the debian sources for the repository** ``` sudo sh -c 'echo "deb https://packages.clearpathrobotics.com/stable/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/clearpath-latest.list' @@ -100,7 +98,6 @@ sudo sh -c 'echo "deb https://packages.clearpathrobotics.com/stable/ubuntu $(lsb **3. Update your computer’s package cache** - ``` sudo apt-get update ``` @@ -165,7 +162,7 @@ sudo apt-get install ros-humble-jackal-firmware **2. Place the Jackal MCU into bootloader mode** -Switch the *PWR_MODE* switch from *NORM* to *ALT*. If the robot is on, press the *M_RST* button. Otherwise, turn the +Switch the _PWR_MODE_ switch from _NORM_ to _ALT_. If the robot is on, press the _M_RST_ button. Otherwise, turn the robot on with the power button. **3. Flash the firmware** @@ -173,6 +170,7 @@ robot on with the power button. ``` jackal_firmware_flash.sh ``` + Flashing progress will be indicated by the flash script. Wait for the firmware to finish flashing. :::caution @@ -217,4 +215,4 @@ Add the following line to your `~/.bashrc` file to automatically source the gene ``` source /etc/clearpath/setup.bash -``` \ No newline at end of file +``` diff --git a/docs/ros/networking/computer_setup.mdx b/docs/ros/networking/computer_setup.mdx index c0f04a432..15169aa0b 100644 --- a/docs/ros/networking/computer_setup.mdx +++ b/docs/ros/networking/computer_setup.mdx @@ -37,4 +37,3 @@ Netplan will read files under `/etc/netplan/` in alphanumeric order. Files begin If two files define the same configuration, the configuration read last will be used. Otherwise, netplan will amalgamate all files under `/etc/netplan/` to create the netplan configuration. ::: - diff --git a/docs/ros/networking/ntp.mdx b/docs/ros/networking/ntp.mdx index 6918d9b10..16ecb3033 100644 --- a/docs/ros/networking/ntp.mdx +++ b/docs/ros/networking/ntp.mdx @@ -119,4 +119,3 @@ rtcsync # one second, but only in the first three clock updates. makestep 1 3 ``` - diff --git a/docs/ros/ros.mdx b/docs/ros/ros.mdx index b2174ec4f..ef380d42c 100644 --- a/docs/ros/ros.mdx +++ b/docs/ros/ros.mdx @@ -9,20 +9,18 @@ robot, we have opted to create common `clearpath` packages which are used by all to customize the robot, and instead using a YAML configuration file to describe the robot. We have also defined a [ROS 2 API](api/overview) common to all of our supported platforms. As a result, our platforms are now more customizable, more modular, and more unified. - ## Terminology {#terminology} -***Clearpath Platform***: The *platform* refers to the vehicle that makes up the base of the robot. The platform may be referred to by +**_Clearpath Platform_**: The _platform_ refers to the vehicle that makes up the base of the robot. The platform may be referred to by the platform code to indicate the revision. -***Clearpath Robot***: The *robot* refers to the entire robotic system, including the platform, sensors, and additional accessories. +**_Clearpath Robot_**: The _robot_ refers to the entire robotic system, including the platform, sensors, and additional accessories. -***Clearpath Config***: The *config* refers to the `robot.yaml` configuration file that defines the Clearpath robot. +**_Clearpath Config_**: The _config_ refers to the `robot.yaml` configuration file that defines the Clearpath robot. -***Clearpath API***: The *API* refers to the [ROS 2 application programming interface](api/overview). This is a set of ROS 2 topics and services defined +**_Clearpath API_**: The _API_ refers to the [ROS 2 application programming interface](api/overview). This is a set of ROS 2 topics and services defined by Clearpath which are used by all supported Clearpath platforms. - ## Supported Platforms {#supported-platforms} @@ -32,49 +30,54 @@ by Clearpath which are used by all supported Clearpath platforms. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{" "} + + + + + + +{" "} + + + + + + +{" "} + + + + + + +{" "} + + + + + + + + + + + + + + + + + + + + +{" "} + + + + + @@ -100,40 +103,65 @@ sensors that have been validated by Clearpath. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{" "} + + + + + + + +{" "} + + + + + + + +{" "} + + + + + + + +{" "} + + + + + + + +{" "} + + + + + + @@ -147,4 +175,4 @@ sensors that have been validated by Clearpath. Debian drivers are automatically installed on robots as part of the [Clearpath Robot Metapackage](../ros/installation/robot.mdx#clearpath-robot-metapackage). -::: \ No newline at end of file +::: diff --git a/docs/ros/tutorials/driving.mdx b/docs/ros/tutorials/driving.mdx index 8ea358248..8c73d2ea7 100644 --- a/docs/ros/tutorials/driving.mdx +++ b/docs/ros/tutorials/driving.mdx @@ -19,7 +19,6 @@ Make sure your controller is paired to the robot PC. Visit the [controller pairi With the [robot services](../installation/robot#robot-services) running, turn on your controller. Press and hold either **L1** or **R1**, and use the left joystick to publish a linear velocity and yaw command. The **L1** button will drive the robot at slow speeds, while **R1** will drive the robot at fast speeds. -
Localization in simulation
-
\ No newline at end of file + diff --git a/docs/ros/tutorials/navigation_demos/nav2.mdx b/docs/ros/tutorials/navigation_demos/nav2.mdx index 23024110f..b3360475e 100644 --- a/docs/ros/tutorials/navigation_demos/nav2.mdx +++ b/docs/ros/tutorials/navigation_demos/nav2.mdx @@ -31,6 +31,7 @@ Click on the orange play button in the bottom left corner to start the simulatio ``` ros2 launch clearpath_viz view_navigation.launch.py namespace:=j100_0001 ``` + **4. In another terminal, launch localization** ``` @@ -50,7 +51,6 @@ ros2 launch clearpath_nav2_demos localization.launch.py setup_path:=$HOME/clearp ros2 launch clearpath_nav2_demos nav2.launch.py setup_path:=$HOME/clearpath/ use_sim_time:=true ``` - **6. Set the initial pose of the robot** Use the **2D Pose Estimate** tool in RViz to set the initial pose of the robot. @@ -62,7 +62,7 @@ Use the **Nav2 Goal** tool in RViz to set a navigation goal pose.
Navigation in simulation
diff --git a/docs/ros/tutorials/navigation_demos/overview.mdx b/docs/ros/tutorials/navigation_demos/overview.mdx index 9d61ba99c..530f8cd62 100644 --- a/docs/ros/tutorials/navigation_demos/overview.mdx +++ b/docs/ros/tutorials/navigation_demos/overview.mdx @@ -19,4 +19,4 @@ sudo apt-get install ros-humble-clearpath-nav2-demos :::tip The navigation demos can be run on either the robot computer, or a remote computer. -::: \ No newline at end of file +::: diff --git a/docs/ros/tutorials/navigation_demos/slam.mdx b/docs/ros/tutorials/navigation_demos/slam.mdx index 537b2b735..8cb3aed29 100644 --- a/docs/ros/tutorials/navigation_demos/slam.mdx +++ b/docs/ros/tutorials/navigation_demos/slam.mdx @@ -30,6 +30,7 @@ Click on the orange play button in the bottom left corner to start the simulatio ``` ros2 launch clearpath_viz view_navigation.launch.py namespace:=j100_0001 ``` + **4. In another terminal, launch SLAM** ``` @@ -41,7 +42,7 @@ ros2 launch clearpath_nav2_demos slam.launch.py setup_path:=$HOME/clearpath/ use
SLAM in simulation
@@ -53,4 +54,4 @@ ros2 launch clearpath_nav2_demos slam.launch.py setup_path:=$HOME/clearpath/ use ``` ros2 run nav2_map_server map_saver_cli -f "map_name" \ --ros-args -p map_subscribe_transient_local:=true -r __ns:=/j100_0001 -``` \ No newline at end of file +``` diff --git a/docs/ros/tutorials/simulator/install.mdx b/docs/ros/tutorials/simulator/install.mdx index 6919af5b2..55742f023 100644 --- a/docs/ros/tutorials/simulator/install.mdx +++ b/docs/ros/tutorials/simulator/install.mdx @@ -62,4 +62,3 @@ colcon build --symlink-install :::note Make sure to add the workspace to your `robot.yaml` file. TODO: Add link to robot yaml documentation ::: - diff --git a/docs/ros/tutorials/simulator/overview.mdx b/docs/ros/tutorials/simulator/overview.mdx index ba142d610..6ddf72480 100644 --- a/docs/ros/tutorials/simulator/overview.mdx +++ b/docs/ros/tutorials/simulator/overview.mdx @@ -13,7 +13,7 @@ The Clearpath simulator can be used to iterate on robot configurations, test con
Clearpath Simulator
@@ -22,4 +22,4 @@ The Clearpath simulator can be used to iterate on robot configurations, test con ### Bridging Gazebo to ROS 2 -Gazebo uses its own transport layer consisting of nodes and messages similar to ROS 2. A [ROS 2 bridge node](https://github.com/gazebosim/ros_gz/tree/humble/ros_gz_bridge) is required to bridge Gazebo data to ROS 2, and vice versa. By leveraging the [generators](../config/generators), we can generate the required bridges when the simulator is launched. As a result, the simulator can support all of the same configurations that a physical robot supports. \ No newline at end of file +Gazebo uses its own transport layer consisting of nodes and messages similar to ROS 2. A [ROS 2 bridge node](https://github.com/gazebosim/ros_gz/tree/humble/ros_gz_bridge) is required to bridge Gazebo data to ROS 2, and vice versa. By leveraging the [generators](../config/generators), we can generate the required bridges when the simulator is launched. As a result, the simulator can support all of the same configurations that a physical robot supports. diff --git a/docs/ros/tutorials/simulator/simulate.mdx b/docs/ros/tutorials/simulator/simulate.mdx index 3f3cf389b..ae6ae3629 100644 --- a/docs/ros/tutorials/simulator/simulate.mdx +++ b/docs/ros/tutorials/simulator/simulate.mdx @@ -20,7 +20,6 @@ ros2 launch clearpath_gz simulation.launch.py The launch file will run all of the necessary [generators](../config/generators) to generate launch and parameter files for the simulation before launching Gazebo and spawning the robot. These will be placed under the setup path (defaults to `$HOME/clearpath/`). - ### Launch arguments If you are using a different setup path, use the `setup_path` launch argument to change it: @@ -58,7 +57,7 @@ The simulated robot can be driven in the same ways as the physical robot. Take a
Driving Jackal in simulation
diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js index 08194b9e8..0e5ce15d2 100644 --- a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +++ b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js @@ -1,22 +1,20 @@ -import React from 'react'; -import DocsVersionDropdownNavbarItem from '@theme-original/NavbarItem/DocsVersionDropdownNavbarItem'; -import { useLocation } from '@docusaurus/router'; +import React from "react"; +import DocsVersionDropdownNavbarItem from "@theme-original/NavbarItem/DocsVersionDropdownNavbarItem"; +import { useLocation } from "@docusaurus/router"; export default function DocsVersionDropdownNavbarItemWrapper(props) { - const { docsPluginId, className, type } = props - const { pathname } = useLocation() - + const { docsPluginId, className, type } = props; + const { pathname } = useLocation(); + /* (Custom) check if docsPluginId contains pathname Given that the docsPluginId is 'charge-controller' and the routeBasePath is 'charge-controller', we can check against the current URI (pathname). If the pathname contains the docsPluginId, we want to show the version dropdown. Otherwise, we don't want to show it. This gives us one, global, context-aware version dropdown that works with multi-instance setups. You want to declare a version dropdown for each plugin in your navbarItems config property for this to work well. */ - const doesPathnameContainDocsPluginId = pathname.includes(docsPluginId + '/') + const doesPathnameContainDocsPluginId = pathname.includes(docsPluginId + "/"); if (!doesPathnameContainDocsPluginId) { - return null + return null; } - - return ( - - ); + + return ; } From 7f405981f5f6fca670c7eac49694dd28c44e7c4f Mon Sep 17 00:00:00 2001 From: Roni Kreinin Date: Thu, 6 Jul 2023 16:07:31 -0400 Subject: [PATCH 4/5] Upgrading to Humble Formatting fixes --- docs/ros/installation/controller.mdx | 2 +- docs/ros/installation/remote_pc.mdx | 2 +- docs/ros/installation/robot.mdx | 13 +- docs/ros/installation/upgrading.mdx | 105 ++++++++++++++ docs/ros/ros.mdx | 204 +++++++++++++-------------- 5 files changed, 214 insertions(+), 112 deletions(-) create mode 100644 docs/ros/installation/upgrading.mdx diff --git a/docs/ros/installation/controller.mdx b/docs/ros/installation/controller.mdx index c61138c2e..58d0d0800 100644 --- a/docs/ros/installation/controller.mdx +++ b/docs/ros/installation/controller.mdx @@ -1,7 +1,7 @@ --- title: Joystick Controller Pairing sidebar_label: Joystick Controller -sidebar_position: 3 +sidebar_position: 4 toc_min_heading_level: 2 toc_max_heading_level: 4 --- diff --git a/docs/ros/installation/remote_pc.mdx b/docs/ros/installation/remote_pc.mdx index f1dd04c46..2ce79e035 100644 --- a/docs/ros/installation/remote_pc.mdx +++ b/docs/ros/installation/remote_pc.mdx @@ -1,7 +1,7 @@ --- title: Remote Computer setup sidebar_label: Remote Computer -sidebar_position: 2 +sidebar_position: 3 toc_min_heading_level: 2 toc_max_heading_level: 4 --- diff --git a/docs/ros/installation/robot.mdx b/docs/ros/installation/robot.mdx index e628a4558..45f72adfd 100644 --- a/docs/ros/installation/robot.mdx +++ b/docs/ros/installation/robot.mdx @@ -1,7 +1,7 @@ --- -title: Robot installation +title: Robot Installation sidebar_label: Robot -sidebar_position: 1 +sidebar_position: 2 toc_min_heading_level: 2 toc_max_heading_level: 4 --- @@ -74,6 +74,13 @@ Save the file and call `sudo netplan apply` to apply the changes. Check `ip a` a The robot's computer can also be connected to a dhcp network over ethernet. Connect an ethernet cable to the built-in ethernet port on the robot's computer and check that an IP has been assigned with `ip a`. + +:::note + +You should now be able to SSH into the robot by calling `ssh administrator@` from a remote computer. + +::: + ### ROS 2 Humble Follow the [official instructions](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html) for installing ROS 2 Humble from debian packages. @@ -104,7 +111,7 @@ sudo apt-get update ### Network Configuration -Once the Clearpath package server is set up, follow the [Clearpath Computer Setup](../networking/computer_setup.mdx) instructions to configure the network interfaces. +Once the Clearpath package server is set up, follow the [Clearpath Computer Setup](../networking/computer_setup) instructions to configure the network interfaces. ### Clearpath Robot metapackage diff --git a/docs/ros/installation/upgrading.mdx b/docs/ros/installation/upgrading.mdx new file mode 100644 index 000000000..d2ba28df3 --- /dev/null +++ b/docs/ros/installation/upgrading.mdx @@ -0,0 +1,105 @@ +--- +title: Upgrading to Humble +sidebar_label: Upgrading to Humble +sidebar_position: 1 +toc_min_heading_level: 2 +toc_max_heading_level: 4 +--- + +:::note + +Users who are installing ROS 2 Humble onto a new robot computer can skip to [Robot Installation](./robot). + +::: + +ROS 2 Humble is the first ROS distribution that runs on Ubuntu 22.04. As a result, any robots running ROS 1 or +ROS 2 Foxy will have upgrade their operating system. It is highly recommended to back up any important files on the robot +before proceeding, especially for highly customized robots. + +:::caution + +It is the user’s responsibility to ensure that any essential files are properly backed-up before upgrading their robot. + +::: + +### Saving a hard drive image + +As a fail-safe, please make an image of your robot's hard drive. You should always be able to restore this image if you need to revert back to your previous configuration. The easiest approach may be to either connect a removable (USB or similar) hard drive to the robot's computer, or to unplug the robot's hard drive and insert it into a computer or workstation. You can then use a tool such as [CloneZilla](https://clonezilla.org/) or `dd` to write a backup image of your robot's hard drive onto another hard drive. Alternatively, you can simply replace the robot computer's hard drive, reserving the drive and installing a new one to use with Humble. + +### Saving important files + +There are several places in the filesystem you should specifically look for customizations for your robot: + +| **Location** | **Description** | +| :-------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/etc/network/interfaces` or `/etc/netplan/*` | Your robot may have a custom network configuration in this file. | +| `/etc/ros/*/*-core.d/*.launch` | Will contain `base.launch` and `description.launch`, may contain custom launch files for your robot configuration. Replaced by `ros.d` in newer versions. | +| `/etc/ros/*/ros.d/*.launch ` | Will contain `base.launch` and `description.launch`, may contain custom launch files for your robot configuration. Replaces `*-core.d` in newer versions. | +| `/etc/ros/setup.bash` | May contain environment variables for your configuration. | +| `~/catkin_ws/` or `~/colcon_ws/` | ROS workspace that may contain custom ROS packages. | + +Please save the files listed above and use them as a reference during Humble configuration. + +### Backup Software (ROS 1 only) + +Clearpath Robotics provides a package containing several shell scripts to help you back up, upgrade, and/or restore your ROS 1 robot’s important data. You can use these scripts by downloading the `robot-backup` repository by running the following command on your computer: + +``` +git clone https://github.com/clearpathrobotics/robot-backup +``` + +You will need to install dependencies to be able to use these scripts. The instructions for installing dependencies can be found in the `README.md` file of the repository, or run the following command on your computer: + +``` +sudo apt-get install sshpass sudo apt-get install rsync +``` + +#### Running the backup script + +Ensure that the robot is turned on and that you can SSH into it from your computer. Then run the following from your computer: + +``` +cd robot-backup +bash backup.sh +``` + +For example, if your robot’s IP address is 192.168.1.103, you would run something like: + +``` +bash backup.sh melodic-final-backup 192.168.1.103 +``` + +This will produce a backup file called `melodic-final-backup.tar.gz`. Keep this file for when you need to access your backed-up data. + +By default all Clearpath robots use the username `administrator` and the password `clearpath`. The backup.sh script will use these credentials by default, but you can override them easily. + +For example, if your robot’s username and password have been set to `my_robot_username` and `my_robot_password` you should run: + +``` +bash backup.sh melodic-final-backup my_robot_username@192.168.1.103 my_robot_password +``` + +#### Backed up contents + +The backup script will copy the following data: + +- Home Folder: `~/` +- `udev` Rules: `/etc/udev/rules.d` +- Network Setup: - `/etc/network/interfaces` - `/etc/netplan` - `/etc/hostname` - `/etc/hosts` +- IP Tables: `/etc/iptables` +- Bringup Files: - `/etc/ros/setup.bash` - `/etc/ros/$ROSDISTRO/ros.d` - `/usr/sbin/*start` - `/usr/sbin/*stop` +- `rosdep` sources: `/etc/ros/rosdep` +- `rc.local` File: `/etc/rc.local` +- `pip` packages +- `systemd` configuration: `/etc/systemd/system` +- `apt` sources: `/etc/apt/sources.list.d` +- `apt` packages +- User Permission Groups + +#### Backing up non-standard data + +The `backup.sh` script assumes that your robot is in a roughly-standard configuration; it uses a single user account and no files within `/opt/ros/melodic`have been modified. + +If this is not the case, it is the responsibility of the user to ensure that any modified files and files in other users’ home folders is backed up correctly. + +A common example of this might be if you have created customized URDF files to be loaded via environment variables (e.g. `JACKAL_URDF_EXTRAS`) and have stored them outside any of the folders specified above, you must back these up yourself; `backup.sh` will not do this for you. diff --git a/docs/ros/ros.mdx b/docs/ros/ros.mdx index ef380d42c..203ccdfb2 100644 --- a/docs/ros/ros.mdx +++ b/docs/ros/ros.mdx @@ -30,54 +30,49 @@ by Clearpath which are used by all supported Clearpath platforms.
-{" "} - - - - - - -{" "} - - - - - - -{" "} - - - - - - -{" "} - - - - - - - - - - - - - - - - - - - - -{" "} - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103,65 +98,60 @@ sensors that have been validated by Clearpath. -{" "} - - - - - - - -{" "} - - - - - - - -{" "} - - - - - - - -{" "} - - - - - - - -{" "} - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 61c6a7639ad70ae8c761ad12974b0f0f2090e093 Mon Sep 17 00:00:00 2001 From: Luis Camero Date: Fri, 7 Jul 2023 15:30:59 -0400 Subject: [PATCH 5/5] Minor typo fixes --- docs/ros/api/overview.mdx | 6 +++--- docs/ros/config/generators.mdx | 4 ++-- docs/ros/installation/upgrading.mdx | 6 ++++++ docs/ros/networking/computer_setup.mdx | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/ros/api/overview.mdx b/docs/ros/api/overview.mdx index 1c72b3738..6bd30a5ed 100644 --- a/docs/ros/api/overview.mdx +++ b/docs/ros/api/overview.mdx @@ -23,12 +23,12 @@ This may require that the data be sent multiple times. The durability of a QoS profile can be either _Transient Local_ or _Volatile_. _Transient Local_ means that data for published messages will be stored by the publisher even after it has been published. A new subscriber will receive the data even if a lot of time has passed since it was originally published. This durability is typically used for data that only needs to be published once, such as the robot description. The other durability policy is _Volatile_ which does not -stored old messages. The messages are published and only active subscribers will receive the data. New subscribers will have to wait for the next message to be published. +store old messages. The messages are published and only active subscribers will receive the data. New subscribers will have to wait for the next message to be published. Most topics will use a _Volatile_ durability policy. It is important to check for [QoS compatibility](https://docs.ros.org/en/humble/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-compatibilities) when interacting with ROS 2. Mixing of QoS policies when publishing or subscribing to topics can lead to incompatibility. For example, subscribing to a Best Effort publisher with a Reliable subscriber -is not compatible and will result in no data being received on the subscriber. The easiest way to check the QoS profile of a topic is to use the ROS 2 command line interface (CLI). +is not compatible and will result in no data being received on the subscriber. The easiest way to check the QoS profile of a topic is to use the ROS 2 command line interface. ``` ros2 topic info /topic_name -v @@ -87,7 +87,7 @@ which offers system logs. ## Namespacing -Namespacing is the method of adding a prefix to a robot's nodes and topics, to differentiate them from another robot that +Namespacing is the method of adding a prefix to a robot's nodes and topics; this helps differentiate them from another robot that may be on the same network. For example, every robot will have a `cmd_vel` topic for commanding velocity. If both robots used the same topic, then they would both drive when a message is published to that topic. By namespacing, we can remap the topic to `robot1/cmd_vel` and `robot2/cmd_vel` for each respective robot. diff --git a/docs/ros/config/generators.mdx b/docs/ros/config/generators.mdx index 3febedd08..e0c6f4198 100644 --- a/docs/ros/config/generators.mdx +++ b/docs/ros/config/generators.mdx @@ -34,8 +34,8 @@ The launch generator creates ROS 2 [python launch files](https://docs.ros.org/en ### Parameter -The parameter generator creates `.yaml` ROS parameter files that are used by the corresponding launch file. The parameter file will use the default defined -parameter file for the specific node, and allows for users to overwrite any parameters using the robot YAML file. +The parameter generator creates `.yaml` ROS parameter files that are used by the corresponding launch file. Each node has default parameters set that the user can overwrite by setting them in the robot configuration YAML. + ### Setup folder structure diff --git a/docs/ros/installation/upgrading.mdx b/docs/ros/installation/upgrading.mdx index d2ba28df3..ba57b771c 100644 --- a/docs/ros/installation/upgrading.mdx +++ b/docs/ros/installation/upgrading.mdx @@ -12,6 +12,12 @@ Users who are installing ROS 2 Humble onto a new robot computer can skip to [Rob ::: +:::note + +Check the [list of supported platforms](../#supported-platforms) to make sure that your robot is currently supported on ROS 2 Humble. + +::: + ROS 2 Humble is the first ROS distribution that runs on Ubuntu 22.04. As a result, any robots running ROS 1 or ROS 2 Foxy will have upgrade their operating system. It is highly recommended to back up any important files on the robot before proceeding, especially for highly customized robots. diff --git a/docs/ros/networking/computer_setup.mdx b/docs/ros/networking/computer_setup.mdx index 15169aa0b..e6c0c630d 100644 --- a/docs/ros/networking/computer_setup.mdx +++ b/docs/ros/networking/computer_setup.mdx @@ -4,7 +4,7 @@ sidebar_position: 2 --- The `clearpath_computer_setup` package offers a terminal menu tool for configuring a robot computer. The main feature of this tool is the ability to generate -`netplan` configurations. The `clearpath_comptuer_setup` package is available on the [Clearpath package server](../installation/robot.mdx#clearpath-package-server). +`netplan` configurations. The `clearpath_computer_setup` package is available on the [Clearpath package server](../installation/robot.mdx#clearpath-package-server). It should be installed on the robot's computer:
Supports ROS 2 Humble
HuskyA200Yes
JackalJ100Yes
WarthogW100Coming soon
Dingo
DD100No
DO100No
DD150No
DO150No
BoxerB250No
HuskyA200Yes
JackalJ100Yes
WarthogW100Coming soon
Dingo
DD100No
DO100No
DD150No
DO150No
BoxerB250No
RidgebackDriver
Hokuyo UST10-LX2D LidarSource or Debianurg_node
Intel Realsense D435Depth CameraSource or Debianrealsense-ros
MicroStrain 3DM-GX5IMUSource or Debianmicrostrain_intertial
SICK LMS-1112D LidarSource or DebianLMS1xx
Swift Navigation DuroGPSSourceduro_gps_driver
+ Hokuyo UST10-LX + 2D LidarSource or Debian + urg_node +
+ Intel Realsense D435 + Depth CameraSource or Debian + realsense-ros +
+ MicroStrain 3DM-GX5 + IMUSource or Debian + microstrain_intertial +
+ SICK LMS-111 + 2D LidarSource or Debian + LMS1xx +
+ Swift Navigation Duro + GPSSource + duro_gps_driver +
Velodyne PuckSupports ROS 2 Humble
HuskyA200Yes
JackalJ100Yes
WarthogW100Coming soon
Dingo
DD100No
DO100No
DD150No
DO150No
BoxerB250No
HuskyA200Yes
JackalJ100Yes
WarthogW100Coming soon
Dingo
DD100No
DO100No
DD150No
DO150No
BoxerB250No
RidgebackDriver
- Hokuyo UST10-LX - 2D LidarSource or Debian - urg_node -
- Intel Realsense D435 - Depth CameraSource or Debian - realsense-ros -
- MicroStrain 3DM-GX5 - IMUSource or Debian - microstrain_intertial -
- SICK LMS-111 - 2D LidarSource or Debian - LMS1xx -
- Swift Navigation Duro - GPSSource - duro_gps_driver -
+ Hokuyo UST10-LX + 2D LidarSource or Debian + urg_node +
+ Intel Realsense D435 + Depth CameraSource or Debian + realsense-ros +
+ MicroStrain 3DM-GX5 + IMUSource or Debian + microstrain_intertial +
+ SICK LMS-111 + 2D LidarSource or Debian + LMS1xx +
+ Swift Navigation Duro + GPSSource + duro_gps_driver +
Velodyne Puck