diff --git a/bt_sim_node.py b/bt_sim_node.py
index e56a5b6..079c642 100755
--- a/bt_sim_node.py
+++ b/bt_sim_node.py
@@ -3,12 +3,13 @@
import argparse
import actionlib
+import cv_bridge
import numpy as np
import rospy
import franka_gripper.msg
from geometry_msgs.msg import Pose
-from sensor_msgs.msg import JointState
+from sensor_msgs.msg import JointState, Image
import std_srvs.srv
from robot_tools.controllers import CartesianPoseController
@@ -17,23 +18,25 @@ from robot_tools.ros import *
from simulation import BtPandaEnv
CONTROLLER_UPDATE_RATE = 60
-JOINT_STATE_PUBLISHER_RATE = 60
+JOINT_PUBLISH_RATE = 60
+CAM_PUBLISH_RATE = 5
class BtSimNode:
def __init__(self, gui):
self.sim = BtPandaEnv(gui=gui, sleep=False)
self.controller = CartesianPoseController(self.sim.arm)
+ self.cv_bridge = cv_bridge.CvBridge()
self.reset_server = rospy.Service("reset", std_srvs.srv.Trigger, self.reset)
self.move_server = actionlib.SimpleActionServer(
"move",
franka_gripper.msg.MoveAction,
- execute_cb=self.move,
- auto_start=False,
- )
- self.joint_state_pub = rospy.Publisher(
- "joint_states", JointState, queue_size=10
+ self.move,
+ False,
)
+ self.joint_pub = rospy.Publisher("joint_states", JointState, queue_size=10)
+ self.color_pub = rospy.Publisher("/cam/color/image_raw", Image, queue_size=10)
+ self.depth_pub = rospy.Publisher("/cam/depth/image_raw", Image, queue_size=10)
rospy.Subscriber("target", Pose, self.target_pose_cb)
self.step_cnt = 0
self.reset_requested = False
@@ -60,8 +63,10 @@ class BtSimNode:
def handle_updates(self):
if self.step_cnt % int(self.sim.rate / CONTROLLER_UPDATE_RATE) == 0:
self.controller.update()
- if self.step_cnt % int(self.sim.rate / JOINT_STATE_PUBLISHER_RATE) == 0:
+ if self.step_cnt % int(self.sim.rate / JOINT_PUBLISH_RATE) == 0:
self.publish_joint_state()
+ if self.step_cnt % int(self.sim.rate / CAM_PUBLISH_RATE) == 0:
+ self.publish_cam_imgs()
def publish_joint_state(self):
q, dq = self.sim.arm.get_state()
@@ -74,7 +79,14 @@ class BtSimNode:
]
msg.position = np.r_[q, 0.5 * width, 0.5 * width]
msg.velocity = dq
- self.joint_state_pub.publish(msg)
+ self.joint_pub.publish(msg)
+
+ def publish_cam_imgs(self):
+ color, depth = self.sim.camera.update()
+ color_msg = self.cv_bridge.cv2_to_imgmsg(color, encoding="rgb8")
+ self.color_pub.publish(color_msg)
+ depth_msg = self.cv_bridge.cv2_to_imgmsg(depth)
+ self.depth_pub.publish(depth_msg)
def move(self, goal):
self.sim.gripper.move(goal.width)
diff --git a/launch/simulation.launch b/launch/simulation.launch
index 8acd595..058f52a 100644
--- a/launch/simulation.launch
+++ b/launch/simulation.launch
@@ -4,7 +4,7 @@
-
+
diff --git a/simulation.py b/simulation.py
index dea6ba8..71a4bbe 100644
--- a/simulation.py
+++ b/simulation.py
@@ -8,7 +8,8 @@ class BtPandaEnv(BtBaseEnv):
def __init__(self, gui=True, sleep=True):
super().__init__(gui, sleep)
self.arm = BtPandaArm()
- self.gripper = BtPandaGripper()
+ self.gripper = BtPandaGripper(self.arm)
+ self.camera = BtCamera(self.arm, 9, 320, 240, 1.047, 0.1, 1.0)
self.T_W_B = Transform(Rotation.identity(), np.r_[-0.6, 0.0, 0.4])
self.load_table()
self.load_robot()
@@ -29,7 +30,6 @@ class BtPandaEnv(BtBaseEnv):
def load_robot(self):
self.arm.load(self.T_W_B)
- self.gripper.uid = self.arm.uid
def load_objects(self):
p.loadURDF("cube_small.urdf", [-0.2, 0.0, 0.8])