diff --git a/.travis.rosinstall.kinetic b/.travis.rosinstall.kinetic index 210f8c3ea8..10f35fb2d8 100644 --- a/.travis.rosinstall.kinetic +++ b/.travis.rosinstall.kinetic @@ -34,3 +34,8 @@ local-name: jsk-ros-pkg/jsk_common uri: https://github.com/jsk-ros-pkg/jsk_common.git version: 2.2.12 +# denso_cobotta_control, denso_cobotta_descriptions, denso_cobotta_driver, and denso_cobotta_gripper are not released +- git: + local-name: DENSORobot/denso_cobotta_ros + uri: https://github.com/DENSORobot/denso_cobotta_ros.git + version: 1a4a74a92c763906c47eec574b5b3dbaa52f622e diff --git a/.travis.rosinstall.melodic b/.travis.rosinstall.melodic index fafffef256..08bade2c35 100644 --- a/.travis.rosinstall.melodic +++ b/.travis.rosinstall.melodic @@ -53,6 +53,11 @@ - git: local-name: UbiquityRobotics/magni_robot uri: https://github.com/UbiquityRobotics/magni_robot +# denso_cobotta_control, denso_cobotta_descriptions, denso_cobotta_driver, and denso_cobotta_gripper are not released +- git: + local-name: DENSORobot/denso_cobotta_ros + uri: https://github.com/DENSORobot/denso_cobotta_ros.git + version: bb60e75adb8477ed3402561b4ec3ba687af3f397 # switchbot_ros is not correctly released. # see: https://github.com/jsk-ros-pkg/jsk_3rdparty/issues/356 - git: diff --git a/.travis.rosinstall.noetic b/.travis.rosinstall.noetic index 28b49e7503..f7932aeab0 100644 --- a/.travis.rosinstall.noetic +++ b/.travis.rosinstall.noetic @@ -1,15 +1,3 @@ -#roseus is not released on melodic -- git: - local-name: euslisp-release - uri: https://github.com/tork-a/euslisp-release - version: release/melodic/euslisp -- git: - local-name: jskeus-release - uri: https://github.com/tork-a/jskeus-release - version: release/melodic/jskeus -- git: - local-name: jsk_roseus - uri: https://github.com/jsk-ros-pkg/jsk_roseus # find_package(collada_urdf) failed due to wrong collada_urdfConfig.cmake # - https://github.com/ros/collada_urdf/issues/43 # - https://github.com/ros/collada_urdf/pull/44 @@ -17,10 +5,6 @@ local-name: collada_urdf uri: https://github.com/werner291/collada_urdf.git version: patch-1 -# compile euscollada for installed collada_urdf -- tar: - local-name: euscollada - uri: https://github.com/tork-a/jsk_model_tools-release/archive/refs/tags/rpm/ros-melodic-euscollada-0.4.3-0_28.tar.gz # jsk_robot_startup LightweightLogger requires mongodb_store # use package.xml format 3 to install python3-pymongo, see https://github.com/strands-project/mongodb_store/pull/269 - git: @@ -66,3 +50,8 @@ - git: local-name: jsk_control uri: https://github.com/jsk-ros-pkg/jsk_control +# denso_cobotta_control, denso_cobotta_descriptions, denso_cobotta_driver, and denso_cobotta_gripper are not released +- git: + local-name: DENSORobot/denso_cobotta_ros + uri: https://github.com/DENSORobot/denso_cobotta_ros.git + version: bb60e75adb8477ed3402561b4ec3ba687af3f397 diff --git a/jsk_denso_robot/README.md b/jsk_denso_robot/README.md index 489bbf566e..3a4655c98d 100644 --- a/jsk_denso_robot/README.md +++ b/jsk_denso_robot/README.md @@ -1,18 +1,22 @@ # jsk_denso_robot -ROS package for Denso b-CAP communication robot. +ROS package for Denso robot. +- Non-OSS type robot using b-CAP communication +- OSS type robot -## How to setup development environment +## Non-OSS type -use `wstool`, `rosdep` and `catkin` to checkout and compile the source tree. +### How to setup development environment + +Use `wstool`, `rosdep` and `catkin` to checkout and compile the source tree. ``` mkdir -p ~/denso_ws/src cd ~/denso_ws/src wstool init -wstool merge https://raw.githubusercontent.com/k-okada/jsk_robot/add_cobotta/jsk_denso_robot/denso.rosinstall +wstool merge https://raw.githubusercontent.com/jsk-ros-pkg/jsk_robot/master/jsk_denso_robot/denso.rosinstall wstool update cd ../ git clone https://github.com/k-okada/cobotta_descriptions.git @@ -23,12 +27,12 @@ catkin build cobottaeus jsk_cobotta_startup -vi source devel/setup.bash ``` -## COBOTTA Setup +### COBOTTA Setup Please refer to [COBOTTA User Manuals](https://www.fa-manuals.denso-wave.com/jp/COBOTTA/007030/) to setup your robot. To install Virtual TP software, please refer to [Software Install](https://www.fa-manuals.denso-wave.com/jp/COBOTTA/007263/) section of the User Manuals. -## Start Virtual IP +### Start Virtual IP To control the robot, you need to start Virtual TP software and push top-left 'Connect' menu. @@ -39,11 +43,11 @@ Then you need to input the IP address of your robot. The default robot IP addres ![](img/vtp-connect.png) -To control the robot, you need to specify user level and password. The default password can be find [COBOTTA User Manuals](https://www.fa-manuals.denso-wave.com/jp/COBOTTA/007030/) +To control the robot, you need to specify user level and password. The default password can be found on [COBOTTA User Manuals](https://www.fa-manuals.denso-wave.com/jp/COBOTTA/007030/). ![](img/vtp-login.png) -You can skip calibration section and also put "Prepare Motion" +You can skip calibration section and also put "Prepare Motion". ![](img/vtp-skip.png) @@ -51,7 +55,7 @@ This is main user interface. You can push 'cancel' button on right-top to back t ![](img/vtp-display.png) -### Setup IP address of the robot +#### Setup IP address of the robot You may want to change IP address of the robot, to connect your network. To do this, please push "Setting" button on the right bottom. @@ -69,12 +73,12 @@ You can set the IP address by using this 10-key like interface. You need to push ![](img/vtp-network3.png) -### Setup IP address of client computer +#### Setup IP address of client computer To work with ROS node. You need to tell IP address of your ROS node running computer to the robot. This is called 'executable' and you need to set 'executable' IP address from Virtual TP software. -Form main panel, push "Setting" button on the right bottom. +From main panel, push "Setting" button on the right bottom. ![](img/vtp-exec2.png) @@ -88,7 +92,7 @@ Select 'Ethernet' tab and change IP address. You can set the IP address by using this 10-key like interface. You need to push 'OK' button of 10-key like panel, and then push 'OK' button of 'Communication Setting' panel. -## Start ROS Node +### Start ROS Node ``` source ~/denso_ws/devel/setup.bash @@ -97,9 +101,9 @@ roslaunch --screen jsk_cobotta_startup cobotta_bringup.launch ip_address:=192.16 Make sure that `ip_address` is set by [Setup IP address of the robot](#setup-ip-address-of-the-robot) and your ROS client node IP address is set by [Setup IP address of client computer](#setup-ip-address-of-client-computer). -## Use EusLisp model +### Use EusLisp model -To control the robot form EusLisp. Please start `roseus` and type as follows. +To control the robot from EusLisp. Please start `roseus` and type as follows. ``` (load "package://cobottaeus/cobotta-interface.l") @@ -128,7 +132,7 @@ You can also use `move-end-rot` method to turn the gripper. ``` -To control real robot. you can use `*ri*` object. +To control real robot, you can use `*ri*` object. ``` (send *ri* :angle-vector (send *cobotta* :angle-vector) 2000) ``` @@ -139,7 +143,7 @@ To obtain current robot pose, use `:state :potentio-vector` method. (send *ri* :state :potentio-vector) ``` -To open and close the gripper. You can use `:start-grasp` and `:stop-grasp`. +To open and close the gripper, you can use `:start-grasp` and `:stop-grasp`. ``` (send *ri* :stop-grasp) (send *ri* :start-grasp) @@ -147,7 +151,7 @@ To open and close the gripper. You can use `:start-grasp` and `:stop-grasp`. `:start-grasp` method returns `t` if it succeeded to grasp object. If it returns `nil`, nothing was grasped. -When the robot detect errors, the LED of the robot become yellow or red. Or you can find warning message like follows. +When the robot detects errors, the LED of the robot becomes yellow or red. Or you can find warning message like follows. ``` [ WARN] [1607683352.232275227]: Call {func_id: 72, vntArgs: ({vt: 3, value: 182} {vt: 3, value: 1} {vt: 8, value: P(210.0,0.0,-60.0,180.0,0.0,80.0,261)} {vt: 8, value: })} -2111814862 -7ddfbcce @@ -164,5 +168,91 @@ If error still occurs, try `:dispose` and `:init` again. (send *ri* :init) ``` +## COBOTTA OSS type + +### Official documents + +- [ROS Wiki](http://wiki.ros.org/denso_cobotta_ros) +- [Web manual](https://densorobot.github.io/docs/denso_cobotta_ros) +- [Driver page](https://www.denso-wave.com/ja/robot/download/application/cobotta_driver_for_linux.html) + +### How to setup development environment on your PC + +If you already setup environment for Non-OSS type, you can reuse it. +Just in case, do `wstool update` and `catkin build cobottaeus jsk_cobotta_startup -vi` again. +Otherwise, do the following: +```bash +mkdir -p ~/denso_ws/src +cd ~/denso_ws/src +wstool init +wstool merge https://raw.githubusercontent.com/jsk-ros-pkg/jsk_robot/master/jsk_denso_robot/denso.rosinstall +wstool update +cd ../ +source /opt/ros/melodic/setup.bash +rosdep install -y -r --from-paths src --ignore-src +catkin build cobottaeus jsk_cobotta_startup -vi +source devel/setup.bash +``` + +### COBOTTA Setup + +#### 1st step: setup Denso default environment + +Basically, refer to the documents in the file downloaded from [Driver page](https://www.denso-wave.com/ja/robot/download/application/cobotta_driver_for_linux.html) to setup your robot. +But please read the following before setup: + +- After installing Ubuntu on the robot, you should install and use the Kernel version supported by COBOTTA. + Supported versions are listed on README in the top directory. + You should install and use the latest version currently supported (hereinafter `XX`, e.g., `5.4.0-58-generic`): + ```bash + sudo apt install linux-image-XX + sudo apt install linux-modules-extra-XX + sudo vi /etc/default/grub # Set GRUB_DEFAULT as "Ubuntu, with Linux XX" + sudo update-grub + # cf. https://askubuntu.com/questions/68547/editing-the-default-boot-item-in-grub-menu-a-definitive-answer + ``` + After this, you should reboot the robot by turn the switch OFF and ON. + +- By default, you should load the driver and change permission of the device file every time rebooting the robot. + If you want the robot to execute them automatically, do the following setting: + ```bash + echo -e '#!/bin/bash\nsudo modprobe denso_cobotta io_power_mode=1\nsudo chown [YOUR LOGIN NAME]:[YOUR LOGIN GROUP] /dev/denso_cobotta' > ~/cobotta_startup.sh + chmod +x ~/cobotta_startup.sh + sudo bash -c "echo -e '@reboot root /home/[YOUR LOGIN NAME]/cobotta_startup.sh\n' > /etc/cron.d/cobotta_startup" + ``` + +#### 2nd step: setup JSK environment + +```bash +source ~/[WORKSPACE YOU CREATED AT 1ST STEP]/devel/setup.bash +mkdir -p ~/jsk_ws/src +cd ~/jsk_ws/src +git clone https://github.com/jsk-ros-pkg/jsk_robot.git +cd ../ +rosdep install -y -r --from-paths src/jsk_robot/jsk_denso_robot --ignore-src +catkin build cobottaeus jsk_cobotta_startup -vi +source devel/setup.bash +``` + +### Start ROS Node + +Run the following inside the robot (via SSH or keyboard): +```bash +roslaunch jsk_cobotta_startup cobotta_oss_bringup.launch +``` + +### Use EusLisp model + +Almost the same as [the instruction of COBOTTA non-OSS type](#use-euslisp-model) except: + +- Model loading should be: + ```lisp + (load "package://cobottaeus/cobotta-oss-interface.l") + (cobotta-oss-init) + ``` +- Warning message while the robot detects errors is mainly displayed on `cobotta_oss_bringup.launch` +- After clearing error (`(send *ri* :clear-error)`), you should call `(send *ri* :motor-on)` to return your robot to normal state +- `(send *ri* :dispose)` is not implemented (we do not think this is needed on OSS type) + --- If you have any question, please feel free to file open at https://github.com/jsk-ros-pkg/jsk_robot/issues diff --git a/jsk_denso_robot/cobottaeus/.gitignore b/jsk_denso_robot/cobottaeus/.gitignore new file mode 100644 index 0000000000..cb63e260f3 --- /dev/null +++ b/jsk_denso_robot/cobottaeus/.gitignore @@ -0,0 +1 @@ +cobotta.l diff --git a/jsk_denso_robot/cobottaeus/CMakeLists.txt b/jsk_denso_robot/cobottaeus/CMakeLists.txt index 586706a04f..e59ae6d705 100644 --- a/jsk_denso_robot/cobottaeus/CMakeLists.txt +++ b/jsk_denso_robot/cobottaeus/CMakeLists.txt @@ -34,7 +34,7 @@ message("cobotta_urdf: ${_cobotta_urdf}") message("collada2eus: ${_collada2eus}") add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/cobotta.urdf - COMMAND xacro ${_cobotta_urdf}/cobotta.urdf.xacro > ${PROJECT_BINARY_DIR}/cobotta.urdf + COMMAND xacro --inorder ${_cobotta_urdf}/cobotta.urdf.xacro > ${PROJECT_BINARY_DIR}/cobotta.urdf DEPENDS ${_cobotta_urdf}/cobotta.urdf.xacro) add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/cobotta.l COMMAND echo "${_collada2eus} ${PROJECT_BINARY_DIR}/cobotta.urdf cobotta.l" diff --git a/jsk_denso_robot/cobottaeus/cobotta-oss-interface.l b/jsk_denso_robot/cobottaeus/cobotta-oss-interface.l new file mode 100644 index 0000000000..463acae0e6 --- /dev/null +++ b/jsk_denso_robot/cobottaeus/cobotta-oss-interface.l @@ -0,0 +1,146 @@ +(require "package://cobottaeus/cobotta-utils.l") +(require "package://pr2eus/robot-interface.l") + +(ros::load-ros-package "denso_cobotta_driver") +(ros::load-ros-package "denso_cobotta_gripper") +(ros::load-ros-package "std_msgs") + +(defclass cobotta-oss-interface + :super robot-interface + :slots (gripper-action)) + +(defmethod cobotta-oss-interface + (:init + (&rest args) + (prog1 + (send-super* :init :robot cobotta-robot :joint-states-topic "/cobotta/joint_states" + :groupname "cobotta_oss_interface" args) + (send self :add-controller :rarm-controller) + (ros::subscribe "/cobotta/gripper_state" std_msgs::Bool + #'send self :cobotta-gripper-state-callback + :groupname groupname) + (setq gripper-action + (instance ros::simple-action-client :init + "/cobotta/gripper_move" + denso_cobotta_gripper::GripperMoveAction + :groupname groupname)) + ;; /cobotta/gripper_action (using control_msgs::GripperCommandAction) also exists, + ;; but it does not have speed input + )) + (:default-controller () (send self :rarm-controller)) + (:rarm-controller () + (list + (list + (cons :controller-action "cobotta/arm_controller/follow_joint_trajectory") + (cons :controller-state "cobotta/arm_controller/state") + (cons :action-type control_msgs::FollowJointTrajectoryAction) + (cons :joint-names (list "joint_1" "joint_2" "joint_3" "joint_4" "joint_5" "joint_6"))))) + (:set-motor-state + (state) + "Set motor power ON/OFF. +When setting motor power OFF, brake becomes Lock. +Details: https://densorobot.github.io/docs/denso_cobotta_ros/command_reference/rosservice.html#motor +" + (let ((srv "/cobotta/set_motor_state") + (req (instance denso_cobotta_driver::SetMotorStateRequest :init :state state))) + (if (ros::wait-for-service srv 0) + (ros::service-call srv req) + nil))) + (:motor-on () + (send self :set-motor-state t)) + (:motor-off () + (send self :set-motor-state nil)) + (:get-motor-state () + (let ((srv "/cobotta/get_motor_state") + (req (instance denso_cobotta_driver::GetMotorStateRequest :init))) + (if (ros::wait-for-service srv 0) + (ros::service-call srv req) + nil))) + (:set-brake-state + (state) + "Set brake Lock/Release. +Releasing brake after setting motor power OFF makes arm joints totally free. +Be careful of speed limit over, moving arm too fast makes brake locked again. +Details: https://densorobot.github.io/docs/denso_cobotta_ros/command_reference/rosservice.html#brake +" + (let ((srv "/cobotta/set_brake_state") + (req (instance denso_cobotta_driver::SetBrakeStateRequest :init :state state))) + (if (ros::wait-for-service srv 0) + (ros::service-call srv req) + nil))) + (:brake-lock () + (send self :set-brake-state (list t t t t t t))) + (:brake-release () + (send self :set-brake-state (list nil nil nil nil nil nil))) + (:get-brake-state () + (let ((srv "/cobotta/get_brake_state") + (req (instance denso_cobotta_driver::GetBrakeStateRequest :init))) + (if (ros::wait-for-service srv 0) + (ros::service-call srv req) + nil))) + (:clear-error () + "Clear all errors except FATAL error. +If your robot is in emergency state, calling :motor-on after :clear-error probably returns your robot to normal state. +Details: https://densorobot.github.io/docs/denso_cobotta_ros/command_reference/rosservice.html#error +" + (let ((srv "/cobotta/clear_error") + (req (instance denso_cobotta_driver::ClearErrorRequest :init))) + (if (ros::wait-for-service srv 0) + (ros::service-call srv req) + nil))) + (:start-grasp + (&rest args &key &allow-other-keys) + (send* self :go-grasp :pos 0 args) + (send self :gripper :state)) + (:stop-grasp + (&rest args &key &allow-other-keys) + (send* self :go-grasp :pos 0.015 args)) + (:go-grasp + (&key (pos 0) (speed 50) (effort 10) (wait t)) + "Move gripper fingers to target `pos` with `speed` and `effort`. +Arguments: +- pos : target distance between each finger and the gripper center (0.0-0.015) [m] +- speed : movement speed (1.0-100.0) [%] +- effort : movement effort (6.0-20.0) [N] +- wait : if this argument is T, this method waits until the movement finishes +Details: https://densorobot.github.io/docs/denso_cobotta_ros/command_reference/rostopic.html#parallel-gripper +" + (when (send self :simulation-modep) + (send robot :joint_gripper :joint-angle (* pos 1000)) ;; m -> mm + (send robot :joint_gripper_mimic :joint-angle (* pos -1000)) + (return-from :go-grasp t)) + (let (goal result) + (setq goal (instance denso_cobotta_gripper::GripperMoveActionGoal :init)) + (send goal :goal :target_position pos) + (send goal :goal :speed speed) + (send goal :goal :effort effort) + (send gripper-action :send-goal goal) + (when wait (send gripper-action :wait-for-result)) + (setq result (send gripper-action :get-result)) + result)) + (:cobotta-gripper-state-callback + (msg) + (send self :set-robot-state1 :gripper-state (send msg :data))) + (:gripper (key) + "Get information about gripper +Arguments: +- key (:state) +Example: (send self :gripper :state) => t (hold something) or nil (not hold anything) +Details: https://github.com/DENSORobot/denso_cobotta_ros/blob/bb60e75adb8477ed3402561b4ec3ba687af3f397/denso_cobotta_lib/src/gripper.cpp#L47 +" + (if (send self :simulation-modep) + (progn + (ros::ros-warn ":gripper is not implemented on simulation mode, always returns t") + t) + ;; for real robot + (send-super :state (intern (format nil "GRIPPER-~A" (string key)) *keyword-package*))))) + +(defun cobotta-oss-init (&optional (create-viewer)) + (unless (boundp '*cobotta*) (cobotta) (send *cobotta* :reset-pose)) + (unless (ros::ok) (ros::roseus "cobotta_oss_eus_interface")) + (unless (boundp '*ri*) (setq *ri* (instance cobotta-oss-interface :init))) + + (ros::spin-once) + (send *ri* :spin-once) + + (when create-viewer (objects (list *cobotta*)))) diff --git a/jsk_denso_robot/cobottaeus/cobotta-utils.l b/jsk_denso_robot/cobottaeus/cobotta-utils.l index 95e5c359f3..2e08f8568a 100644 --- a/jsk_denso_robot/cobottaeus/cobotta-utils.l +++ b/jsk_denso_robot/cobottaeus/cobotta-utils.l @@ -2,4 +2,21 @@ (defmethod cobotta-robot (:arm (&rest args) (send* self :rarm args)) ;; enable to call send *cobotta* :arm :angle-vector + (:start-grasp + (&rest args &key &allow-other-keys) + (send* self :go-grasp :pos 0 args) + t) + (:stop-grasp + (&rest args &key &allow-other-keys) + (send* self :go-grasp :pos 0.015 args)) + (:go-grasp + (&key (pos 0)) + "Move gripper fingers to target `pos`. +Arguments: +- pos : target distance between each finger and the gripper center (0.0-0.015) [m] +Details: https://densorobot.github.io/docs/denso_cobotta_ros/command_reference/rostopic.html#parallel-gripper +" + (send self :joint_gripper :joint-angle (* pos 1000)) ;; m -> mm + (send self :joint_gripper_mimic :joint-angle (* pos -1000)) + t) ) diff --git a/jsk_denso_robot/cobottaeus/package.xml b/jsk_denso_robot/cobottaeus/package.xml index 1f557196d9..91d5490e78 100644 --- a/jsk_denso_robot/cobottaeus/package.xml +++ b/jsk_denso_robot/cobottaeus/package.xml @@ -20,6 +20,9 @@ roseus pr2eus + denso_cobotta_driver + denso_cobotta_gripper + std_msgs diff --git a/jsk_denso_robot/denso.rosinstall b/jsk_denso_robot/denso.rosinstall index 8bd45febe8..79ed400d6a 100644 --- a/jsk_denso_robot/denso.rosinstall +++ b/jsk_denso_robot/denso.rosinstall @@ -1,7 +1,7 @@ - git: local-name: jsk_robot - uri: https://github.com/k-okada/jsk_robot.git - version: add_cobotta + uri: https://github.com/jsk-ros-pkg/jsk_robot.git + version: master - git: local-name: denso_cobotta_ros uri: https://github.com/DENSORobot/denso_cobotta_ros diff --git a/jsk_denso_robot/jsk_cobotta_startup/CMakeLists.txt b/jsk_denso_robot/jsk_cobotta_startup/CMakeLists.txt index cdf89ad659..50ceb95ec7 100644 --- a/jsk_denso_robot/jsk_cobotta_startup/CMakeLists.txt +++ b/jsk_denso_robot/jsk_cobotta_startup/CMakeLists.txt @@ -46,6 +46,11 @@ install(FILES jsk_cobotta.machine if(CATKIN_ENABLE_TESTING) find_package(catkin REQUIRED COMPONENTS roslaunch roslint) file(GLOB LAUNCH_FILES launch/*.launch) + # Avoid testing cobotta_oss_bringup.launch under kinetic because denso_cobotta_ros cannot be built + if("$ENV{ROS_DISTRO}" STRLESS "kinetic") + file(GLOB COBOTTA_OSS_BRINGUP_FULL_PATH launch/cobotta_oss_bringup.launch) + list(REMOVE_ITEM LAUNCH_FILES ${COBOTTA_OSS_BRINGUP_FULL_PATH}) + endif() foreach(LAUNCH_FILE ${LAUNCH_FILES}) roslaunch_add_file_check(${LAUNCH_FILE}) endforeach() diff --git a/jsk_denso_robot/jsk_cobotta_startup/launch/cobotta_oss_bringup.launch b/jsk_denso_robot/jsk_cobotta_startup/launch/cobotta_oss_bringup.launch new file mode 100644 index 0000000000..a56fe9381f --- /dev/null +++ b/jsk_denso_robot/jsk_cobotta_startup/launch/cobotta_oss_bringup.launch @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jsk_denso_robot/jsk_cobotta_startup/package.xml b/jsk_denso_robot/jsk_cobotta_startup/package.xml index 2e6836f426..7d5fe097b3 100644 --- a/jsk_denso_robot/jsk_cobotta_startup/package.xml +++ b/jsk_denso_robot/jsk_cobotta_startup/package.xml @@ -15,6 +15,10 @@ bcap_service denso_robot_control denso_robot_descriptions + denso_cobotta_control + denso_cobotta_descriptions + denso_cobotta_driver + denso_cobotta_gripper cobottaeus robot_state_publisher rviz